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()方法

图片.png

or()方法

图片.png

and()和or()连用

图片.png

图片.png

参考

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()连用