目录
数据库表结构
CREATE TABLE `student` (
`id` varchar(32) NOT NULL,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`age` datetime DEFAULT NULL COMMENT '生日',
`CREATE_BY` varchar(64) NOT NULL,
`CREATE_DATE` datetime DEFAULT NULL,
`UPDATE_BY` varchar(64) DEFAULT NULL,
`UPDATE_DATE` datetime DEFAULT NULL,
`REMARKS` varchar(255) DEFAULT NULL,
`DEL_FLAG` char(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
枚举类型
实体类中声明枚举类型
- 定义枚举类
方法一:采用继承IEnum实现
方法二:注解方式请看Mybatis-plus官方文档
以下以方法一为例
@AllArgsConstructor
public enum SexEnum implements IEnum<String> {
BOY("1", "男"),
GIRY("2", "女");
private String value;
private String desc;
@Override
public String getValue() {
return this.value;
}
}
- 全局配置枚举类型转换
server:
port: 8081
spring:
application:
name: sky-user
datasource:
url: jdbc:mysql://127.0.0.1:3306/shiro?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf-8&useSSL=true
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
minimum-idle: 5
maximum-pool-size: 20
connection-test-query: SELECT 1
mybatis-plus:
type-enums-package: com.sky.sd.user.bean.enums
- 测试
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class TestCase {
@Autowired
private UserDao userDao;
@Test
public void test() {
User user = userDao.selectById(1);
log.info("用户数据为:{}", user);
}
}
查询结果
序列化枚举值为数据库存储值
- 增加如下配置
@Configuration
public class ConsumWebMvcConfig implements WebMvcConfigurer {
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer(){
return builder -> builder.featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
}
}
SpringMVC接受枚举类型和返回枚举类型转换
具体请看Spring接收枚举类型
逻辑删除
逻辑删除
局部配置
在实体类删除字段上增加@TableLogic注解
@TableLogic
private Integer isDel;
全局配置
在配置文件中增加如下配置
mybatis-plus:
global-config:
db-config:
logic-delete-field: isDel#全局逻辑删除字段值 3.3.0开始支持,详情看下面。
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
查询中排除删除字段
使用mp自带方法删除和查找都会附带逻辑删除功能
查询,会在where后边加上del_flag=0逻辑删除标识,如下图所示
删除的时候会自动更新,如下图所示
可以通过增加@TableField(select = false)使查询中不带delFlag字段
@TableField(select = false)
private String delFlag;
查询所有数据
由于使用mp自带方法删除和查找都会附带逻辑删除功能,有时候需要查询全部功能,这个时候需要自定义sql但是又想用mybatis-plus Wrapper,可以自定义,
@Select("select * from user ${ew.customSqlSegment}")
Student test(@Param(Constants.WRAPPER) Wrapper<Student> wrapper);
自动填充
控制台输出日志
增加如下配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
分页
mybatis-plus分页
- 增加如下配置
@Configuration
@ConditionalOnClass(value = {PaginationInterceptor.class})
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
return paginationInterceptor;
}
}
- 测试
@Test
public void page() {
IPage<User> userPage = new Page<>(2, 1);
userPage = userMapper.selectPage(userPage,null);
System.out.println(userPage/**/);
}
自定义分页
- 在UserMapper.java中添加分页方法
public interface UserMapper extends BaseMapper<User> {
//自定义分页查询,方式一
IPage<User> selectUserPage(Page<User> page, @Param(Constants.WRAPPER)Wrapper<User> wrapper);
//自定义分页查询,方式二
IPage<User> selectUserPage2(Page<User> page, @Param("age") Integer age);
}
- 在UserMapper.xml中添加SLQ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.mp.dao.UserMapper">
<select id="selectUserPage" resultType="com.mp.entity.User">
select * from user ${ew.customSqlSegment}
</select>
<select id="selectUserPage2" resultType="map">
select * from user where age >=#{age}
</select>
</mapper>
- 测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class PageTest {
@Autowired
private UserMapper userMapper;
/**
* 自定义分页查询,方式一
*/
@Test
public void selectMyPage(){
QueryWrapper<User> query = Wrappers.query();
query.ge("age", 30);
Page<User> page = new Page<>(1, 2);
IPage<User> userIPage = userMapper.selectUserPage(page, query);
System.out.println("总记录数:"+userIPage.getTotal());
System.out.println("总页数:"+userIPage.getPages());
List<User> users = userIPage.getRecords();
users.forEach(System.out::println);
}
/**
* 自定义分页查询,方式二
*/
@Test
public void selectMyPage2(){
Page<User> page = new Page<>(1, 2);
IPage<User> userIPage = userMapper.selectUserPage2(page, 30);
System.out.println("总记录数:"+userIPage.getTotal());
System.out.println("总页数:"+userIPage.getPages());
List<User> users = userIPage.getRecords();
users.forEach(System.out::println);
}
}