阅读原文: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,基友搭配,效率翻倍。
特性
- 无侵入: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 操作智能分析阻断,预防误操作
架构原理
代码托管
快速集成
把之前的mybatis干掉
加入这两个依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.1.9</version>
</dependency>
代码生成
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<Person> page = new Page<>();
page.setCurrent(0);
page.setSize(10);
Page<Person> personPage = personService.selectPage(page);
System.out.println(JSON.toJSONString(personPage));
}
}
测试效果
亮点介绍
我们开启了 分页 插件 和 性能监控插件
并且 可以 设置 什么环境下 开启 这里我们 dev test 开启打印SQL执行时间
正式环境 他是不会打印的
我们的 maven 是有多个 profiles 的
分页插件上面我们已经演示了
这个框架还有很多其他的插件 很好用
大家可以参看他的文档 详细看下效果
选择自己适合的就好
感悟一下
这个插件
我们之前 都是自己写的
我说真的
我们自己写 读写分离的 逻辑
自己写 分页插件
自己写count插件
自己写 带参数打印的 SQL插件
很怀念那个时候 生撸啊
不过现在有了这个mybatis-plus
真的很不错
也证明了一句话
大家都需要自己写的东西 你把他整理下 就是个框架了 !
开个玩笑
结束语
如果大家对于这里比较感兴趣的话
可以去B站查看我的视频讲解
https://space.bilibili.com/193580090/#/
或者是在 github下载源码