一、JDBC概述
JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API)。
JDBC接口(API)包括两个层次:
面向应用的API:Java API,抽象接口,供程序开发人员使用(连接数据库,执行SQL语句,获得结果)。
面向数据库的API:Java Driver API,供开发商数据库驱动程序用。
JDBC是sun公司提供的一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可。
不同的数据库厂商,需要针对这套接口。提供不同实现。不同的实现的集合,即为不同数据库的驱动。
——面向接口编程
JDBC程序编写步骤:
二、获取数据库连接
条件1、Driver接口
java.sql.Driver 接口是所有JDBC驱动程序需要实现的接口 。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。
在程序中不需要直接取访问实现了Driver 接口的类,而是由程序驱动管理器类(java.sql.DriverManager)去调用这些Driver实现。
mysql的驱动:com.mysql.jdbc.Driver(mysql6.0及以前)
mysql6.0之后改用:com.mysql.cj.jdbc.Driver
条件2、URL
jdbc URL用于标识一个被注册的驱动程序,驱动程序管理器通过这个URL选择正确的驱动程序,从而建立到数据库的连接。
格式(mysql6.0及以前):
mysql6.0以后需要在后面加上时区:
”jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai“
条件3、用户名和密码
1 | public class ConnectionTest { |
三、使用PreparedStatement实现CRUD
操作和访问数据库:
数据库连接被用于向数据库发送命令和SQL语句,并接受数据库服务器返回的结果。其实一个数据库连接就是一个Socket连接。
在java.sql包中有三个接口分别定义了对数据库的不同调用方式:
1、Statement:用于执行静态SQL语句并返回它所生成结果的对象。
2、PreparedStatement:SQL语句被预编译并存储在此对象中,可以用此对象多次高效地执行该语句。
3、CallableStatement:用于执行SQL存储过程。
Statement的弊端:存在拼串操作,并且存在SQL注入问题
PreparedStatement:是Statement的子接口;能最大可能提高性能;操作Blob类型数据;可以防止sql注入
增删改操作
1 | // 增加记录 |
1、可将增加、删除、修改、查询中的共同操作(1.获取连接,2.释放资源)封装成一个工具类:
1 | public class JDBCUtils { |
2、进一步可将增加、删除、修改中的共同操作(1.获取连接,2.预编译sql,3.填充sql,4.执行操作,5.关闭资源)封装到一个方法中。
1 | // 将增删改操作写成一个通用的方法 |
查询操作
Java与SQL对应数据类型转换表:
1 | public void testQuery1() { |
针对Customer表创建通用的查询方法:
1 | public Customer queryCustomers(String sql, Object... args) throws Exception { |
针对Order表创建通用的查询方法:
1 | public class OrderQuery { |
通用的查询方法(针对所有的 表):
1 | public class Query { |
四、操作BLOB类型字段
TinyBlob:255字节
Blob:65K
MediumBlob:16M
LongBlob:4G
1 | // 向Customers表中添加一条Blob类型数据 |
五、数据库事务
事务:一组逻辑操作单元,使数据由一种状态变换到另一种状态。
事务处理:要么所有的事务都被提交(commit),那么这些修改就被永久的保存下来;要么放弃所作的全部修改,整个事务回滚(rollback)到最初的状态。
JDBC事务处理:
1.数据一旦提交,就不可回滚。
2.DDL操作一旦执行,都会自动提交。
DML默认情况下,一旦执行,就会提交。可通过set autocommit=false 取消DML操作的自动提交。
3.默认关闭连接的时候,自动提交。
JDBC程序中为了让多个SQL 语句作为一个事务执行:
调用Connection 对象的setAutoCommit(false); 以取消自动提交事务
在所有的SQL 语句都成功执行后,调用commit(); 方法提交事务
在出现异常时,调用rollback(); 方法回滚事务
若此时Connection 没有被关闭,还可能被重复使用,则需要恢复其自动提交状setAutoCommit(true)。尤其是在使用数据库连接池技术时,执行close()方法前,建议恢复自动提交状态。
事务的ACID属性:
1.原子性(Atomicity):事务是一个不可分割的工作单位,事务的操作要么都发生,要么都不发生。
2.一致性(Consistency):事务必须使数据库从一个一致状态变换到另外一致状态。
3.隔离性(Isolation):一个事务的执行不能被其他事务干扰。
4.持久性(Durability):一个数据一旦被提交,它对数据库的改变就是永久性的。
数据库并发问题:
脏读:对于两个事务T1、T2,T1读取了已经被T2更新但还没被提交的数据。之后,若T2回滚,T1读取的数据就是无效的。
不可重复读:对于两个事务T1、T2,T1读取了一个字段,然后T2更新了该字段。之后,T1再次读取同一个字段,值就不同了。
幻读:对于两个事务T1、T2,T1从一个表中读了一个字段,然后T2再该表中插入了一些新的行。之后,如果如果T1再次读取同一个表,就会多出几行。
四种隔离级别:隔离级别越高,一致性越好,并发性越弱。
六、DAO及相关实现类
DAO:Data Access Object访问数据信息的类和接口,包括了对数据CRUD(Create、Retrival、Update、Delete),而不包含任何业务相关的信息。
有时也称作:BaseDAO(封装通用方法)
作用:为了实现功能的模块化,更有利于代码的维护和升级。
七、数据库连接池
数据库连接池基本思想:为数据库连接建立一个“缓冲池”,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕后再放回去。
JDBC的数据库连接池使用javax.sql.DataSource 来表示,DataSource只是一个接口,该接口通常由服务器(Weblogic,WebSphere,Tomcat)提供实现,也有一些开源组织提供实现。
Druid数据库连接池
1 |
|
配置属性:
八、Apache-DBUtils实现CRUD操作
commons-dbutils 是Apache 组织提供的一个开源JDBC工具类库,封装了增删改查操作。
1 | public class QueryRunnerTest { |