MyBatis
2022-11-18 08:45:49 1 举报
AI智能生成
MyBatis知识点
作者其他创作
大纲/内容
入门
入门思考
1 想想JDBC、Hibernate、JPA等ORM映射框架是如何进行持久层操作的?
2 既然已经有了上述那么多的ORM框架,MyBatis为什么出来?
主要概念
是什么
Ibatis
Mybatis
能干嘛
去哪下
怎么玩
永远的HelloWorld
建工程+添jar包
打开mysql新建数据库+建表person
log4j.xml
第二种
第一种
添加配置文件mybatis-config.xml,从官方文档拷贝
修改mybatis配置文件,数据库连接配置,先用直连后续换c3p0
建对应的entity持久化实体
建Mapper接口并定义好方法
建对应Mapper接口的XML映射文件
假如没有自动提示
将MapperXML映射文件配置进mybatis-config.xml
编写Junit单元测试类,执行CRUD操作
第一个入门case的小结
XXXMapper.xml文件中,namespace必须是接口全路径
XXXMapper.xml中的id必须是接口里面的方法名 ,两者一致
XXXMapper.xml中的parameterType类型必须和对应方法的形参一致
XXXMapper.xml中的resultType类型必须和对应方法的返回值类型一致
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,
它也是线程不安全的,定义为局部变量
mapper接口实现动态代理对象
定义:只需要编写mapper接口的(等价于传统的dao接口),
Impl实现类,也即动态代理+面向接口
XXXdao接口-------->XXXMapper.java
XXXdao接口Impl实现类-------->XXXMapper.xml
再次和JDBC、Hibernate、JPA对比学习
mybatis解决了哪些问题,为何有它一席之地
相对于JDBC
Sql语句配置在XXXXmapper.xml文件中与java代码分离
数据库连接池
Where条件的频繁变化,Mybatis自动将java对象映射至sql语句,
通过statement中的parameterType定义输入参数的类型。
相对于Hibernate
Hibernate太重,mybatis轻量级
严格来说,Mybatis是个半自动化的SQL Mappering映射框架,因为MyBatis需要程序员自己编写Sql语句
学习门槛低,简单易学,看官网文档都知道,不到100页,可以快速上手。
程序员直接编写原生态sql,可严格控制sql执行性能,sql在手,天下我有。
相对于JPA
相对于Spring Data
Mapper+Annotation
入门增强
传统Dao
Dao接口
DaoImpl
Myabtis的CRUD操作常用API
还是以PersonMapper.java为例,再来一次CRUD,
调用mybatis的crud提供的其它API,重写测试类,其它不用变
Mybatis也是支持注解,^_^
新写接口
在接口的方法上面新增注解
到mybatis的配置文件里面注册该接口类(含注解)
测试,通过getMapper重新获得注解接口版的XXXMapper.class
Mybatis的XML映射
配置文件
mybatis-config.xml
MyBatis的XML配置文件包含了
影响MyBatis行为甚深的设置和
属性信息
configuration
properties 属性
JDBC--->C3P0,添加外部数据库链接演示
src文件夹下面新建db.properties
修改mybatis-config.xml
settings 全局参数定义
typeAliases 别名处理器
别名是为 Java类型命名一个短的名字。它只和 XML 配置有关,只用来减少类名重复的部分。
配置了mybatis-config.xml会影响XXXMapper.xml的使用
默认
自定义
单个
多个
typeHandlers 类型处理器
用于java类型和jdbc类型映射
Mybatis的映射基本已经满足,不太需要重新定义
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
mappers 映射器
resource:XXXMapper.xml文件
class:接口注解实现
url:外部路径
不建议使用
package
SQL映射的XML文件
XXXMapper.xml
insert、delete、update、select
主键生成方式
Person插入数据后想获得主键
有自增Mysql
无自增Oracle
如果需要额外功能请自行文档
parameterType(输入参数类型)
传入简单类型,比如按照id查Person(前面已讲过)
传入POJO类型,前台选了多个条件
新建表tbl_cat
新建Cat.java
新建CatMapper接口+方法
public Cat getCatByConditions(Cat cat)
新建CatMapper.xml
通配注册或单独注册进mybatis配置文件,否则报:is not known to the MapperRegistry
新建单元测试类
演示下like并讲解
接口新建方法getCatByCatName
#{ }
测试
分支主题
${ }
面试题
测试
建议
传入HashMap
接口新增方法
映射文件
测试类
口袋POJO,混合型传入参数,进公司看团队技术流风格
resultType(输出参数类型)
输出单个POJO对象,(前面已讲过)
输出多个List,(前面已讲过)
输出hashmap
说明:select的各个字段名称作为map的key,值写入value
接口
映射文件
测试类
resultMap(结果集映射)
问题
POJO里面的field和数据库表里面column一一对应的话,
resultType可以指定pojo将查询结果映射为pojo
假如不一致那?新建Dog演示
新建tbl_dog
新建Dog.java
新建DogMapper接口,getDogByName
新建DogMapper.xml
通配注册或者新注册到Mybatis配置文件
test
DogMapper.xml
test code
别名查询
结果映射
动态SQL
概述
新建Student演示
建表
建entity
建接口
建Mapper映射文件
注册
测试,public List getByAge(int age);
if
接口方法
传入单参数age返回List,有就拼接没有就不参与,按照年龄查学生
重点难点:单参数时,mybatis找不到参数错误现象和处理
where
接口方法
Mapper文件
where子句以and 或者or开头,它会自动删除第一个and或者or
一般建议Where和if结合起来用
test
choose/when/otherwise
类似switch
接口方法
Mapper文件
test
foreach
SQL里面的IN查询
if+where+foreach
接口
映射文件
test
trim
接口
映射文件
trim+if,能替代where
前后缀动态覆盖拼装insert
set
动态包含需要更新的列set+if
会动态前置set关键字
自动删除最后一个英文逗号
修改操作需要commit提交
接口
映射文件
总结+面试题分析
Mybatis逆向工程
是什么
Mybatis官方提供的逆向工程,可以将单表生生成
常用的Mapper、entity等配置
去哪下
能干嘛
从数据库表反向生成mapper.java/mapper.xml/entity/辅助查询类
怎么玩
有数据库表提供给MyBatisGenerator反向生产素材
打开mybatis-generator-core-1.3.2-bundle\mybatis-generator-core-1.3.2\docs
里面的文档照着官网配置
带同学们读读官方文档直至获得generatorConfig.xml
3.1 概览
3.2获悉那几个方面可以获得Running MyBatis Generator
3.3 generatorConfig.xml
3.4 生成映射的java工具类
拷贝出entity/mapper/mapper.xml
测试
注意事项
Spring+Mybatis
spring3.0以下不支持mybatis
添jar包
db.properties
applicationContext.xml
扫描包
C3P0数据库引入
配置mybatis的SqlSessionFactory
配置事务管理
配置MapperScannerConfigurer
新建mybatis配置文件mybatis-config.xml
新建entity+Mapper接口/XML配置+Service
User.java
UserMapper.java
UserMapper.xml
测试调用
查询缓存
介绍
一级缓存
案例步骤
建表tbl_user
建entity
UserMapper接口和方法
UserMapper.xml实现
通配注册或新增注册到配置文件
演示缓存失效情况
原理结论
二级缓存
案例步骤
mybatis-config.xml配置中开启显示的定义二级缓存
提醒,用二级缓存时entity类必须实现序列化接口
添加一个在userMapper.xml
测试+效果
原理结论
Cache参数解释
禁用二级缓存
刷新(清空)二级缓存
一级缓存和二级缓存的使用顺序
要想使某条 Select查询
支持二级缓存的前提条件
mybatis整合Ehcache
是什么
mybatis已经有1、2级缓存了为什么还要ehcache
能干嘛
怎么玩
添jar包
ehcache.xml配置,用自定义的
开启ehcache缓存
测试
关联查询
通用步骤
新建数据表+新增内容数据
建entity
Mapper接口
对应接口的Mapper.xml
通配注册或在mybatis-config.xml里面新增映射配置
测试类
一对一
配置版
新建数据表+新增内容数据
建entity
Mapper接口定义
KeyMapper.java
LockMapper.java
KeyMapper.xml定义
LockMapper.xml实现,第一种(ResultMap+连接查询)
LockMapper.xml实现,第二种(ResultMap+select分段查询)
注解版
KeyMapperAnnotation
LockMapperAnnotaion
测试类junit
一对多
需求:dept和emp
建表+自己手工新增数据
手动新增数据
配置版
先是单向1:N,一个部门下有多个员工
建entity
Dept.java
Emp.java
新建DeptMapper接口和方法,按照id查询部门
新建DeptMapper.xml
新建EmpMapper接口和方法
新建EmpMapper.xml
测试junit,查出一个部门下所有员工
再来双向1:N,每一个员工都属于一个部门
Emp类里新增定义 private Dept dept;
接口EmpMapper新增方法getEmpById
修改EmpMapper.xml
测试junit,查出某员工属于哪个部门
注解版
先是单向1:N,一个部门下有多个员工
新建接口DeptMapperAnnotation+添加注解
新建接口EmpMapperAnnotation+添加注解
通配注册或新增注册进mybatis配置文件
测试1:N
再来双向1:N,每一个员工都属于一个部门
修改EmpMapperAnnotation接口
测试
0 条评论
下一页