(一)JDBC之事务相关概念
1)概念:事务使指一组最小逻辑操作单元,里面有多个操作组成。组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚。
2)事务ACID特性:
1.原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。原子性是一个最小逻辑操作单元 。
2.一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
3.隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
4.持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。事务与事务之间是隔离的。
(二)JDBC之批处理
批处理:一次性处理大量数据.
批处理相关方法:
void addBatch(String sql) 添加批处理
void clearBatch() 清空批处理
int[]executeBatch() 执行批处理
eg:批量保存信息
// 创建ArrayList集合存储User对象
ArrayList<User> list = new ArrayList<User>();
// 循环插入用户
for (int i = 1; i < 50; i++) {
User user = new User(i + 1, "张三" + i);
list.add(user);
}
// 获取数据库连接对象
Connection connection = JDBCUtil.getConnection();
// 定义sql语句
String sql = "insert into student values(?,?)";
// 获取预编译对象
PreparedStatement statement = connection.prepareStatement(sql);
for (User u : list) {
// 给问号赋值
statement.setInt(1, u.getId());
statement.setString(2, u.getName());
// 调用批处理
statement.addBatch();
}
// 执行批处理
statement.executeBatch();
// 清空批处理
statement.clearBatch();
// 释放资源
JDBCUtil.close(connection, statement);
(三)JDBC第三方连接池
连接池:是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。当一个线程需要用JDBC对数据库进行操作时,它从池中请求一个连接。当这个线程使用完了这个连接,将它返回到连接池中,这样它就可以被想要使用它的线程使用。连接池可以极大的改善用户的JAVA应用程序的性能。
常见的连接池:DBCP 和 C3P0。
1)DBCP(DataBase connection pool):是apache上的一个java连接池项目,也是tomcat使用的一个连接池组件。
使用步骤:
1.导入jar包(commons-dbcp-1.4.jar 和 commons-pool-1.5.6.jar)
2.如下:
// 1.硬编码的方式
/*
* BasicDataSource ds = new BasicDataSource();
*
* ds.setDriverClassName("com.mysql.jdbc.Driver");
* ds.setUrl("jdbc:mysql:///mydb_02"); ds.setUsername("root");
* ds.setPassword("root");
*
* // 获取数据库连接对象
* Connection connection = ds.getConnection();
*
* // 定义sql语句
* String sql = "insert into student values(?,?)";
* // 获取预编译对象
* PreparedStatement statement = connection.prepareStatement(sql);
* statement.setInt(1, 3); statement.setString(2, "李四");
*
* statement.executeUpdate();
*
* // 释放资源
* statement.close();
* connection.close();
* ds.close();
*/
// 2.配置文件的方式
Properties properties = new Properties();
properties.load(new FileInputStream("src/dbcp.properties"));
DataSource ds = BasicDataSourceFactory.createDataSource(properties);
Connection connection = ds.getConnection();
// 定义sql语句
String sql = "insert into student values(?,?)";
// 获取预编译对象
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, 3);
statement.setString(2, "李四");
statement.executeUpdate();
2)C3P0:是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
c3p0和DBCP区别: DBCP没有自动回收空闲连接的功能,c3p0有自动回收空闲连接的功能。
使用步骤:
1.导入jar包(c3p0-0.9.1.2.jar)
2.如下:
// 1.硬编码的形式
/*
* ComboPooledDataSource ds = new ComboPooledDataSource();
*
* ds.setDriverClass("com.mysql.jdbc.Driver");
* ds.setJdbcUrl("jdbc:mysql:///mydb_02"); ds.setUser("root");
* ds.setPassword("root");
*
* // 获取连接对象
* Connection connection = ds.getConnection();
*
* String sql = "insert into student values(4,'王五')";
* PreparedStatement statement = connection.prepareStatement(sql);
*
* statement.executeUpdate();
*
* ds.close();
*/
// 2.配置文件方式
/*
* 要求:
* 1:配置文件的名称:c3p0.properties 或者 c3p0-config.xml
* 2:配置文件的路径:在src下
* */
ComboPooledDataSource ds = new ComboPooledDataSource();
// 获取数据库连接对象
Connection connection = ds.getConnection();
// 获取预编译对象
String sql = "insert into student values(?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, 5);
statement.setString(2, "赵六");
statement.executeUpdate();
3)dbutils:是apache组织的一个工具类,jdbc的框架,更方便我们使用使用步骤:
1.导入jar包(commons-dbutils-1.4.jar)
2.创建一个QueryRunner类
QueryRunner:操作sql语句
构造器:new QueryRunner(Datasource ds);
底层帮助创建连接,创建语句执行者 ,释放资源.
常用方法:query(..):update(..):
3.编写sql
4.执行sql:query(..); update(...);
执行查询后返回的结果集
ResultSetHandler:封装结果集 接口
BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.
ComboPooledDataSource ds = new ComboPooledDataSource();
// 创建QueryRunner对象操作数据库
QueryRunner runner = new QueryRunner(ds);
// String sql = "insert into User values(4,'王五')";
// runner.update(sql);
String sql = "select * from User";
// 查询出所有数据 封装为对象 再把对象装到集合里面去
List<User> list = runner.query(sql, new BeanListHandler<User>(
User.class));
System.out.println(list);