MyBatis
是一个对JDBC的封装,是一个数据持久化框架
优点
减少代码量,降低维护成本,讲SQL写到XML中,降低耦合度,支持动态SQL语句,支持标签映射,
缺点
SQL编写工作量大,SQL语句依赖数据库,导致移植性较差
核心接口和类
SqlSessionFactoryBuilder - SqlSessionFactory - SqlSession
开发方式
使用原生接口或者用Mapper代理实现自定义接口
实际操作
- 导入依赖
1 | <dependency> |
1 | <build> |
- 创建表
- 创建表对应的实体类
- 创建MyBatis配置文件MyBatis.xml
1 | <environments default="development"> |
- 创建Mapper.xml
namespace 设置为文件所在包+文件名,insert表示执行insert,id是参数,parameterType是类型1
2
3
4
5
6
7
8
9
<mapper namespace="com.wsx.mapper.AccoutMapper">
<insert id="save" parameterType="com.wsx.entity.Account">
insert into t_account(username,password,age) values(#{username},#{password},#{age})
</insert>
</mapper> - 注册SQL语句
1
2
3
4
5
6
7
8
9<!-- 注册AccountMapper.xml -->
<mappers>
<mapper resource="com/wsx/mapper/AccountMapper.xml"></mapper>
<mapper resource="com/wsx/repository/AccountRepository.xml"></mapper>
<mapper resource="com/wsx/repository/StudentRepository.xml"></mapper>
<mapper resource="com/wsx/repository/ClassesRepository.xml"/>
<mapper resource="com/wsx/repository/CustomerRepository.xml"/>
<mapper resource="com/wsx/repository/GoodsRepository.xml"/>
</mappers> - 调用接口
1 | //加载MyBatis配置文件 |
自定义接口
1 | public interface AccountRepository { |
1 | <insert id="save" parameterType="com.wsx.entity.Account"> |
1 | InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml"); |
传入多个变量
1 | <select id="findByNameAndAge" resultType="com.wsx.entity.Account"> |
查询深入
多对一
比方这个, 我们查询出来有多个id,这时候,student对象的id会匹配第一个,name也是,所以查询出来classes就null了
我们需要使用resultMap来处理
1 |
|
1 | <resultMap id="studentMap" type="com.wsx.entity.Student"> |
一对多
1 | <resultMap id="classesMap" type="com.wsx.entity.Classes"> |
逆向工程
传统开发中,实体类、自定义Mapper接口、Mapper.xml 需要开发者手动创建,逆向工程可以帮助开发者来自动创建三个组件,减少工作量
MBG
MyBatis Generator , 一个专门为MyBatis框架开发者定制的代码生成器
1 | <dependency> |
配置文件
1 |
|
1、jdbcConnection 配置数据库连接信息。
2、javaModelGenerator 配置 JavaBean 的⽣成策略。
3、sqlMapGenerator 配置 SQL 映射⽂件⽣成策略。
4、javaClientGenerator 配置 Mapper 接⼝的⽣成策略。
5、table 配置⽬标数据表(tableName:表名,domainObjectName:JavaBean 类名)。
生成代码如下,这个代码不重要,跑就完事了, 他就给我们生成了很多sql
1 | List<String> warings = new ArrayList<String>(); |
延迟加载
先配置
1 | <settings> |
然后把多表关联查询拆分成多个单表查询, 调用接口的时候再去查询,不用就不查询,比方有图书表和图书类型表,我们查到了一些类型,这就是一个单表查询,如果你不去调用getBook,接下来的查询就不会进行, 慎用,这个东西讲一次查询拆成了多次,这可能导致性能降低
MyBatis缓存
我干嘛不用redis?
一级缓存
默认开启且不可关闭,是SqlSession级别的,用HashMap实现,不同的SqlSession之间的数据区域互不影响, 当执行了DML操作(insert,update,delete),就要清空缓存
二级缓存
多个SqlSession共用同一个缓存,依然是HashMap实现
在config.xml中开启
1 | <settings> |
在Mapper.xml 中加入
1 | <cache></cache> |
实体类要实现序列化(Serializable)
第三方缓存
1 | <dependency> |
配置第三方缓存,ehcache.xml
1 | <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
在config.xml中开启(同上)
最后在mapper.xml中配置 缓存失效间隔、回收策略, 这里就不需要实现序列化了
1 | <cache type="org.mybatis.caches.ehcache.EhcacheCache"> |
动态SQL
where 控制 and是否删除,
if 控制是否存在,
这里我不深入了…会用就行
1 | <select id="findByAccount" parameterType="com.wsx.entity.Account" resultType="com.wsx.entity.Account"> |
参考资料
4小时学会MyBatis
你真的懂了mybatis延迟加载吗?
- 本文作者: fightinggg
- 本文链接: http://fightinggg.github.io/yilia/yilia/Q9FQAC.html
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!