数据库(四)2018-08-27
2018-08-29 本文已影响0人
迷人的酋长
1. JDBC操作事务
Connection接口:
public void setAutoCommit(boolean autoCommit); //设置是否开启事务的自动提交功能
public void commit(); //提交事务
public void rollback(); //事务回滚
public void setTransactionIsolation(int level); //设置事务的隔离级别.
/*
四大权限修饰符对应的数字分别是: 1,2,4,8
Connection接口额外定义了一个常量: NONE(表示不支持事务): 值是0
*/
案例: 模拟转账
步骤:
try{
//关闭事务的自动提交功能
账户1 - 1000
账户2 + 1000
//提交事务
//开启事务的自动提交功能
}catch(Exception e) {
//事务回滚
e.printStackTrace();
}finally{
}
2. JDBC进行批处理
Statement接口:
public void addBatch(String sql); //添加批处理
public int[] executeBatch(); //执行批处理, 返回值是各个SQL语句的结果集的组合.
public void clearBatch(); //清空批处理.
记忆:
批处理操作是针对于: 更新语句的. 针对于查询语句无效.
executeBatch()底层其实依赖的是(调用的是): executeUpdate(String sql);
3. DBCP的简介:
概述: DataBase Connection Pool, 数据库连接池.
实际开发中, 我们需要频繁操作数据库, 这就意味着我们要创建大量的连接对象, 而我们目前用的连接对象是用完就释放, 系统频繁创建大量生命周期短的连接对象是非常消耗资源的. 针对这种情况, 我们可以创建一个池子出来, 里边放一些连接对象, 用的时候从里边拿, 用完之后再放回去. 这个池子就是: 数据库连接池.
这样做的好处是: 节约资源, 提高效率.
作用:
主要是用来优化"获取连接对象和销毁连接对象"这步动作的,
将连接对象从销毁变为自动归还.
这样做的好处是: 节约资源, 提高效率.
分类:
@.采用第三方的 jar包(用别人做好的 数据库连接池) //Spring
1.....DBCP: 属于Apache公司的, 不会自动回收空闲连接.
2.....C3P0: 属于Apache公司的, 会自动回收空闲连接.
目前JavaWeb的三大核心框架(SSH)的底层涉及到的数据库的部分 用到的就是C3P0.
3.....Druid: 属于阿里巴巴的. 采用"分布式事务的思路"实现的.
@自定义数据库连接池:
案例:
使用C3P0数据库连接池操作数据:
版本1: 手动设置参数.
版本2: 结合配置文件使用.
版本3: 抽取工具类.
使用Druid数据库连接池操作数据:
版本1: 手动设置参数.
版本2: 结合配置文件使用.
版本3: 抽取工具类.
-
DBCP的原理
数据库连接池的原理.png
- Druid数据库连接池的使用
// 所有的数据库连接池的根接口都是: DataSource
版本1: 手动设置参数.
版本2: 结合配置文件使用.
版本3: 抽取工具类.
- C3P0数据库连接池的使用
// 所有的数据库连接池的根接口都是: DataSource
版本1: 手动设置参数.
版本2: 结合配置文件使用.
版本3: 抽取工具类.
7. DBUtils简介:
概述: 用来优化"JDBC核心操作步骤的", 将其从7步操作变为3步操作.
步骤:
1) 创建数据库连接池对象.
2) 创建可以执行SQL语句的对象(QueryRunner).
//将其(数据库连接池对象)作为参数传入QueryRunner类的构造方法, 创建QueryRunner类的对象.
3) 执行SQL语句, 获取结果集.
4) 操作结果集.
QueryRunner类:
//可以用来执行SQL语句.
构造方法:
public QueryRunner();
public QueryRunner(DataSource ds);
成员方法:
int update(String sql,Object... obj); //执行更新语句.
*** query(String sql,ResultSetHandler rsh,Object... obj); //执行查询语句.
//ResultSetHandler是一个接口, 表示对结果集的处理方式.
//传入的子类不同, 结果集的类型也不同.
//记忆: 可变参数的底层其实是一个: 数组.
ResultSetHandler接口的子类:
ArrayHandler 将结果集第一行转成对象数组 Object[]
ArrayListHandler List<Object[]>
将结果集中的每一行数据都转成一个对象数组,再将转成的多个对象数组存放到List中
BeanHandler 将结果集第一行数据封装到一个对应的业务类实例中
// new BeanHandler<业务类的类型>(业务类的字节码文件对象);
// new BeanHandler<Ledger>(Ledger.class);
BeanListHandler
将结果集中的每一行数据都封装到一个对应的业务类实例中,再将多个业务类实例对象存放到List里。
// new BeanListHandler<业务类的类型>(业务类的字节码文件对象);
// new BeanListHandler<Ledger>(Ledger.class);
MapHandler 将结果集中的第一行数据封装到一个Map中,key是列名 String ,value是对应的值 Object
MapListHandler 将结果集中的每一行数据都封装到一个Map里,然后再将多个Map存放到List
ColumnListHandler 将结果集中的指定列的数据存储到List集合
//new ColumnListHandler<该列的类型_写的是引用类型>(列名);
//new ColumnListHandler<Double>("money");
ScalarHandler 进行单值查询,如:select count(*) from //一行一列
//new ScalarHandler<该列的类型_写的是引用类型>(列名);
//new ScalarHandler<Long>("counts"); 求满足条件的数据共有多少行
KeyedHandler 将结果集中的每一行数据都封装为一个Map(Map<String,Object>),
再将这些Map再存到一个Map里,其key为KeyedHandler指定的列,
如果没有指定则使用第一个查询的字段。
/*
1 2 3 4
Map <String,Map<String,Object>> map= qr.query(conn, sql, new KeyedHandler<String>("lid"));
1:代表的是 传入的指定的列名(要求不能重复,一般传的是主键)
2:代表的是 数据库表中的每一行数据(列名做键,具体的数据做值)
3:代表的是 传入的指定的列的 数据类型
4:代表的是 传入的指定的列
*/