MybatisPlus 模块
# MybatisPlus 模块
# 一、背景
官方网站: https://baomidou.com/
基于Mybatis plus插件上做的的二次封装,将原生的一些增强功能集成进来
数据准备
其对应的数据库 Schema 脚本如下:
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
PRIMARY KEY (id)
);
DROP TABLE IF EXISTS user_info;
CREATE TABLE user_info
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
user_id BIGINT(20) NOT NULL COMMENT '用户ID',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
其对应的数据库 Data 脚本如下:
truncate table user;
INSERT INTO user (id, name) VALUES
(1, 'Jone'),
(2, 'Jack'),
(3, 'Tom'),
(4, 'Sandy'),
(5, 'Billie');
truncate table user_wallet;
INSERT INTO user (id,user_id, balance) VALUES
(1, 1,10),
(2, 2,20),
(3, 3,30)
;
# 二、引入坐标
<!--H2 内存数据库-->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<!--Mybatis plus 原始依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!--Mybatis plus 扩展依赖-->
<dependency>
<groupId>cn.lovecyy</groupId>
<artifactId>relaxed-extend-mybatis-plus</artifactId>
<version>${version}</version>
</dependency>
# 三、application.yml
# DataSource Config
spring:
datasource:
driver-class-name: org.h2.Driver
schema: classpath:db/schema-h2.sql
data: classpath:db/data-h2.sql
url: jdbc:h2:mem:test
username: root
password: test
mybatis-plus:
mapper-locations: classpath:/mapper/**/*Mapper.xml
global-config:
banner: false
db-config:
id-type: auto
insert-strategy: not_empty
update-strategy: not_null
logic-delete-field: valid
logic-delete-value: now() # 逻辑已删除值(使用当前时间标识)
logic-not-delete-value: 1 # 逻辑未删除值(默认为 0)
# 四、启动类加注解
@SpringBootApplication
@MapperScan("com.relaxed.**.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
# 五、编码
编写实体类 User.java(此处使用了 Lombok (opens new window) (opens new window)简化代码)
@Data
public class User {
private Long id;
private String name;
}
编写实体类 UserWallet.java
@Data
public class UserWallet {
private Long id;
private Long userId;
private Double balance;
}
编写 Mapper 包下的 UserMapper接口
public interface UserMapper extends ExtendMapper<User> {
}
编写 Mapper 包下的 UserWalletMapper接口
public interface UserWalletMapper extends ExtendMapper<UserWallet> {
}
# 六、开始使用
添加测试类,进行功能测试:
@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);
}
}
# 附加功能
# 一、连表查询
# 编码
修改User.java实体增进TableAlias注解
@TableAlias("u")
@Data
public class User {
private Long id;
private String name;
}
修改 UserMapper接口
public interface UserMapper extends ExtendMapper<User> {
IPage<User> selectByPage(IPage<User> page, @Param(Constants.WRAPPER) Wrapper wrapper);
}
修改UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.relaxed..UserMapper">
<resultMap id="userMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
</resultMap>
<sql id="Base_Column_List">
id,
name
</sql>
<sql id="Base_Alias_Column_List">
u.id,
u.name
</sql>
<select id="selectByPage" resultType="User">
select <include refid="Base_Alias_Column_List"/>,uc.balance
from user u left join
user_wallet uc on u.id=uc.user_id
${ew.customSqlSegment}
</select>
</mapper>
# 开始测试
要求: 查询姓名为张三 钱包余额为10的用户
@SpringBootTest
public class SampleTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect() {
//1.生成分页条件
IPage<StampFilePageVO> page = this.prodPage(new PageParam());
//2.构建别名表达式 默认主表别名根据 当前实体上的 TableAlias 获取 且注解必须存在
LambdaAliasQueryWrapperX<User> aliasQueryWrapperX = WrappersX.lambdaAliasQueryX(User.class);
//若要自定义主表别名 获取方式 则实现 TableAliasFunction函数即可 使用如下构造即可
//LambdaAliasQueryWrapperX<StampFile> aliasQueryWrapperX = WrappersX.lambdaAliasQueryX(StampFile.class, clazz -> "u");
//值存在 则加入此条件
aliasQueryWrapperX.eqIfPresent(User::name,"张三");
//无论值为什么条件都会加入
aliasQueryWrapperX.eq(OtherTableColumnAliasFunction.joinTableAliasColumn("uc.balance"),10);
this.selectByPage(page, aliasQueryWrapperX);
return new PageResult<>(page.getRecords(), page.getTotal());
}
@Data
public static class PageParam {
private long current = 1L;
private long size = 10L;
}
}