Mybatis-plus学习笔记

Mybatis-plus是mp的增强工具,在mybatis的基础上只做增强,为简化开发。提高效率而生

创建包mapper编写mapper接口:

public interface UserMapper extends BaseMapper<User>{  }

测试使用:
@RunWith(SpringRunner.class)

@SpringBootTest

public class MybatisPlusApplication{

@Autowired

private UserMapper usermapper;

@Test

public void test(){

    //UserMapper中的selectList()方法的参数为mp内置的条件封装器wrapper

    List<User> users=useMapper.selectList(null);

    users.foeEach(System.out::println);

}

}

通过调用mp封装的工具,就可轻易的实现CURD功能,连xml文件都不用编写

配置日志

查看sql输出日志

配置文件里写:

   mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

CRUD接口:

一.插入操作

User user=new User();

user.setName(“helen”);

user.setAge(18);

user.setEmail(“xxx@qq.com”);

int result=usermapper.insert(user);

System.out.println(result);

System.out.println(user);

注:数据库插入id值默认为全局唯一id

  1. 主键策略
  1. ID_WORKER

      MyBatis-Plus默认的主键策略,全局唯一id

  1. 自增策略

要想主键自增需要配置如下主键策略

需要在创建表的时候设置主键自增

实体字段中配置数据表的时候设置主键自增

实体字段中配置@TableId(type=IdType.AUTO)

要想影响所有实体的配置,可以设置全局配置

mybatis——plus.global-config.db-config.id-type=auto

  • update
  1. 根据id更新操作

   int result=userMapper.updateId(user);

  1. 自动填充

项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间

(1)数据库表中添加自动填充字段

在User表中添加datetime类型的字段create_time  update_time

  1. 实体类添加注解

     @TableField(fill=FieldFill.INSERT_UPDATE)

     private Date createTime;

  1. 实现元对象处理器接口

@Component

public class MyMetaObjectHandler implements MetaObjectHandler{

     private static final Logger LOGGER =loggerFactory.getLogger(MyMetaObjectHandler.class);

     

@Override

public void insertFill(MetaObject metaObject){

LOGGER.info(“start insert fill...”);

this.setFieldValByName(“createTime”,new Date(),metaObject);

this.setFieldValByName(“updateTime”,new Date(),metaObject);

}

@Override

public void updateFill(MetaObject metaObject){

LOGGER.info(“start update fill...”);

this.setFieldValByName(“updateTime”,new Date(),metaObject);

}

}

  1. 乐观锁

适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新

实现方式:取出记录时,获取当前version

更新时,带上这个version

执行更新时,set version=newVersion where version=oldVersion

如果version不对,更新失败

  1. 数据库中添加version字段
  2. 实体类添加version字段,并添加上@Version注解
  3. 元对象处理接口添加version的insert默认值

@Override

public void insertFill(MetaObject metaObject) {

    ......

    this.setFieldValByName("version", 1, metaObject);

}

注:支持的数据类型只有int,Integer,long,Date,Timestamp,LocalDateTime

整数类型下newVersion=oldVersion+1

newVersion会写会entity中

仅支持updateById(id)与update(entity,wrapper)方法

在update(entity,wrapper)方法写,wrapper不能复用

  1. 在 MybatisPlusConfig中注册Bean

@EnableTransactionManagement

@Configuration

@MapperScan("com.xxx.mybatis_plus.mapper")

public class MybatisPlusConfig {

    /**

     * 乐观锁插件

     */

    @Bean

    public OptimisticLockerInterceptor optimisticLockerInterceptor() {

        return new OptimisticLockerInterceptor();

    }

}

  • select
  1. 根据id查询记录

User user = userMapper.selectById(1L);

  1. 通过多个id批量查询

List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));

users.forEach(System.out::println);

  1. 简单的条件查询

HashMap<String, Object> map = new HashMap<>();

map.put("name", "Helen");

map.put("age", 18);

List<User> users = userMapper.selectByMap(map);

users.forEach(System.out::println);

注意:map中的key对应的是数据库中的列名

  1. 分页

MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能

(1)创建配置类

此时可以删除主类中的 @MapperScan 扫描注解

/**

 * 分页插件

 */

@Bean

public PaginationInterceptor paginationInterceptor() {

    return new PaginationInterceptor();

}

(2)测试selectPage分页

测试:最终通过page对象获取相关数据

@Test

public void testSelectPage() {

    Page<User> page = new Page<>(1,5);

    userMapper.selectPage(page, null);

    page.getRecords().forEach(System.out::println);

    System.out.println(page.getCurrent());

    System.out.println(page.getPages());

    System.out.println(page.getSize());

    System.out.println(page.getTotal());

    System.out.println(page.hasNext());

    System.out.println(page.hasPrevious());

}

(3)测试selectMapsPage分页:结果集是Map

@Test

public void testSelectMapsPage() {

    Page<User> page = new Page<>(1, 5);

    IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, null);

    //注意:此行必须使用 mapIPage 获取记录列表,否则会有数据类型转换错误

    mapIPage.getRecords().forEach(System.out::println);

    System.out.println(page.getCurrent());

    System.out.println(page.getPages());

    System.out.println(page.getSize());

    System.out.println(page.getTotal());

    System.out.println(page.hasNext());

    System.out.println(page.hasPrevious());

}

  • delete
  1. 根据id查询记录

int result = userMapper.deleteById(8L);

  1. 批量删除

int result = userMapper.deleteBatchIds(Arrays.asList(8, 9, 10));

  1. 简单的条件查询删除

    HashMap<String, Object> map = new HashMap<>();

    map.put("name", "Helen");

    map.put("age", 18);

    int result = userMapper.deleteByMap(map);

    System.out.println(result);

  1. 逻辑删除

物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据

逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据 记录

  1. 据库中添加 deleted字段    实体类添加deleted 字段
  2. 并加上 @TableLogic 注解 和 @TableField(fill = FieldFill.INSERT) 注解

(3)元对象处理器接口添加deleted的insert默认值

@Override

public void insertFill(MetaObject metaObject) {

    ......

    this.setFieldValByName("deleted", 0, metaObject);

}

4)在 MybatisPlusConfig 中注册 Bean

@Bean

public ISqlInjector sqlInjector() {

    return new LogicSqlInjector();

}

5)测试逻辑删除

测试后发现,数据并没有被删除,deleted字段的值由0变成了1

测试后分析打印的sql语句,是一条update

注意:被删除数据的deleted 字段的值必须是 0,才能被选取出来执行逻辑删除的操作

  • 性能分析

性能分析拦截器,用于输出每条 SQL 语句及其执行时间

SQL 性能执行分析,开发环境使用,超过指定时间,停止运行。有助于发现问题

1、配置插件

(1)参数说明

参数:maxTime: SQL 执行最大时长,超过自动停止运行,有助于发现问题。

参数:format: SQL是否格式化,默认false。

(2)在 MybatisPlusConfig 中配置

/**

 * SQL 执行性能分析插件

 * 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长

 */

@Bean

@Profile({"dev","test"})// 设置 dev test 环境开启

public PerformanceInterceptor performanceInterceptor() {

    PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();

    performanceInterceptor.setMaxTime(100);//ms,超过此处设置的ms则sql不执行

    performanceInterceptor.setFormat(true);

    return performanceInterceptor;

}

(3)Spring Boot 中设置dev环境

#环境设置:dev、test、prod

spring.profiles.active=dev

可以针对各环境新建不同的配置文件application-dev.properties、application-test.properties、application-prod.properties

也可以自定义环境名称:如test1、test2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值