mybatis-plus提高效率的CRUD操作
1、代码级别的自动填充
1. 在实体类添加@TableField注解
前提是你的数据库里面有相应的字段,并且没有自动填充的设置,然后在需要填充的属性上加上@TableField注解
package com.hzxy.mybatisplus.model;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
// 字段添加填充
@TableField(fill = FieldFill.INSERT)
private Date CreateTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date UpdateTime;
}
2. 编写自定义处理器
我们需要编写自定义处理器来处理填充内容
package com.hzxy.mybatisplus.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Slf4j
@Component //把处理器加到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
// 插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill .......");
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
// 更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill .......");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
3. 测试
@Test
public void testInsert(){
User user = new User();
user.setName("Ye");
user.setAge(18);
user.setEmail("[email protected]");
int result = userMapper.insert(user);
System.out.println(result);
System.out.println(user);
}
@Test
public void testUpdate(){
User user = new User();
user.setId(1364545190177611777L);
user.setName("Ye");
user.setAge(20);
user.setEmail("[email protected]");
int result = userMapper.updateById(user);
System.out.println(result);
System.out.println(user);
}
}
结果:
2、添加SQL语句日志
在配置中加入
### 配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
结果:
3、添加乐观锁插件
1. 在实体类中加入@Version注解
注意数据库中必须有对应的字段
package com.hzxy.mybatisplus.model;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
@Version //乐观锁version注解
private Integer version;
// 字段添加填充
@TableField(fill = FieldFill.INSERT)
private Date CreateTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date UpdateTime;
}
2. 添加配置配置类
我们新建一个配置类,并把扫描Mapper的注解放到这个类
package com.hzxy.mybatisplus.config;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
// 扫描我们的 Mapper 文件夹
@MapperScan("com.hzxy.mybatisplus.mapper")
@EnableTransactionManagement
@Configuration //配置类
public class MybatisPlusConfig {
//乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
3. 测试
第一个测试
@Test
public void testOptimisticLocker(){
// 1. 查询用户信息
User user = userMapper.selectById(1L);
// 2. 修改用户信息
user.setName("ybg");
user.setEmail("[email protected]");
// 3. 执行更新操作
userMapper.updateById(user);
}
结果:
第二个测试
@Test
public void testOptimisticLocker2(){
// 1. 查询用户信息
User user = userMapper.selectById(1L);
// 2. 修改用户信息
user.setName("ybg");
user.setEmail("[email protected]");
// 3. 执行更新操作
// 1. 查询用户信息
User user1 = userMapper.selectById(1L);
// 2. 修改用户信息
user.setName("dzy");
user.setEmail("[email protected]");
// 3. 执行更新操作
userMapper.updateById(user1);
userMapper.updateById(user);
}
结果:
注意:version是4是因为我执行了两次,这个第二次的截图!
4、三个查询方法
// 通过id查询
@Test
public void testSelectById(){
User user = userMapper.selectById(1L);
System.out.println(user);
}
// 批量查询
@Test
public void testSelectByBatchId(){
List<User> users = userMapper.selectBatchIds(Arrays.asList(1,2,3));
users.forEach(System.out::println);
}
// 条件查询之一map查询
@Test
public void testSelectByMap(){
HashMap<String,Object> map = new HashMap<>();
map.put("name","Ye");
List<User> users = userMapper.selectByMap(map);
users.forEach(System.out::println);
}
最后一个查询的结果:
5、分页查询
1. 在配置类加入如下代码
// 分页拦截器
@Bean
public PaginationInterceptor paginationInnerInterceptor() {
return new PaginationInterceptor();
}
2. 测试
@Test
public void testPaginationInterceptor(){
// 参数一: 当前页
// 参数二: 页面大小
Page<User> page = new Page<>(2,2);
userMapper.selectPage(page,null);
page.getRecords().forEach(System.out::println);
}
结果:
6、三个删除方法
// 通过id删除
@Test
public void testDeleteById(){
userMapper.deleteById(1L);
}
// 批量删除
@Test
public void testDeleteByBatchId(){
userMapper.deleteBatchIds(Arrays.asList(1,2,3));
}
// 条件删除之一map删除
@Test
public void testDeleteByMap(){
HashMap<String,Object> map = new HashMap<>();
map.put("name","Ye");
userMapper.deleteByMap(map);
}
最后一个删除的结果:
7、逻辑删除
1. 在实体类中加入 @TableLogic注解
注意数据库中必须有对应的字段
@TableLogic //逻辑删除
private Integer deleted;
2. 添加配置
配置文件
### 配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
配置类
// 逻辑删除组件
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}
3. 测试
虽然还是一个的删除方法,但是实际上使用的是逻辑删除
// 通过id删除
@Test
public void testDeleteById(){
userMapper.deleteById(1L);
}
结果:
再测试查询
// 通过id查询
@Test
public void testSelectById(){
User user = userMapper.selectById(1L);
System.out.println(user);
}
结果:
逻辑删除后就查询不到了,但是数据库还有这条数据。