JDBC

94 阅读4分钟

JDBC是什么

在web开发中不可避免的要使用数据库来记录数据。为了在java语言中提供访问数据库的支持,Sun公司提供了一套访问数据的标准Java类库,即JDBC。

JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作。

JDBC提供了统一的接口来连接不同的数据库,开发者只需要编写java程序,具体的转换由jdbc来实现。

JDBC的连接步骤

1、加载数据库驱动

2、获取数据库的连接

3、获取用于执行sql命令的执行对象

4、执行

5、处理结果

6、回收资源

1、加载注册驱动(JDBC驱动)

//JDBC驱动是不同的数据库厂商根据JDBC标准来实现提供的
//根据版本的不同驱动所在的位置也有所不同
//指定使用哪个驱动类
//数据库驱动包是8.0版本
Class.forName("com.mysql.cj.jdbc.Driver");
//数据库驱动包是5.0版本
Class.forName("com.mysql.jdbc.Driver");

2、获取与数据库的连接

//参数:url,user,pass 连接数据的链接,用户名,密码
Connection connection = DriverManager
    .getConnection(
            "jdbc:mysql://127.0.0.1:3306/mydb?serverTimezone=UTC",
            "root",
            "123456");

url的详细格式: "jdbc(这是协议以jdbc开头):mysql(这是子协议,数据库管理系统称)://localhost(数据库来源地址):3306(目标端口)/test(要查询的表)?(其他配置)"

DriverManager:设备管理器,用于对JDBC进行注册和管理。
Connection:jdbc与数据库的网络通信对象。 java.sql.Connection是一个接口,由厂商来具体实现。数据库操作的基础都在connection上

3、获取用于执行sql命令的执行对象:statement。一般用于执行静态sql语句。动态传入的参数时,使用Statement会有sql注入的风险,而PreparedStatement有预处理sql语句的功能可以避免sql注入的风险。

//获取statement对象的三种方法
//Connection接口下的方法:Statement createStatement()
Statement stmt=conn.createStatement();
//preparedStatement创建时一定要传入sql语句
PreparedStatement pstmt = conn.PreparedStatement() ;

CallableStatement cstmt =  conn.prepareCall("{CALL demoSp(? , ?)}") ;

prepareStatement的使用

PreperedStatement st = null;
String sql = "select * from users where name=? and password=?";
 
//3.获取用于向数据库发送sql语句的Preperedstatement
st = conn.preparedStatement(sql);//在此次传入,进行预编译
//值注入,根据参数定位到哪个“?”,从1开始计算。
st.setString(1, username);
st.setString(2, password);
//4.向数据库发sql
st.executeQuery();//在这里不需要传入sql

image.png

4、执行sql语句

//对于Statement
boolean b = stat.execute("insert into user(username,password,phone) " +
        "values('coco','123456','12345678910')");
int i = stat.executeUpdate("insert into user(username,password,phone) " +
        "values('coco','123456','12345678910')");
ResultSet rs = stat.executeQuery("select * from user");
//对于PreparedStatement
String sql="select * from user where id=?";
String sql1="delete from user where id=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,1);
boolean b1 = ps.execute();
//执行sql1时使用
int i1 = ps.executeUpdate();
//执行sql时使用
ResultSet rs1 = ps.executeQuery();

Statement中有execute()的方法,返回值是boolean类型,true表示执行查询操作,false表示执行更新操作(增删改)

executeUpdate()方法是执行更新操作(增删改),返回值是受影响的行数

executeQuery()方法是执行查询操作,返回值是一个结果集ResultSet

PreparedStatement和Statement方法一样(注意:PreparedStatement继承Statement)只不过在执行之前要为sql语句中的“?”赋值。

image.png

image.png

image.png

5、结果处理。根据执行返回的结果进行相应的处理。主要是对于结果集的处理,ResultSet 中有next()方法,它相当于一个游标,它的指向是下一条数据,返回值是boolean类型,能判断有没有一条数据,而ResultSet 中的getXxx是用来获取每一条数据中的具体内容比如:username、password等

//处理execute()的结果
if(!b){
    System.out.println("添加成功");
}
//处理executeUpdate()的结果
if(i==1){
    System.out.println("添加成功");
}
//处理executeQuery()的结果:只有一条数据
if(rs1.next()){
    int id = rs.getInt("id");
    String username = rs.getString("username");
    String password = rs.getString("password");
    String phone = rs.getString("phone");
    System.out.println(id+"/"+username+"/"+password+"/"+phone);
}
//处理executeQuery()的结果:多条数据
while(rs1.next()){
    int id = rs.getInt("id");
    String username = rs.getString("username");
    String password = rs.getString("password");
    String phone = rs.getString("phone");
    System.out.println(id+"/"+username+"/"+password+"/"+phone);
}

6、回收资源:如果有结果集才能关闭结果集ResultSet,没有就不用写这一句。关闭资源类似递归和栈,就是开启顺序和关闭顺序相反。关闭资源时最好用try..finally...语句用try..catch....finally...语句。

//关闭结果集ResultSet
rs.close();
//关闭Statement
stat.close();
//关闭连接Connection
conn.close();

JDBC事务模式

有两种实现事务的方法,自动提交和手动提交 自动提交是默认的。由

connection.setAutoCommit(true);

来实现。自动提交无法保证数据的一致性。

手动提交:显式地使用commit和rollback方法管理事务。手动提交可以保证数据一致性,但要手动实现。

批处理

对statement对象使用addbatch()方法将要执行的语句放入批处理任务中,再在最后使用executeBatch执行批处理的任务。

使用批处理可以提升一次性插入大量数据的速度。