JDBC入门

1.介绍

JDBC是Java DataBase Connectivity的缩写,中文意思是Java数据库连接,是Java中用来规范客户端程序如何来访问数据库的应用程序接口。

avatar

本文使用mysql数据库,所以需要下载mysql驱动,本文用的是mysql-connector-java-5.1.48.jar

2.JDBC常用的接口

1.Driver接口,用来驱动不同的数据库,连接数据库前必须先装载驱动,方法如下:

Class.forName("com.mysql.jdbc.Driver"); //装载MySQL驱动
Class.forName("oracle.jdbc.driver.OracleDriver"); //装载Oracle驱动

2.Connection接口,表示与特定数据库的连接会话

Connection conn = DriverManager.getConnection("jdbc:mysql://host:port:/database","user","password"); //连接MySQL数据库
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password"); //连接Oracle数据库

它有如下方法:

  • Statement createStatement() 创建向数据库发送sql的statement对象
  • PreparedStatement prepareStatement(String sql) 创建向数据库发送sql预编译的 statement对象
  • setAutoCommit(boolean autoCommit) 设置实务是否自动提交
  • commit() 在此连接上提交实务
  • rollback() 在此连接上回滚实务

3.Statement接口,用于执行sql语句并返回结果集

  • Statement 用于执行简单sql
  • PreparedStatement 用于执行sql预处理,语句中的?号将被setString(int index,String value)
    替换为值,可以有效的防止sql注入,建议使用,它继承自Statement接口

它有如下方法:

  • boolean execute(String sql) 执行sql,返回是否有结果集
  • ResultSet executeQuery(String sql) 执行select语句,返回ResultSet结果集对象
  • int executeUpdate(String sql) 执行insert/delete/update 语句,返回更新的行数
  • addBatch(String sql) 把多条sql语句放到一个批处理中
  • executeBatch() 批量执行sql

4.ResultSet接口,它是执行sql查询语句的结果集对象,它有如下方法
检索不同字段:

  • getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
  • getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。
  • getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
  • getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
  • getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。

结果集滚动:

  • next()移动指针到下一行,注意默认的指针没有指向数据,next第一次调用指向第一行
  • previous() 移动指针到上一行
  • absolute(int row) 移动到指定行
  • beforeFirst() 移动到最前面
  • afterLast() 移动到最后面

3.编写JDBC

根据使用编辑器的不同,首先需要导入数据库驱动jar包,以MySQL数据库和IDEA编辑器为例:
导包步骤: 点击IDEA当前项目左上角File—>Project Structur—>Modules—>点击右边+号—>Jars Or directories

1.加载驱动

try {
    Class.forName("com.mysql.jdbc.Driver");
} catch(ClassNotFoundException e) {
    e.printStackTrace();
}

2.创建数据库连接

Connection conn = null;
try {
    conn = Driver.getConnection("jdbc:mysql://localhost:3306/mydb?charaterEncoding=UTF-8","root","root");
} catch(SQLException e) {
    e.printStackTrace();
}

3.创建Statement对象并发起查询

Statement st = null;
try {
    st = conn.createStatement();
    String sql = "select * from user_profile where id = 1";
    ResultSet rs = st.executeQuery(sql); 
}catch(SQLException e) {
    e.printStackTrance();
}

直接使用Statement对象执行sql会有注入的风险,建议PreperedStatement

PreparedStatement ps = null;
try {
    String sql = "select * from user_profile where id = ?"; //注意?号会被替换
    ps = conn.preparedStatement(sql);
    ps.setString(1,1); //注意setString(int index,String value) index下标是从1开始
    ResultSet rs = ps.executeQuery();
} catch(SQLException e) {
    e.printStackTrance();
}

4.处理ResultSet对象结果集

while(rs.next()) {
    int id = rs.getInt(1);//使用索引
    String username = rs.getString("name"); //使用字段名
    String age = rs.getString("age");
    System.out.println("user name is:" + username + "age is " + age);
}

5.关闭连接

finlay {
    if (conn != null) {
        try {
            conn.close();
        }catch(SQLException e) {
            e.printStackTrance();
        }
    }
    
    if(ps !=null) {
        try {
            ps.close();
        } catch(SQLException e) {
            e.printStackTrance();
        }
    }
    if(rs !=null) {
        try {
            rs.close();
        } catch(SQLException e) {
            e.printStackTrance();
        }
    }
}

完整例子

package com.mike.jdbc.eg;

import java.mysql.Connection;
import java.mysql.PerparedStatement;
import java.mysql.ResultSet;

@author mike
@date 2020-12-05
@desc jdbc操作数据库
public class JdbcDemo {
    public static void mian(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //导入数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            //创建数据库连接
            conn = DriverManager(
                "jdbc:mysql://localhost:3306/mydb?character=UTF-8", //数据库DSN
                "root", //用户名
                "root"//密码
            );
            //查询
            String sql = "select * from user_profile where id = ?";
            ps = conn.perparedStatement(sql);
            ps.setString(1,"1");//id替换为1
            rs = ps.executeQuery();
            // insert查询,update更新,delete删除 使用ps.executeUpdate()方法即可
            //处理结果集
            while(rs.next()) {
                int id = rs.getInt(1);//获取数据为整形结果
                String username = rs.getString("name");
                String age = rs.getString("age");
                System.out.println("username is: " + username + "age is:" + age);
            }
        } catch(ClassNotFoundException e) {
            e.printStackTrance();
        } catch(SQLException e) {
            e.printStackTrance();
        } finally { //关闭连接
            if (conn != null) {
                try {
                    conn.close();
                } catch(SQLException e) {
                    e.printStackTrance();
                }
            }

            if (ps != null) {
                try {
                    ps.close();
                } catch(SQLException e) {
                    e.printStackTrance();
                }
            }

            if (rs != null) {
                try {
                    rs.close();
                } catch(SQLException e) {
                    e.printStackTrance();
                }
            }

        }
       
    }
}
原文地址:https://www.cnblogs.com/gy1010/p/14091477.html