核心配置文件、mapper映射文件
核心配置文件 mybatis-config.xml 配置连接数据库的环境和 mybatis 全局配置信息
src/main/resources
映射文件 XXXMapper.xml 与mapper接口(相当于DAO,无实现类)同名
src/main/resources/与mapper接口一样的包名 【一张表一个实体类一个映射文件】
mybatis-config.xml 乱七八糟标签
统一引入映射文件
映射文件
获取参数值 ${ } 和 #{ }
${ }字符串拼接,当心 sql 注入 #{ } 占位符赋值
五种传参方式
1.单参数
mapper接口中为普通的单参数 ${ } 或 #{ }
2.多参数
mybatis 会自动将参数放在一个 map 中
arg0,arg1,arg2....或param1,param2,param3......为键 参数为值。使用 ${ } 或 #{ } 即可
3.map类型参数
手动将数据填入map,然后传参map
4.实体类类型参数
直接使用 ${ } 或 #{ } 访问实体类的属性
5.@Param( " " )
mybatis 会自动将参数放在一个 map 中
@Param注解的value 或 param1,param2,param3......为键 参数为值。使用 ${ } 或 #{ } 即可
Map接收查询结果
查询结果没有对应的实体类时可以用 Map 接收
(1)单条记录放入 Map
Map 内存放 【字段名:值】 键值对,记录中的值为 NULL 的话不会放入 Map
(2)多条记录放入 Map
1.List<Map<String,Object> > 接收
2.注解@MapKey("字段名")
一条记录放入一个Map,多条记录多个Map放入另一个Map
由注解给出的字段名作为【键】,【值】为一条记录对应的Map
Map键 无重,@MapKey 最好用 自增主键,防止覆盖。
模糊查询
(1)select ... like %$ { asdfas } %
(2)select ... like concat( '%' , # { asdfas } , '%' )
(3)select ... like "%" # { asdfas } "%"
主键回显
字段名和属性名不一致
(1)字段名起别名,和属性名一致
(2)mybatis-config.xml 全局设置
符合规范的 _ 命名 和 符合规范的 驼峰 命名,自动映射
例如 user_name 映射为 userName
(3)自定义映射 <resultMap>
多对一映射
(1)级联,查询结果 resultMap 自定义映射
(2)association
(3)分布查询
分布查询可以避免 join
分布查询优点:可以实现延迟加载
1.先根据 id 查询 student 表中数据
2.根据查询到的记录的 student_calss 作为条件传给分布查询sql
延迟加载
全局设置延迟加载
分布查询局部设置延迟加载
开启延迟加载,只调用实体类的一个属性,不执行分布查询sql
一对多映射
(1)collection
(2)分布查询
动态SQL
(1)if < if > 标签内容成立则将sql语句进行拼接
(2)where
(3)trim
(4)choose when otherwise
(5)sql 标签
foreach批量添加和批量删除
(1)批量添加
(2)批量删除
一级缓存(SqlSession级别)
mybatis一级缓存默认开启,通过同一个sqlSession查询的数据会被缓存,下次查询相同的数据会从缓存中直接获取,不会从数据库访问。
一级缓存失效:
(1)不同的 SqlSession 对应不同的一级缓存
(2)同一 SqlSession 但查询条件不同
(3)同一 SqlSession 两次查询间执行了【增删改】操作
(4)同一 SqlSession 两次查询间手动清空了缓存 【 sqlSession.clearCache(); 】
二级缓存(SqlSessionFactory级别)
同一SqlSessionFactory创建的SqlSession查询结果会被缓存
二级缓存开启条件:
(1)核心配置文件,全局属性 cacheEnable="true" 默认就是开着的
(2)映射文件里加个 <cache />
(3)SqlSession close 后才有效
(4)查询的数据转换的实体类要实现 【序列化接口】 【implements Serializable】
二级缓存失效:
(1)两次查询间增删改
缓存查询顺序
二级 ---> 一级 ---> 数据库
逆向工程
分页插件