1. 连接池(数据源):
type: POOLED,UNPOOLED ,JNDI
2. 事务问题
1) 设置手动提交(开启事务)
2) 提交(提交事务)
3) 回滚事务
4) 设置自动提交(还原状态)
openSession() -- 不可以自动提交事务的SqlSession对象
openSession(true) -- 可以自动提交事务的SqlSession对象
3. 动态sql语句
if 多条件查询
where 帮助程序员处理第一个and符号,结合if语句使用
sql片段: 提取常用的代码
foreach: 循环
属性:collection="list | array", item="循环中每一个对象" open="前缀" close="后缀" seperator="分隔符"
4. 关系映射-- 一对一: 一个账户对应一个用户
1) 声明一个pojo,包含账户和用户所有的属性
2) 在account声明一个User的属性
<result property="user.属性" column>
3)在account声明一个User的属性
<association property="属性名" javaType="类型">
<result property="属性" column>
</association>
5. 关系映射-- 一对多: 一个用户对应多个账户
1) 在user类中声明一个账户的集合属性
2) <collection property="属性名" ofType="类型">
<result property="属性" column>
</collection>
6. 关系映射-- 多对多:两个一对多
1、mybatis延迟加载
2、mybatis缓存
3、mybatis注解开发
===========================================================================
1、mybatis延迟加载
1. 也叫懒加载
2. 什么时候需要,什么时候去获取
什么时候需要该数据,什么时候执行sql语句去查询
一对一延迟加载 (association)
一个count对应一个user,当然是先找acount中的一条数据(select * from account);再根据它的u_id(对应user主键),找到对应的user的主键,根据主键查出user的一条数据。
如果是懒加载,用不到user中的数据,那么后半部分就不执行。
延迟加载和立即加载的区别:
不管有没有相同的列名,都是单张表的映射,没有两张表的映射了。
以上的这种方法(一对一延迟加载)是比较常用的方法。
一对多延迟加载 (collection)
一个user对应多个account,先select * from user;如果用到了account数据,那么根据user的主键id查找account中u_id与之对应的数据,即select * from account where u_id = #{id}。
以上是一对一,和一对多的查询方法。
延迟加载和立即加载的日志过程
懒加载用到才执行sql语句查询
开启全局的延迟加载
mybatis缓存
a、一级缓存
/**
* 一级缓存
* 1,在同一sqlSession对象范围下,两次执行同一个sql语句,第二层没有执行sql语句,说明缓存的存在
* 2.如果执行了增删改,提交操作,会清空缓存
* 3. sqlSession.clearCache();清空缓存
* 4. 一级缓存是SqlSession级别的, 必须是在一个sqlsession对象范围下才可以的得到一级缓存,不是同一个sqlSession
*
* 一级缓存运行流程
* 第一次执行sql语句,查询到数据,在会在一级缓存中存储sql语句和数据,以 sql语句为key值, 以数据为value值
* 在第二层执行sql语句时,会先从缓存中查询 ,以sql为key查询,得到数据,直接返回,如果没有相应的sql语句,则查询数据库
*
*/
b、二级缓存
/**
* 二级缓存
* 1. 是sessionFactory级别的, 可以在多个SqlSession对象共享缓存数据,存储作用域为Mapper的namespace级别
* 2. 默认的是开启的
* <setting name="cacheEnabled" value="true"/>
* 3. 在需要使用二级缓存的配置映射文件中开启
* <cache/>
* 4. 需要在二级缓存中保存的pojo对象必须实现序列化接口
* User implements Serializable
* 5. 在同一namespace范围下,执行提交操作,会清空该namespace的缓存
*
* 二级缓存的工作流程
* 1,在任意一个sqlSession对象中执行了sql查询语句,当关闭sqlSession对象时,在二级缓存中保存数据:以 namespace.sql语句为key值
* 以对象为value存储
* 2. 当其他sqlSession对象执行时, 需要根据namespace.sql 查询是否存在缓存
*/
核心配置文件 <setting name="cacheEnabled" value="true"/>
但是需要在配置文件中通知 在需要使用二级缓存的配置映射文件中开启<cache/>
需要在二级缓存中保存的pojo对象必须实现序列化接口
过程:
在不同的sqlSession中共享缓存,碰撞几率0.5,如果再写一个sqlSession3,那么碰撞几率为2/3。
mybatis注解开发和结果集映射
核心配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"></properties>
<!--配置数据库的环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--引入配置文件-->
<mappers>
<package name="com.itheima.dao"></package>
</mappers>
</configuration>
不需要再写映射文件
主键回显
注解实现一对一
注解实现一对多 (一个用户,多个账号)
注解开发动态sql语句