本文共 6203 字,大约阅读时间需要 20 分钟。
简称MP,是一个MyBatis的增强工具,在原有的基础上只做增强不做改变,为简化开发,提升效率而生
特点
创建springboot 2.0以上版本(版本在2.0以下的,jdbc中的配置数据会有所不同,具体之后会说明),创建数据库,mybatis_plus 包含相关的字段(id,name,age,email)
org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine com.baomidou mybatis-plus-boot-starter 3.3.1 mysql mysql-connector-java org.projectlombok lombok true
import lombok.Data;@Datapublic class User { // 在添加lombok插件后,使用data注解,省去get,set private Long id; private String name; private Integer age; private String email;}
//核心代码,让UserMapper继承内置的BaseMapper (内置CRUD方法)@Repositorypublic interface UserMapper extends BaseMapper{ }
BaseMapper中自带了CRUD方法
//// Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//package com.baomidou.mybatisplus.core.mapper;import com.baomidou.mybatisplus.core.conditions.Wrapper;import com.baomidou.mybatisplus.core.metadata.IPage;import java.io.Serializable;import java.util.Collection;import java.util.List;import java.util.Map;import org.apache.ibatis.annotations.Param;public interface BaseMapperextends Mapper { int insert(T entity); int deleteById(Serializable id); int deleteByMap(@Param("cm") Map columnMap); int delete(@Param("ew") Wrapper wrapper); int deleteBatchIds(@Param("coll") Collection idList); int updateById(@Param("et") T entity); int update(@Param("et") T entity, @Param("ew") Wrapper updateWrapper); T selectById(Serializable id); List selectBatchIds(@Param("coll") Collection idList); List selectByMap(@Param("cm") Map columnMap); T selectOne(@Param("ew") Wrapper queryWrapper); Integer selectCount(@Param("ew") Wrapper queryWrapper); List selectList(@Param("ew") Wrapper queryWrapper); List
@MapperScan("com.zeus.demomp.mapper")public class DemompApplication { public static void main(String[] args) { SpringApplication.run(DemompApplication.class, args); }}
然后在test目录下进行测试,首先添加自动注入@AutoWired将UserMapper注入,编写查找所有的测试方法
class DemompApplicationTests { @Autowired private UserMapper userMapper; @Test //查找全部 public void fillAll() { Listusers = userMapper.selectList(null); System.out.println(users); }}
结果如图:
这里引用了lombok进行实体的简化,省去get,set方法等等
在Spring版本不同,jdbc配置信息区别@Test public void insert(){ User user=new User(); user.setName("niuzai"); user.setAge(12); user.setEmail("231231@qq.com"); //返回影响行数 int i = userMapper.insert(user); System.out.println(i); }
特别注意,在MP中主键生成的策略
也可以使用在实体类中的id上做注解配置主键生成策略
@TableId(type=IdType.XXX) 例如 ASSIGN_ID 自动分配19位的id ASSIGN_UUID AUTO 自动增长 INPUT 自己输入@Test public void updateByID(){ User user=new User(); user.setId(1385515096112947202L); user.setName("niushi"); int i = userMapper.updateById(user); System.out.println(i); }
自动填充
为了测试,先在数据库的表中添加create_time ,update_time字段
@TableField(fill = FieldFill.INSERT ) private Date createTime;@TableField(fill=FieldFill.INSERT_UPDATE) private Date updateTime;
然后创建类,实现接口添加两个方法,重写MetaObjectHandler中的insertFill和updateFill
@Componentpublic class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { //mp执行添加操作时自动填充往create_time字段中添加时间 this.setFieldValByName("createTime",new Date(),metaObject); } @Override public void updateFill(MetaObject metaObject) { //mp执行更新和添加时都要自动填充时间,因为在user实体类中进行了相关操作 this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); }
主要适用场景:当更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新;
乐观锁实现方式:
取出记录时,获取当前的version,更新时,带上version,执行更新时,set version= new Version where version =old version 如果版本不对,就更新失败。补充:使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。
实现案例
@Version private Integer version;
@Override public void insertFill(MetaObject metaObject) { //mp执行添加操作时自动填充往create_time字段中添加时间 this.setFieldValByName("createTime",new Date(),metaObject); //添加数据时默认数据版本为1 this.setFieldValByName("version",1,metaObject); }
@Configuration@MapperScan("com.zeus.demomp.mapper")public class MpConfig { //配置乐观锁插件 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor(){ return new OptimisticLockerInterceptor(); }}
public void testOptimisticLocker(){ //先通过查询 User user = userMapper.selectById(1385609705744887809L); //再修改值 user.setName("LG"); //进行更新操作 userMapper.updateById(user); }
转载地址:http://uacu.baihongyu.com/