Mybatis&&MybatisPlus
基于spring的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>
<!--官网全局配置文件解析 https://mybatis.net.cn/configuration.html-->
<settings>
<!--懒加载 默认为false-->
<setting name="lazyLoadingEnabled" value="false"/>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true" />
<!--配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(PreparedStatement); BATCH 执行器不仅重用语句还会执行批量更新。-->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!--驼峰命名自动映射-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--指定 MyBatis 增加到日志名称的前缀。-->
<setting name="logPrefix" value="MYBATIS"/>
<!--设置数据库超时时间-->
<setting name="defaultStatementTimeout" value="1000"/>
</settings>
<typeAliases>
<!--类型别名(可以使用注解:@Alias("Student")) 单独为某个类设置别名-->
<package name="com.example.mybatistest.pojo"/>
</typeAliases>
<!-- 配置分页插件 注意版本不同interceptor(拦截器不同)5.0之后使用PageInterceptor-->
<!-- <plugins>-->
<!-- <plugin interceptor="com.github.pagehelper.PageHelper">-->
<!-- <property name="dialect" value="mysql"/>-->
<!-- </plugin>-->
<!-- </plugins>-->
<!-- 5.1.2版本 PageInterceptor 并且可以自动识别sql语言-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--分页合理化参数 pageNum<=0时查询第一页,超过最大页码时查询最后一页-->
<property name="reasonable" value="true"/>
</plugin>
</plugins>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/localhost"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.example.mybatistest.mapper.StudentMapper"></mapper>
</mappers>
</configuration>
Mapper
主键返回
<!--设置useGeneratedKeys,keyColumn,keyProperty三个属性后,插入成功后的对象的id会自动赋值-->
<insert id="insertStudent" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
INSERT INTO student(name, `number`, address, age)
VALUES(#{name}, #{number}, #{address}, #{age});
</insert>
批量插入(foreach标签)
<insert id="insertBatch" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
INSERT INTO student(name, `number`, address, age) values
<!--collection表示参数名称,separator表示每次循环中间添加的字符-->
<foreach collection="list" separator="," item="item">
(#{item.name},#{item.number},#{item.address},#{item.age})
</foreach>
</insert>
动态sql
缓存机制
mybatis缓存机制
mybatis二级缓存是表级缓存,开销大,假设进行多表联合查询,其他mapper的更新操作并不会刷新缓存,这样就造成了数据不一致的问题.因此不建议使用二级缓存.
如果使用,建议关闭只读: readOnly=false(默认),此时用户拿到的是缓存的副本而不是缓存的内存地址,防止造成缓存污染
基于SpringBoot的MybatisPlus
快速开始
依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
注意:
引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题。
配置
# 开启日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# 设置实体类所对应的表的统一前缀
#mybatis-plus.global-config.db-config.table-prefix=t_
# 设置全局主键生成策略
mybatis-plus.global-config.db-config.id-type=auto
# 指定映射文件位置
mybatis-plus.mapper-locations=classpath*:/mapper/**/*.xml
# 配置别名
mybatis-plus.type-aliases-package=com.example.mybatisplustest.pojo
配置Mapper
1、Mapper接口需要继承BaseMapper
2、启动类需要添加@MapperScan注解
3、如需添加mapper映射文件,需要用在配置文件中mapper-loacltions指定映射文件位置(不指定的默认位置:classpath:/mapper/**/.xml)
分页插件
1、配置分页拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//配置分页拦截器
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return mybatisPlusInterceptor;
}
2、分页查询
@Test
void contextLoads() {
Page<Student> studentPage = new Page<>(0, 5);
studentMapper.selectPage(studentPage, null);
System.err.println(studentPage.getRecords());
}
乐观锁插件
注意:
实体字段需要添加一个代表数据版本的字段,并且添加@Version注解
配置乐观锁插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//配置分页拦截器
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//添加乐观锁插件
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
MybatisPlus逆向工程
直接用MybatisX插件去生成就好啦