初学Mybatis-Plus,分页,id生成策略,慢SQL监控

Mybatis-Plus是Mybatis的增强版,只做增强不做改变。

官网链接:https://mp.baomidou.com/guide/quick-start.html#初始化工程

跟着狂神学JAVA!!!

  1. 创建一个springboot项目,搭建maven环境
     <!-- mybatis-plus -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.0.5</version>
            </dependency>

     

  2. 创建一张user表,-- 真实开发中,version(乐观锁)、deleted(逻辑删除)、gmt_create(添加时间)、gmt_modified(跟新时间),阿里的命名规范,我还是喜欢用createTime,updateTime。

    DROP TABLE IF EXISTS user; CREATE TABLE user ( id BIGINT(20) NOT NULL COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT(11) NULL DEFAULT NULL COMMENT '年龄', email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (id) );INSERT INTO user (id, name, age, email) VALUES (1, 'Jone', 18, 'test1@baomidou.com'), (2, 'Jack', 20, 'test2@baomidou.com'), (3, 'Tom', 28, 'test3@baomidou.com'), (4, 'Sandy', 21, 'test4@baomidou.com'), (5, 'Billie', 24, 'test5@baomidou.com');

     

  3. 配置数据库连接

        # 此处需注意 高版本虽会兼容低版本
        # mysql 5 驱动不同 com.mysql.jdbc.Driver 
        # mysql 8 驱动不同com.mysql.cj.jdbc.Driver、需要增加时区的配置 serverTimezone=GMT%2B8
        url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8

     

  4. 使用lombok创建实体类,创建userMapper接口并继承BaseMapper<实体类泛型>

    // 在对应的Mapper上面继承基本的类 BaseMapper
    @Repository // 此注解表示为是一个持久层
    public interface UserMapper extends BaseMapper<User> {
        // 所有的CRUD操作都已经编写完成了
        // 你不需要像以前的配置一大堆文件了!
    }

     

  5. 使用junit单元测试,依赖注入userMapper,测试一些简单查询,分页需要添加分页组件,详细见下面配置

    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    import com.lee.entity.User;
    import com.lee.mapper.UserMapper;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    
    @SpringBootTest
    class MybatisPlusApplicationTests {
    
        // 继承了BaseMapper,所有的方法都来自己父类 // 我们也可以编写自己的扩展方法!
        @Autowired
        private UserMapper userMapper;
    
        // 测试查询
        @Test
        void contextLoads() {
    
            List<User> users = userMapper.selectList(null);
            users.forEach(System.out::println);
        }
    
        // 测试添加
        @Test
        void insert() {
            User user = new User();
            user.setName("Java EE");
            user.setAge(3);
            user.setEmail("24736743@qq.com");
    
            int result = userMapper.insert(user);// 帮我们自动生成id 默认为雪花算法
            System.out.println(user);
        }
    
        // 测试修改
        @Test
        public void testUpdate() {
            User user = new User();
            // 通过条件自动拼接动态sql
            user.setId(1369464226286055426L);
            user.setName("JAVA WEB");
            user.setAge(18);
    
            // 注意:updateById 但是参数是一个 对象!
            int i = userMapper.updateById(user);
            System.out.println(i);
        }
    
        // 测试乐观锁成功!
        @Test
        public void testOptimisticLocker() {
            // 1、查询用户信息
            User user = userMapper.selectById(1L);
            // 2、修改用户信息
            user.setName("kuangshen");
            user.setEmail("24736743@qq.com");
            // 3、执行更新操作
            userMapper.updateById(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", "狂神说Java");
            map.put("age", 3);
            List<User> users = userMapper.selectByMap(map);
            users.forEach(System.out::println);
        }
    
        // 测试分页查询
        @Test
        public void testPage() {
            // 参数一:当前页 , 参数二:页面大小
            Page<User> page = new Page<>(1, 5);
            userMapper.selectPage(page, null);
            page.getRecords().forEach(System.out::println);
            System.out.println(page.getTotal());
        }
    
        // 测试删除
        @Test
        void testDeleteById() {
            userMapper.deleteById(1369464226286055425L);
        }
    
        // 通过id批量删除
        @Test
        public void testDeleteBatchId() {
            userMapper.deleteBatchIds(Arrays.asList(1369464226286055425L, 1369464226286055426L));
        }
    
        // 通过map删除
        @Test
        public void testDeleteMap() {
            HashMap<String, Object> map = new HashMap<>();
            map.put("name", "狂神说Java");
            userMapper.deleteByMap(map);
        }
    
    
    
    
    }

     

  6. 条件构造器查询

    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.baomidou.mybatisplus.core.metadata.IPage;
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    import com.lee.entity.User;
    import com.lee.mapper.UserMapper;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import java.util.List;
    
    @SpringBootTest
    public class WrapperTest {
    
        @Autowired
        private UserMapper userMapper;
        /**
         *
         *  使用 Wrapper条件构造器
         *
         */
    
        @Test
        void contextLoads() {
            // 万物皆对象 创建条件构造器
            QueryWrapper<User> wrapper = new QueryWrapper<>();
            // 查询name不为空的用户,并且邮箱不为空的用户,年龄大于等于12
            wrapper.isNotNull("name").isNotNull("email").ge("age",12);// 支持链式调用
            userMapper.selectList(wrapper).forEach(System.out::println);
        }
        @Test
        void test2(){
            QueryWrapper<User> wrapper = new QueryWrapper<>();
            // 查询指定名字
            wrapper.eq("name","我真的好帅呀");
            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(){
            // 模糊查询
            QueryWrapper<User> wrapper = new QueryWrapper<>();
            wrapper.like("name","王");
            List<User> users = userMapper.selectList(wrapper);
            users.forEach(System.out::println);
        }
        @Test
        void test5(){
            // 子查询
            QueryWrapper<User> wrapper = new QueryWrapper<>();
            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<>();
            wrapper.orderByAsc("id","age");// 此处是可变长参数
            List<User> users = userMapper.selectList(wrapper);
            users.forEach(System.out::println);
        }
        @Test
        void test7(){
            // 分页  并查询name不等于狂神说Java的
            QueryWrapper<User> wrapper = new QueryWrapper<>();
            wrapper.ne("name","狂神说Java");
            Page<User> userPage = new Page<>(1,10);// 分页page对象
            IPage<User> userIPage = userMapper.selectPage(userPage, wrapper);
            List<User> records = userIPage.getRecords();
            records.forEach(System.out::println);
            System.out.println("总条数"+userIPage.getTotal());
            System.out.println("总页数"+userIPage.getPages());
    
        }
    
    }
    

     

  7. mybatis-plus 组件 

    import com.baomidou.mybatisplus.core.injector.ISqlInjector;
    import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
    import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
    
    import lombok.extern.slf4j.Slf4j;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Profile;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    @MapperScan("com.lee.mapper")
    @EnableTransactionManagement // 开启事务支持
    @Configuration // 配置类
    @Slf4j
    public class MyBatisPlusConfig {
    
        // 注册乐观锁插件
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor() {
            return new OptimisticLockerInterceptor();
        }
    
        // 分页插件
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            return new PaginationInterceptor();
        }
    
        // 逻辑删除组件!
        @Bean
        public ISqlInjector sqlInjector() {
            return new LogicSqlInjector();
        }
    
        /**
         * SQL执行效率插件
         */
        @Bean
        @Profile({"dev", "test"})
        // 设置 dev test 环境开启,保证我们的效率
        public PerformanceInterceptor performanceInterceptor() {
            PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
            performanceInterceptor.setMaxTime(100);
            // ms设置sql执行的最大时间,如果超过了则不 执行
            performanceInterceptor.setFormat(true);
            // 获取执行时间
            long maxTime = performanceInterceptor.getMaxTime();
            if (maxTime > 20){
                log.info(ConsoleColors.RED_BOLD+"发现一条慢sql!!!"+ConsoleColors.RESET);
            }
            // 是否格式化代码
            return performanceInterceptor;
        }
    }

     

  8. 创建时间,更新时间的填充策略

    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);
        }
    }

     

  9. 实体类注解

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
    
    
        @TableId(type = IdType.AUTO) // 设置id生成策略 一共六种 自增,无主键,手动输入,雪花算法(全局唯一),UUID(全局唯一),全局唯一String形式
    
        // 雪花算法 :
        // 其核心思想是:使用41bit作为
        // 毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味
        // 着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。可以保证几乎全球唯一!
        private Long id;
        
        private String name;
        private Integer age;
        private String email;
    
        @TableField(fill = FieldFill.INSERT) // 字段添加填充内容
        private Date createTime;
    
        @TableField(fill = FieldFill.UPDATE) // 字段修改填充内容
        private Date updateTime;
    
        @Version //乐观锁Version注解
        private Integer version;
    
        @TableLogic //逻辑删除
        private Integer deleted;
    }

      

  10. 控制台输出日志颜色代码

    public class ConsoleColors {
        // Reset
        public static final String RESET = "\033[0m";  // Text Reset
    
        // Regular Colors
        public static final String WHITE = "\033[0;30m";   // WHITE
        public static final String RED = "\033[0;31m";     // RED
        public static final String GREEN = "\033[0;32m";   // GREEN
        public static final String YELLOW = "\033[0;33m";  // YELLOW
        public static final String BLUE = "\033[0;34m";    // BLUE
        public static final String PURPLE = "\033[0;35m";  // PURPLE
        public static final String CYAN = "\033[0;36m";    // CYAN
        public static final String GREY = "\033[0;37m";   // GREY
    
        // Bold
        public static final String WHITE_BOLD = "\033[1;30m";  // WHITE
        public static final String RED_BOLD = "\033[1;31m";    // RED
        public static final String GREEN_BOLD = "\033[1;32m";  // GREEN
        public static final String YELLOW_BOLD = "\033[1;33m"; // YELLOW
        public static final String BLUE_BOLD = "\033[1;34m";   // BLUE
        public static final String PURPLE_BOLD = "\033[1;35m"; // PURPLE
        public static final String CYAN_BOLD = "\033[1;36m";   // CYAN
        public static final String GREY_BOLD = "\033[1;37m";  // GREY
    
        // Underline
        public static final String WHITE_UNDERLINED = "\033[4;30m";  // WHITE
        public static final String RED_UNDERLINED = "\033[4;31m";    // RED
        public static final String GREEN_UNDERLINED = "\033[4;32m";  // GREEN
        public static final String YELLOW_UNDERLINED = "\033[4;33m"; // YELLOW
        public static final String BLUE_UNDERLINED = "\033[4;34m";   // BLUE
        public static final String PURPLE_UNDERLINED = "\033[4;35m"; // PURPLE
        public static final String CYAN_UNDERLINED = "\033[4;36m";   // CYAN
        public static final String GREY_UNDERLINED = "\033[4;37m";  // GREY
    
        // Background
        public static final String WHITE_BACKGROUND = "\033[40m";  // WHITE
        public static final String RED_BACKGROUND = "\033[41m";    // RED
        public static final String GREEN_BACKGROUND = "\033[42m";  // GREEN
        public static final String YELLOW_BACKGROUND = "\033[43m"; // YELLOW
        public static final String BLUE_BACKGROUND = "\033[44m";   // BLUE
        public static final String PURPLE_BACKGROUND = "\033[45m"; // PURPLE
        public static final String CYAN_BACKGROUND = "\033[46m";   // CYAN
        public static final String GREY_BACKGROUND = "\033[47m";  // GREY
    
        // High Intensity
        public static final String WHITE_BRIGHT = "\033[0;90m";  // WHITE
        public static final String RED_BRIGHT = "\033[0;91m";    // RED
        public static final String GREEN_BRIGHT = "\033[0;92m";  // GREEN
        public static final String YELLOW_BRIGHT = "\033[0;93m"; // YELLOW
        public static final String BLUE_BRIGHT = "\033[0;94m";   // BLUE
        public static final String PURPLE_BRIGHT = "\033[0;95m"; // PURPLE
        public static final String CYAN_BRIGHT = "\033[0;96m";   // CYAN
        public static final String GREY_BRIGHT = "\033[0;97m";  // GREY
    
        // Bold High Intensity
        public static final String WHITE_BOLD_BRIGHT = "\033[1;90m"; // WHITE
        public static final String RED_BOLD_BRIGHT = "\033[1;91m";   // RED
        public static final String GREEN_BOLD_BRIGHT = "\033[1;92m"; // GREEN
        public static final String YELLOW_BOLD_BRIGHT = "\033[1;93m";// YELLOW
        public static final String BLUE_BOLD_BRIGHT = "\033[1;94m";  // BLUE
        public static final String PURPLE_BOLD_BRIGHT = "\033[1;95m";// PURPLE
        public static final String CYAN_BOLD_BRIGHT = "\033[1;96m";  // CYAN
        public static final String GREY_BOLD_BRIGHT = "\033[1;97m"; // GREY
    
        // High Intensity backgrounds
        public static final String WHITE_BACKGROUND_BRIGHT = "\033[0;100m";// WHITE
        public static final String RED_BACKGROUND_BRIGHT = "\033[0;101m";// RED
        public static final String GREEN_BACKGROUND_BRIGHT = "\033[0;102m";// GREEN
        public static final String YELLOW_BACKGROUND_BRIGHT = "\033[0;103m";// YELLOW
        public static final String BLUE_BACKGROUND_BRIGHT = "\033[0;104m";// BLUE
        public static final String PURPLE_BACKGROUND_BRIGHT = "\033[0;105m"; // PURPLE
        public static final String CYAN_BACKGROUND_BRIGHT = "\033[0;106m";  // CYAN
        public static final String GREY_BACKGROUND_BRIGHT = "\033[0;107m";   // GREY
    }

     

  11. 大部分就完了,可以结合官方文档一起学习!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值