MyBatis-Plus初体验
背景
MyBatis可以灵活定制查询语句,但是创建和更新不够灵活。
而JPA创建更新灵活,查询不够灵活。
MyBatis-Plus是在MyBatis的基础上的一个增强工具,具有强大的 CRUD 操作。
初体验
依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.4</version> </dependency>
建表
略
映射
构建实体类,如:
@Data public class User { private Long id; private String name; private Integer age; private String email; }
编写Mapper类,添加Mapper注解
@Mapper public interface UserMapper extends BaseMapper<User> { }
使用示例
@SpringBootTest public class SampleTest { @Autowired private UserMapper userMapper; @Test public void testSelect() { System.out.println(("----- selectAll method test ------")); List<User> userList = userMapper.selectList(null); Assert.assertEquals(5, userList.size()); userList.forEach(System.out::println); } }
TypeHandler
JSON字段类型
@Data @Accessors(chain = true) @TableName(autoResultMap = true) public class User { private Long id; ... /** * 注意!! 必须开启映射注解 * * @TableName(autoResultMap = true) * * 以下两种类型处理器,二选一 也可以同时存在 * * 注意!!选择对应的 JSON 处理器也必须存在对应 JSON 解析依赖包 */ @TableField(typeHandler = JacksonTypeHandler.class) // @TableField(typeHandler = FastjsonTypeHandler.class) private OtherInfo otherInfo; }
Array字段类型
import org.apache.ibatis.type.ArayTypeHandler; @Data @TableName("sample_table", autoResultMap = true) public class SampleTableModel { @TableField(typeHandler = ArrayTypeHandler.class) private String[] keyArray; }
打印SQL日志
增加依赖
<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>最新版本</version> </dependency>
修改配置
spring: datasource: driver-class-name: com.p6spy.engine.spy.P6SpyDriver url: jdbc:p6spy:h2:mem:test ...
spy.properties配置
#3.2.1以上使用 modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory #3.2.1以下使用或者不配置 #modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory # 自定义日志打印 logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger #日志输出到控制台 appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger # 使用日志系统记录 sql #appender=com.p6spy.engine.spy.appender.Slf4JLogger # 设置 p6spy driver 代理 deregisterdrivers=true # 取消JDBC URL前缀 useprefix=true # 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. excludecategories=info,debug,result,commit,resultset # 日期格式 dateformat=yyyy-MM-dd HH:mm:ss # 实际驱动可多个 #driverlist=org.h2.Driver # 是否开启慢SQL记录 outagedetection=true # 慢SQL记录标准 2 秒 outagedetectioninterval=2
动态SQL
有较简单的注解方法
注解
@Select({ "<script>" , "SELECT COUNT(*) FROM category", "<if test='query != null and query != \" \" '>", "where cat_name like '%${query}%'", "</if>", "</script>" }) Integer getCount(@Param("query") String query);
较复杂的LanguageDriver方法。
druid集成的问题
加载 WallFilter时报错
spring.datasource.dynamic.druid.filters=stat
DruidDataSource加载报错
增加注解
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
批量写入
[7]
增加Service接口
import com.baomidou.mybatisplus.extension.service.IService; public interface UserService extends IService<User> { }
增加Service实现类
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @Service public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService { }
调用 UserServiceImpl.saveBatch
即可批量写入。
直接执行SQL
[8]
public interface BaseMapper { /** * 执行sql * * @param sql sql 语句 * @return R 返回值 */ @SelectProvider(value = EasySelectProvider.class, method = "getSql") <R> R select(String sql); }
public class EasySelectProvider { public String getSql(String sql) { return sql; } }
逻辑操作
and()方法
or()方法
and()和or()连用
参考
1 MyBatis-Plus
2 druid数据源集成p6spy踩坑
3 跟 Druid 1.1.14 有冲突
4 执行 SQL 分析打印
5 @Select动态参数参考
6 Mybatis实现@Select等注解动态组合SQL语句
7 MyBatis Plus 批量数据插入功能,yyds!
8 mybatis 直接执行sql
9 mybatis-plus之and()和or()连用