天天看点

MyBatis_Plus的插件操作、CRUD扩展

MyBatis_Plus的插件操作、CRUD扩展

config

分页插件

//分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
           

sql执行效率插件

/**
     * SQL执行效率插件
     */
    @Bean
    @Profile({"dev","test"})// 设置 dev test 环境开启
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor=new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(1000);//ms为单位,设置sql执行的最大时间,如果超过了规定的时间就会抛出异常
        performanceInterceptor.setFormat(true);
        return new PerformanceInterceptor();
    }
           

乐观锁插件

//注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
           

Test测试类

//测试乐观锁成功 ,单线程下
    @Test
    public void testOptimisticLocker(){
        //查询用户信息
        User user =userMapper.selectById(1L);
        //修改用户信息
        user.setName("张撒气");
        user.setEmail("[email protected]");
        //执行更新操作
        int s = userMapper.updateById(user);
        System.out.println(s);
    }
           
@Test
    //测试乐观锁失败 多线程下
    public void testOptimisticLocker2(){
        //线程1
        //查询用户信息
        User user =userMapper.selectById(1L);
        //修改用户信息
        user.setName("sjsad");
        user.setEmail("[email protected]");

        //执行更新操作,模拟另外一个线程进行了插队操作
        User user2 =userMapper.selectById(1L);
        //修改用户信息
        user2.setName("李斯");
        user2.setEmail("[email protected]");
        int s = userMapper.updateById(user2);

        int a=userMapper.updateById(user);//如果没有乐观锁就会覆盖插对线程的值
        System.out.println(s);
    }
           
//测试查询
    @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 testselectByBatchIds(){
        HashMap<String,Object> map=new HashMap<>();
        //自定义要查询的.多条件查询
        map.put("name","李斯");
        map.put("age","20");
        List<User> users = userMapper.selectByMap(map);
        users.forEach(System.out::println);
    }
           
//测试分页查询
    @Test
    public void testPage(){
        Page<User> page = new Page<>(1,5);//参数以:第一页,参数二:每页5条信息
        userMapper.selectPage(page,null);
        page.getRecords().forEach(System.out::println);
        System.out.println("一共多少条"+page.getTotal());//总共多少条
        System.out.println("是否有上一页"+page.hasPrevious());//是否有上一页
        System.out.println("是否有下一页"+page.hasNext());//是否有下一页
        System.out.println("得到他的大小"+page.getSize());//得到它的大小
        System.out.println("得到当前参数"+page.getCurrent());//得到当前参数
        System.out.println("获得所有的记录"+page.getRecords());//获得所有的记录

    }
    
           
//自动处理时间格式,自动填充

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    //插入时自动填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
    this.setFieldValByName("createTime",new Date(),metaObject);
    this.setFieldValByName("updateTime",new Date(),metaObject);
    }
    //更新时自动插入策略
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}
           

pom.xml:

<properties>
    <java.version>1.8</java.version>
</properties>
<!--数据库驱动-->
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!--lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <!--mybatis-plus-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.0.5</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
           

application.yml

server:
  port: 8080
#数据库链接配置
spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
#  sql执行效率,执行的慢报错
  profiles:
    active: dev

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: flag  #全局逻辑删除字段值 3.3.0开始支持,详情看下面。
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

#日志
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
           

MyBatisPlus里的

MyBatis_Plus的插件操作、CRUD扩展
//wrapper的
@SpringBootTest
public class WrapperTest {
    @Autowired
    private UserMapper userMapper;
    
           
@Test
    void contextLoads(){
        //查询name不为空的用户i,并且邮箱不为空的用户,年龄大于12
        QueryWrapper<User> wrapper=new QueryWrapper<User>();//和map相似
        wrapper.isNotNull("name");
        wrapper.isNotNull("email");
        wrapper.ge("age",12);
        userMapper.selectList(wrapper).forEach(System.out::println);
    }
           
@Test
    void test2(){
        //查询名字
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("name","李斯");//查询一个数据,多个数据使用list、map
        User user = userMapper.selectOne(wrapper);
        System.out.println(user);
    }
           
@Test
    void test3(){
        //查询年龄在20-30之间的
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.between("age","20",30);//区间
        Integer count = userMapper.selectCount(wrapper);//查询结果数
        System.out.println("结果"+count);
    }

           
@Test
    void test4(){
        //模糊查询
        //名字里面不包含e,且邮箱号以t开头 t%
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.notLike("name","e");
        wrapper.likeRight("email","t");
        List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
        maps.forEach(System.out::println);
    }
           
@Test
    void test5(){
        //模糊查询
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //id在子查询中查询出来,拼接sql
        wrapper.inSql("id","select id from user where id<3");
        List<Object> objects = userMapper.selectObjs(wrapper);
        objects.forEach(System.out::println);
    }
           
@Test
    void test6(){
        //排序
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //通过id进行降序排序orderByDesc("id");
        wrapper.orderByAsc("id");//升序排序
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }