您的位置:首页 > 编程语言 > Java开发

Day29 JavaWeb知识 (6)事务 & 数据库连接池 & DBUtils

2019-06-08 22:00 453 查看

(一).事务

一.概述

  1. Transaction  其实指的是一组操作,里面包含许多个单一的逻辑,只要有一个逻辑没有执行成功,那么都算失败.所有的数据都回归到最初的状态(回滚)
  2. 为什么要有事务?
    为了确保逻辑的成功    例子:银行的转账

二.使用命令行方式演示事务

  1. 关闭自动提交功能
    show variables like'%commit%';
    set autocommit = off
  2. 命令行演示事务的格式
    start transaction;  //开启事务
    *****事务*********
    commit;  /  rollback;   //commit提交事务,数据会写在磁盘上的数据库  rollback数据回滚,回到最初的状态

三.用代码演式事务

  1. 通过conn.setAutoCommit(false)来关闭自动提交的设置
  2. 提交事务   conn.commit();
  3. 回滚事务   conn.rollback();

四.事务的特性 ACID

  1. 原子性 :指的是 事务中包含的逻辑,不可分割
  2. 一致性 :指的是 事务执行前后, 数据完整性
  3. 隔离性 :指的是 事务在执行期间不应该受到其他事务的影响
  4. 持久性 :指的是 事务执行成功,那么数据应该持久保存到磁盘上

五.事务的安全隐患

隔离级别:Read Uncommitted 读未提交
               Read Committed 读已提交
               Repeatable Read 重复读
               Serializable 可串行化
不考虑隔离级别设置, 那么会出现以下问题

  1. 读 问题
    脏读 :一个事务读到了另外一个事务还未提交的数据
    不可重复读 :一个事务读到了另外一个事务提交的数据,造成了前后两次查询结果不一致
    幻读
  2. 写 问题
    丢失更新

mysql 默认的隔离级别是  重复读
oracle 默认的隔离级别是 读已提交

六.丢失更新

  1. 悲观锁: 可以在查询的时候加入 for update
    select * from account for update;
  2. 乐观锁:version

(二).数据库连接池

先在内存中开辟一块空间(集合),一开始先往池子里面放置多个连接对象,
后面需要连接的话,直接从池子里面取,不用自己创建了.
使用完毕后,记得归还连接,确保连接对象能循环利用

一.开源连接池

都要导入jar,还有配置文件

  1. DBCP   DataBase Connection Pool 数据库连接池
    配置文件  dbcpconfig.properties
  2. C3P0
    配置文件  c3p0-config.xml

(三).DBUtils

//dbutils只是帮我们简化了CRUD的代码,但连接的创建以及获取工作不在其考虑范围内
        QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());

一.增删改查

  1. 针对增加,删除,修改
            queryRunner.update(sql,...);
    例如   queryRunner.update("insert into account values (null,?,?)","aa",1000);
  2. 执行查询,查询到的数据还是在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);

 

二.查询

直接使用框架已经写好的实现类

  1. 查询单个对象
    Account account = queryRunner.query("select * from account where id = ?",new BeanHandler<Account>(Account.class),3);
  2. 查询多组对象
    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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: