SpringBoot整合Mybatis-Plus

作者: Radom7 | 来源:发表于2019-02-12 12:30 被阅读230次

    Mybatis-Plus简介:

    Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。官方文档:Mybatis-Plus入口

    特性

    • 无侵入:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对您现有的 Mybatis 构架产生任何影响,而且 MP 支持所有 Mybatis 原生的特性
    • 依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring
    • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
    • 预防Sql注入:内置 Sql 注入剥离器,有效预防Sql注入攻击
    • 通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
    • 多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题
    • 支持热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
    • 支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作
    • 支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator 更加强大!)
    • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
    • 支持关键词自动转义:支持数据库关键词(order、key......)自动转义,还可自定义关键词
    • 内置分页插件:基于 Mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询
    • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询
    • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作

    备注:这里只是简单的demo学习,官方也有具体的demo,看个人喜好,这里自己写通俗点。

    Spring-boot整合Mybatis-Plus

    加入Mybatis-Plus坐标:

                <dependency>
                    <groupId>com.baomidou</groupId>
                    <artifactId>mybatis-plus-boot-starter</artifactId>
                    <version>2.2.0</version>
                </dependency>
    

    官方用的是DB2数据源,这里使用的mysql数据源,在application.yml配置文件配置数据源,同时加入Mybatis-Plus配置,关于Mybatis-Plus配置。可以查看具体的官方文档

    spring:
      datasource:
        url: jdbc:mysql://127.0.0.1:3306/test
        data-username: root
        data-password: root
        driver-class-name: com.mysql.jdbc.Driver
    
    
    #mybatis
    mybatis-plus:
      # 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
      # 如果是放在resource目录 classpath:/mapper/*Mapper.xml
      mapper-locations: classpath:/mapper/*Mapper.xml
      global-config:
         #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
        id-type: 2
         #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
        field-strategy: 2
         #刷新mapper 调试神器
        refresh-mapper: true
         #逻辑删除配置(下面3个配置)
        logic-delete-value: 0
        logic-not-delete-value: 1
        sql-parser-cache: true
      configuration:
       #配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId) 
        map-underscore-to-camel-case: true
        cache-enabled: false
    

    当然还可以Java Configuration配置:

    @Configuration
    @MapperScan("com.lin.mapper*")
    public class MybatisPlusConfig {
        /**
         * mybatis-plus SQL执行效率插件【生产环境可以关闭】
         */
        @Bean
        public PerformanceInterceptor performanceInterceptor() {
            return new PerformanceInterceptor();
        }
    
    
        @Bean
        public MetaObjectHandler metaObjectHandler(){
            return new MyMetaObjectHandler();
        }
    
        /**
         * 分页插件
         */
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            return new PaginationInterceptor();
        }
    
        /**
         * 注入sql注入器
         */
        @Bean
        public ISqlInjector sqlInjector(){
            return new LogicSqlInjector();
        }
    
    }
    
    

    entity层就不说了,直接dao层,继承官方的BaseMapper接口,里面已经帮我们写好了很多CRUD方法,同时可以自定义方法:


    这里写图片描述
    public interface UserMapper extends BaseMapper<User> {
        int deleteAll();
    
        @SqlParser(filter = true)
        @Select("select id , name, age from user")
        List<User> selectListBySQL();
    
        List<User> selectUserList(Pagination page);
    
    }
    

    相对应的mapper.xml:

    <mapper namespace="com.lin.mapper.UserMapper">
    
        <!-- 通用查询结果列 -->
        <sql id="Base_Column_List">
            id , name, age
        </sql>
    
        <delete id="deleteAll">
            DELETE FROM USER
        </delete>
        <select id="selectUserList" resultType="com.lin.entity.User">
             SELECT * FROM user
        </select>
    
    </mapper>
    

    Service层:

    @Service
    public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    
    
        @Override
        public boolean deleteAll() {
            return retBool(baseMapper.deleteAll());
        }
    
        @Override
        public List<User> selectListBySQL() {
            return baseMapper.selectListBySQL();
        }
    
        public Page<User> selectUserPage(Page<User> page) {
            // 不进行 count sql 优化,解决 MP 无法自动优化 SQL 问题
            // page.setOptimizeCountSql(false);
            // 不查询总记录数
            // page.setSearchCount(false);
    
            return page.setRecords(baseMapper.selectUserList(page));
        }
    }
    

    Controller层:

    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        /**
         * 分页 PAGE
         */
        @GetMapping("/test")
        public Page<User> test() {
            return userService.selectPage(new Page<User>(0, 3));
        }
    
        @GetMapping("/test1")
        public Boolean test1() {
            return userService.deleteAll();
        }
    
    
        /**
         * 增删改查 CRUD
         */
        @GetMapping("/test2")
        public User test2() {
    
            User user = new User();
            user.setId(1);
            user.setName("jack");
            user.setAge(16);
            boolean result = userService.insert(user);
            int id = user.getId();
            System.err.println("插入一条数据:" + result + ", 插入信息:" + user.toString());
            System.err.println("查询:" + userService.selectById(id).toString());
            System.err.println("更新一条数据:" + userService.updateById(new User(1, "alice", 18)));
            for (int i = 0; i < 5; ++i) {
                userService.insert(new User( "jack" + i, 1));
            }
            Page<User> userListPage = userService.selectPage(new Page<User>(1, 3));
            System.err.println("total=" + userListPage.getTotal() + ", current list size=" + userListPage.getRecords().size());
            return userService.selectById(1);
        }
    
    
        @GetMapping("/test3")
        public User test3() {
            User user = new User(1, "jason",  16);
            System.out.println("插入前:" + user.toString());
            userService.insertOrUpdate(user);
            user = userService.selectById(1);
            System.out.println("更新后:" + user.toString());
            return user;
        }
    
    
        /**
         * 测试实体注解注入条件 LIKE 查询
         */
        @GetMapping("/like")
        public Object like() {
            JSONObject result = new JSONObject();
            User user = new User();
            user.setName("j");
            result.put("result", userService.selectList(new EntityWrapper<User>(user)));
            return result;
        }
    
        @GetMapping("/add")
        public Object addUser() {
            User user = new User("xiaomi",  1);
            JSONObject result = new JSONObject();
            result.put("result", userService.insert(user));
            return result;
        }
    
        @GetMapping("/selectsql")
        public Object getUserBySql() {
            JSONObject result = new JSONObject();
            result.put("records", userService.selectListBySQL());
            return result;
        }
    
        /**
         * 7、分页 size 一页显示数量  current 当前页码
         * 方式一:http://localhost:8080/user/page?size=1&current=1<br>
         * 方式二:http://localhost:8080/user/pagehelper?size=1&current=1<br>
         */
    
        // 参数模式分页
        @GetMapping("/page")
        public Object page(Page page) {
            return userService.selectPage(page);
        }
    
    
        @GetMapping("/pages")
        public Object selectUserPage(Page<User> page){
            return userService.selectUserPage(page);
        }
    
    
        // ThreadLocal 模式分页
        @GetMapping("/pagehelper")
        public Object pagehelper(Page page) {
            PageHelper.setPagination(page);
            page.setRecords(userService.selectList(null));
            page.setTotal(PageHelper.freeTotal());//获取总数并释放资源 也可以 PageHelper.getTotal()
            return page;
        }
    
    
    
    }
    
    

    相关文章

      网友评论

        本文标题:SpringBoot整合Mybatis-Plus

        本文链接:https://www.haomeiwen.com/subject/jgnheqtx.html