springboot 2.0 教程-13-mybatis增强mybatis-plus

阅读原文:https://blog.bywind.cn/articles/2018/11/28/1543373589258.html
视频教程:https://www.bilibili.com/video/av35595465
课程源码:https://github.com/ibywind/springboot-learn
关注公众号 查看更多技术干货
还可加群 , 众多好基友在等你

springboot 书籍 PDF 下载

扫描关注上方公众号
回复关键字 boot
就可以下载这本书了
书籍的排版很好的,我自己也在看.大家可以一起交流哦

写在前面

hello 大家好
欢迎大家收看御风大世界
本次课是
springboot 系列教程第13课
这节课我们将学习一个国人开发的
mybatis 增强框架
mybatis-plus
真的增强了不少啊 !!

mybatis-plus

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

我们的愿景是成为 Mybatis 最好的搭档,就像 魂斗罗 中的1P、2P,基友搭配,效率翻倍。

springboot 2.0 教程-13-mybatis增强mybatis-plus_第1张图片

特性

  • 无侵入: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 操作智能分析阻断,预防误操作

架构原理

springboot 2.0 教程-13-mybatis增强mybatis-plus_第2张图片

代码托管

Gitee | Github

快速集成

把之前的mybatis干掉

加入这两个依赖


	  com.baomidou
	  mybatis-plus-boot-starter
	  2.2.0



	  com.baomidou
	  mybatis-plus
	  2.1.9

代码生成

package cn.bywind.boot;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;


public class Generator {

    public static void main(String[] args) {
        // 包名
        String packageName = "cn.bywind.boot";
        boolean serviceNameStartWithI = false;//auth -> UserService, 设置成true: auth -> IUserService
        //把需要自动生成的表 放在这里!!
        generateByTables(serviceNameStartWithI, packageName, "bywind", "boot", "person");
        generateByTables(serviceNameStartWithI, packageName, "bywind", "boot", "bluetooth");
        System.out.println("completed...");
    }

    /**
     * @param serviceNameStartWithI
     * @param packageName   包名
     * @param author  作者
     * @param database  数据库名
     * @param tableNames 表名
     */
    private static void generateByTables(boolean serviceNameStartWithI, String packageName, String author, String database, String... tableNames) {
        GlobalConfig config = new GlobalConfig();
        String dbUrl = "jdbc:mysql://127.0.0.1:3306/" + database + "?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false";
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.MYSQL)
                .setUrl(dbUrl)
                .setUsername("root")
                .setPassword("123456")
                .setDriverName("com.mysql.jdbc.Driver");
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig
                .setCapitalMode(true)
                .setEntityLombokModel(false)
                .setDbColumnUnderline(true)
                .setNaming(NamingStrategy.underline_to_camel)
//              .setSuperMapperClass("cn.saytime.mapper.BaseMapper")
                .setInclude(tableNames);//修改替换成你需要的表名,多个表名传数组
        config.setActiveRecord(false)
                .setAuthor(author)
                .setOutputDir("d:\\codeGen")
                .setFileOverride(true)
                .setEnableCache(false);
        if (!serviceNameStartWithI) {
            config.setServiceName("%sService");
        }
        new AutoGenerator().setGlobalConfig(config)
                .setDataSource(dataSourceConfig)
                .setStrategy(strategyConfig)
                .setPackageInfo(
                        new PackageConfig()
                                .setParent(packageName)
                                .setController("www")
                                .setEntity("model")
                                .setMapper("mapper")
                                .setService("service")
                                .setServiceImpl("service.impl")
                                .setXml("mappers")
                ).execute();
    }

}

生成了好多啊 !!我们拷贝到 我们的项目中 (不建议直接生成到项目 , 万一手滑 覆盖了 别人的 …..)

配置properties文件

##mybatis-plus
mybatis-plus.mapper-locations=classpath:mappers/*.xml
mybatis-plus.type-aliases-package=cn.bywind.boot.model
# 修改xml 不用重启 调试神器
mybatis-plus.global-config.refresh-mapper=true

测试一番

帮我们把 service实现都生成了

我们什么都不需要写
你看

真的什么都不用写
然后就可以做简单的 单表 增删改查了

package cn.bywind.boot;


import cn.bywind.boot.model.Person;
import cn.bywind.boot.service.PersonService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.plugins.Page;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class BootApplicationTests {

	@Autowired
    PersonService personService;

	@Autowired
	RedisTemplate redisTemplate;

	@Test
	public void contextLoads() {
	}

	@Test
	public void testGetPerson(){
        Person person = personService.selectById(1);
        System.out.println(person);
    }


	@Test
	public void  testUpdatePerson(){
		Person person = new Person();
        person.setId(1);
        person.setName("御风大世界");
		personService.updateById(person);
	}

	@Test
	public void testRedisAdd(){
		redisTemplate.opsForValue().set("name","bywind");
	}

	@Test
	public void testGetRedisResult(){
		Object name = redisTemplate.opsForValue().get("name");
		System.out.println("得到redis的值:"+name);
	}

	@Test
	public void testPage(){
	    Page page = new Page<>();
	    page.setCurrent(0);
	    page.setSize(10);
        Page personPage = personService.selectPage(page);
        System.out.println(JSON.toJSONString(personPage));
    }
}

测试效果

亮点介绍

我们开启了 分页 插件 和 性能监控插件

并且 可以 设置 什么环境下 开启 这里我们 dev test 开启打印SQL执行时间
正式环境 他是不会打印的
我们的 maven 是有多个 profiles 的
分页插件上面我们已经演示了

这个框架还有很多其他的插件 很好用
大家可以参看他的文档 详细看下效果
选择自己适合的就好

  • 分页插件
  • 执行分析插件
  • 性能分析插件
  • 乐观锁插件
  • XML热加载
  • 自定义全局操作
  • 公共字段自动填充
  • 逻辑删除
  • 读写分离 & 多数据源
  • 主键Sequence
  • 多租户 SQL 解析器
  • 通用枚举自动注入
  • Idea 快速开发插件

感悟一下

这个插件
我们之前 都是自己写的
我说真的
我们自己写 读写分离的 逻辑
自己写 分页插件
自己写count插件
自己写 带参数打印的 SQL插件

很怀念那个时候 生撸啊

不过现在有了这个mybatis-plus
真的很不错
也证明了一句话
大家都需要自己写的东西 你把他整理下 就是个框架了 !
开个玩笑

结束语

如果大家对于这里比较感兴趣的话

可以去B站查看我的视频讲解

https://space.bilibili.com/193580090/#/

或者是在 github下载源码

https://github.com/ibywind/springboot-learn

你可能感兴趣的:(springboot,springboot,微服务,架构,分布式)