本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、概述
- JDBC:Java DataBase Connectivity,是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一的访问。
- JDBC本身是Java连接数据的一个标准,是进行数据库连接的抽象层,由Java编写的一组类和接口组成,接口的实现由数据厂商完成。
二、基本操作
JDBC 的基本操作可以分为五个步骤:(简单五个字:贾琏欲执事)
- 加载驱动
Class.forName();- 当驱动类被加载到内存时,会自动进行注册驱动
- 获取连接对象
DriverManager.getConnection(url, username, password);- url:当使用本地数据库并且端口号为3306时,可以省略localhost:3306
- 获取预编译语句对象
preparedStatement(sql);
- 执行SQL语句
executeUpdate()executeQuery()
- 释放资源
close()
@Test
public void test() throws Exception {
String sql = "INSERT INTO student(name, email, age) VALUES('xiaoyi', 'xiaoyi@', 20)";
// 1 加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2 获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo", "root", "admin");
// 3 获取语句对象
Statement st = conn.createStatement();
// 4 执⾏语句
st.executeUpdate(sql);
// 5 释放资源
st.close();
conn.close();
}
三、事务
-
事务(transaction,简写tx):事务是一组完整的逻辑单元,由多条DML语句组成,这些语句要么同时成功,要么同时失败。比如张三向李四转账100元,那么要从张三账户减少100,从李四账户增加100,这两个步骤只能同时成功或同时失败。
-
事务的属性(ACID)
- 原子性:事务是一个独立的工作单元,是不可分割的
- 一致性:在同一个事务中,所有操作必须同时成功,或者同时失败,必须保证事务的一致性
- 隔离性:一个事务的执行不会被其它事务干扰,事务之间是相互隔离的
- 持久性:一个事务一旦提交,对该数据库的操作就会被持久地保存到数据库中,即使发生故障也不会丢失这些操作
-
使用事务的步骤
- 开启事务:将自动提交事务改为手动提交
- 对数据库进行DML操作
- 若没有问题则提交事务(commit)
- 否则,进行回滚(rollback),数据库管理系统将放弃开启事务之后的所有操作
- rollback()不仅是回滚,也是释放连接上的锁
-
注意事项
- 默认情况下,事务在DML操作之后是自动提交的,因此,使用事务时,需改为手动提交(setAutoCommit())
- 虽然查询操作不需要事务,但一般都将查询操作写在事务当中
- 代码正确,没有异常,数据库数据不变,可能是因为没有提交事务
- 在MySQL中,只有InnoDB存储引擎支持事务和外键,MyISAM都不支持
-
模板
try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo", "root", "admin"); // 将事务的提交机制设置为手动提交 conn.setAutoCommit(false); // 操作... // 手动提交事务 conn.commit(); } cathc (Exception e) { // 回滚事务 conn.rollback(); }
四、连接池
-
采用之前的获取连接方式,每一次连接都需要进行一些验证,并且用完之后就直接 close 了,这不仅耗费很多时间,也造成了资源浪费,因此就出现了连接池,连接池能够充分地利用连接对象
-
连接池的属性
属性 说明 driverClassName 数据库驱动名称 url 连接数据库的url username 连接数据库的用户名 password 连接数据库的密码 initialSize 初始化连接池连接对象个数 maxActive 最大连接池个数(8) -
在Java中,连接池使用 javax.sql.DataSource 接口表示,由数据库厂商进行实现
-
常见连接池
- DBCP
- Druid
-
Druid连接池使用步骤
- 创建连接池对象
- 设置连接池连接数据库的属性
- 初始化创建连接个数
- 获取连接
@Test
public void test() throws Exception {
// 1.创建⼀个连接池对象
DruidDataSource ds = new DruidDataSource();
// 2.设置链接数据库的四个属性
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/jdbcdemo");
ds.setUsername("root");
ds.setPassword("admin");
// 3.初始化创建连接的个数
ds.setInitialSize(5);
// 4.从连接池中获取⼀个链接对象
Connection conn = ds.getConnection();
}