1、JDBC简介
-
JDBC(Java DataBase Connectivity :Java语言连接数据库)是套JAVA语言提供的(JDK自带)一套使用JAVA语言访问和处理存储在数据库中数据的API(类库:Application Programming Interfaces 应用程序编程接口 )。
-
JDBC的核心API在
java.sql
包和javax.sql
包。 -
JDBC体系组成:
-
标准: java.sql包 和 javax.sql.包
-
实现: 各个厂商提供的 驱动
-
2、JDBC的本质
JDBC是SUN公司制定的一套接口(interface) java.sql.*; (这个软件包下有很多接口)
接口都有调用者和实现者。 面向接口调用、面向接口写实现类,这都属于面向接口编程。
为什么要面向接口编程? 解耦合:降低程序的耦合度,提高程序的扩展力。 多态机制就是非常典型的:面向抽象编程。(不要面向具体编程)
为什么SUN制定一套JDBC接口呢? 因为每一个数据库的底层实现原理都不一样。 Oracle数据库有自己的原理。 MySQL数据库也有自己的原理。 MS SqlServer数据库也有自己的原理。 .... 每一个数据库产品都有自己独特的实现原理。
JDBC的本质到底是什么? 一套接口。
3、三方责任
-
JAVA(SUN公司)官方:
-
制定一套JAVA语言连接数据库的标准(接口集),即:java.sql包+javax.sql包
-
-
数据库厂商
-
负责编写JDBC接口的实现类
-
这些对JDBC接口的实现都是以jar包的形式存在的,【驱动包 mysql-connector-java-8.0.24.jar】
-
驱动不是Java官方提供的,而是各大数据库厂商提供的,下载驱动需要去数据库官网下载
-
真正干活的
-
-
我们Java程序员(开发人员)
-
学习标准
-
使用驱动
-
4、JDBC编程六步
第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭通道。)
第三步:获取数据库操作对象(专门执行sql语句的对象)
第四步:执行SQL语句(DQL DML....)
第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。)
第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。)
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/exec?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&useServerPrepStmts=false&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true ";
String user = "root";
String pwd = "123456";
Connection con = DriverManager.getConnection(url, user, pwd);
//3.创建执行SQL的Statement执行器
Statement sta = con.createStatement();
//4.执行SQL
ResultSet rs = sta.executeQuery("select * from student");
//5.处理结果集
while (rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
String birth = rs.getString("birth");
String age = rs.getString("age");
String phone = rs.getString("phone");
System.out.println(id+"'\t"+name+"\t"+age+"\t"+email+"\t"+birth+"\t"+phone);
}
//6.关闭资源
rs.close();
sta.close();
con.close();
5、核心API
1.java.sql.Driver
2.java.sql.DriverManager
-
驱动管理器:管理驱动和对外提供数据库连接
-
获取连接的方法:
-
管理驱动的方法:
3.java.sql.Connection
-
和数据库的连接
-
可以 使用Connection对象来创建SQL语句的执行器
4.java.sql.Statement/PreparedStatement
-
代表SQL执行器:运行SQL(普通的Statement/预编译的Statement/CallableStatement)
-
执行的方法:
-
execute
-
executeUpdate
-
executeQuery()
-
executeBatch()
-
5.java.sql.ResultSet
-
从 数据库返回的结果集
6、JDBC流程细节
1.注册驱动
-
Class.forName("包名+类名")
-
Class是一个描述类的类,其中静态方法forName,作用是加载指定名字的类。
-
当类加载时,静态代码会执行。在静态代码块中把驱动对象注册到DriverManager中。
-
而DriverManager中的registerDriver就是把驱动对象放到内部的一个 集合中
-
-
DriverManager.getConnection
-
每一次getConnection,都是从集合中遍历查找合适的驱动对象,执行
connect
方法 -
getConnection(url,Properties)
-
getConnection(url,user,password)
-
Properties类是来自java.util包的一个常见读取/存放JAVAbean配置信息的类,一般读取:key=value格式的java配置文件。
-
两种加载资源的方式:
-
-
connection.createStatement()/connection.prepareStatement(sql)
-
创建执行SQL的Statement执行器
-
-
执行SQL
-
execute()
-
可以执行任意的SQL
-
返回值是boolean类型,以执行的SQL语句是否返回ResultSet为标准,如果返回结果集则为true,否则我false
-
-
executeUpdate()
-
执行DDL:返回0
-
执行DML:返回数据库受影响行数
-
DQL:不能执行DQL(select)
-
-
executeQuery()
-
只能执行DQL
-
-
executeBatch()
-
addBatch():把命令添加到批处理的命令队列中
-
executeBatch():执行批处理命令队列
-
-
-
处理结果集
-
ResultSet表示结果集,一般在执行SQL查询语句生成
-
ResultSet有一个指向当前行的光标,光标一开始是指向结果的第一个元素的上方,所以需要执行next()方法将光标下移。
-
如果没有使用next方法
-
默认情况下结果集只能遍历一遍,指针移动到了最后,如果继续尝试获取数据
-
从结果集中获取数据,可以根据列名或者列的下标获取(列名或者列的下标要和执行的SQL语句保持一致)
-
7、PreparedStatement 和Statement的区别
-
Statement: 执行静态SQL的对象,即没有参数的SQL
-
PreparedStatement可以执行带有参数的SQL,支持?占位符
-
在开发中,一般推荐使用PreparedStatement, 两个好处:
-
防止SQL注入
-
支持预编译,执行效率高于Statement
-
-
有些情况下不能使用?占位符
-
表名的位置是参数,不能使用?占位符 (select * from ?=>select * from 'student')
-
模糊查询like中不能使用?占位符 (select * from xxx where name like '%?%')
-
order by 排序时,后面的排序字段不能使用?,会导致排序无作用
-
8、获取数据库在的主键
-
默认在使用JDBC执行添加时,不会自动返回 主键值 ,需要使用开发开启
-
在Statement接口中,定义了两个常量分别代表 是否 启动自动生成的 主键
-
当需要返回自动增长的主键时,可以开发开关。
9、JDBC控制事务
JDBC中的事务的提交模式默认是自动提交 ,即,当执行完一条SQL,立刻 提交。
如果需要开启事务,即多条语句一块执行 ,需要首先关闭自动提交:Connection.setAutoCommit(false)
sql1,sql2...sqln
提交事务:Connection.commit()
回滚事务:Connection.rollback()
10、元数据 MetaData Class
-
获取元数据对象 getMetaData();
-
JDBC中通过了两个元数据接口用来获取关于数据的数据:
-
DatabaseMetaData: 用来获取关于数据库本身的信息
-
ResultSetMetaData:用来获取结果集中列的信息。MyBatis、Hibernate、Spring
-