Spring-boot整合Mybatis-Plus

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



}

实例代码:点击进去

猜你喜欢

转载自blog.csdn.net/qq_26641781/article/details/80350430