MyBatis-Plus初体验

  |   0 评论   |   0 浏览

背景

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