# 内容
1. 连接池
2. 事务
3. 动态sql语句
4. 多表查询
## mybatis的连接池
1. 连接池:
作用:可以减少获取连接的时间
2. mybatis中的连接池
1. 配置的位置:
* 主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式。
2. type属性的取值:
* POOLED:采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
* UNPOOLED:采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。
* JNDI:采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样。
3. POOLED的工作原理;
1. 判断连接池中是否有空闲的连接,若有则取出连接;若无,进入下一判断
2. 判断连接池中的连接数量是否达到最大值,若未达到,新建新的连接,并置其为活动状态;若达到,进入下一判断
3. 取出最老的活动的连接,判断其是否已经失效;若失效,将连接移除并新建新的连接
## mybatis中的事务
1. 概念:
* 事务(Transaction)是并发控制单位,是用户定义的一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单位。
* 事务通常以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
2. 四大特性(ACID):原子性,一致性,隔离性,持久性
⑴ 原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,
⑵ 一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
⑶ 隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
⑷ 持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的
3. 不考虑事务的隔离性,会发生的几种问题:
1. 脏读
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
2. 不可重复读
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
* 不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
3. 虚读(幻读)
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
* 幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
4. 设置事务的自动提交