Day29 JavaWeb知识 (6)事务 & 数据库连接池 & DBUtils
2019-06-08 22:00
453 查看
(一).事务
一.概述
- Transaction 其实指的是一组操作,里面包含许多个单一的逻辑,只要有一个逻辑没有执行成功,那么都算失败.所有的数据都回归到最初的状态(回滚)
- 为什么要有事务?
为了确保逻辑的成功 例子:银行的转账
二.使用命令行方式演示事务
- 关闭自动提交功能
show variables like'%commit%';
set autocommit = off - 命令行演示事务的格式
start transaction; //开启事务
*****事务*********
commit; / rollback; //commit提交事务,数据会写在磁盘上的数据库 rollback数据回滚,回到最初的状态
三.用代码演式事务
- 通过conn.setAutoCommit(false)来关闭自动提交的设置
- 提交事务 conn.commit();
- 回滚事务 conn.rollback();
四.事务的特性 ACID
- 原子性 :指的是 事务中包含的逻辑,不可分割
- 一致性 :指的是 事务执行前后, 数据完整性
- 隔离性 :指的是 事务在执行期间不应该受到其他事务的影响
- 持久性 :指的是 事务执行成功,那么数据应该持久保存到磁盘上
五.事务的安全隐患
隔离级别:Read Uncommitted 读未提交
Read Committed 读已提交
Repeatable Read 重复读
Serializable 可串行化
不考虑隔离级别设置, 那么会出现以下问题
- 读 问题
脏读 :一个事务读到了另外一个事务还未提交的数据
不可重复读 :一个事务读到了另外一个事务提交的数据,造成了前后两次查询结果不一致
幻读 - 写 问题
丢失更新
mysql 默认的隔离级别是 重复读
oracle 默认的隔离级别是 读已提交
六.丢失更新
- 悲观锁: 可以在查询的时候加入 for update
select * from account for update; - 乐观锁:version
(二).数据库连接池
先在内存中开辟一块空间(集合),一开始先往池子里面放置多个连接对象,
后面需要连接的话,直接从池子里面取,不用自己创建了.
使用完毕后,记得归还连接,确保连接对象能循环利用
一.开源连接池
都要导入jar,还有配置文件
- DBCP DataBase Connection Pool 数据库连接池
配置文件 dbcpconfig.properties - C3P0
配置文件 c3p0-config.xml
(三).DBUtils
//dbutils只是帮我们简化了CRUD的代码,但连接的创建以及获取工作不在其考虑范围内
QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
一.增删改查
- 针对增加,删除,修改
queryRunner.update(sql,...);
例如 queryRunner.update("insert into account values (null,?,?)","aa",1000); - 执行查询,查询到的数据还是在ResultSet里面,然后调用下面的handle方法,手动封装
[code] Account account = queryRunner.query("select * from account where id = ?", new ResultSetHandler<Account>(){ @Override public Account handle(ResultSet rs) throws SQLException { Account account = new Account(); while(rs.next()){ int money = rs.getInt("money"); String name = rs.getString("name"); account.setName(name); account.setMoney(money); } return account; } },3);
二.查询
直接使用框架已经写好的实现类
- 查询单个对象
Account account = queryRunner.query("select * from account where id = ?",new BeanHandler<Account>(Account.class),3); - 查询多组对象
List<Account> list = queryRunner.query("select * from account ",new BeanListHandler<Account>(Account.class));
for (Account account : list) {
System.out.println(account.toString());
}
三.ResultSetHandler 常用的实现类
BeanHandler, BeanListHandler 查询到的数据单个封装成对象,多个封装成List<对象>,里面元素是对象
ArrayHandler, ArrayListHandler 查询到的数据单个封装成数组,多个封装成一个集合,里面元素是数组
MapHandler, MapListHandler 查询到的数据单个封装成map,多个封装成集合,里面元素是map
ColumnListHandler, KeyedHandler, ScalarHandler
相关文章推荐
- 数据库连接池-DBUtils高级 事务+不确定条件查询+分页
- javaWeb学习记录:c3p0数据库连接池;DBUtils工具
- JavaWeb基础知识day13——MVC思想&&MySQL事务与Java事务
- web day18 事务,数据库连接池(DBCP,C3P0,),DBUtils,装饰模式,Tomcat配置JNDI资源,ThreadLocal,BaseServlet
- JavaWeb基础知识day05——JDBC&&连接池&&C3P0&&DPCP连接池&&DBUtils工具类
- JDBC、事务、数据库连接池、DBUtils
- 【JavaWeb-11】DBUtils、QueryRunner的query/update/batch、ResultSetHandler的9个处理器、ThreadLocal管理conn进行事务处理的案例
- 几张图让你彻底了解JAVASE、JAVAEE、JAVAWEB整个的知识体系
- JavaWeb Spring 事务——Transation
- JavaWeb入门实战—相关知识准备
- 数据库事务管理基础知识
- Python数据库连接池DBUtils
- Oracle事务管理知识整理
- JavaWeb前端知识-JQuery
- javaweb项目中常用知识
- JavaWeb核心基础面试知识深度详解
- ORACLE数据库的事务&Oracle事务知识要点
- 深入分析JavaWeb 31 -- JDBC(MySQL)事务管理
- 事务隔离性的一些基础知识
- Spring的事务管理和数据库事务相关知识