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