Mybatis-Plus学习.,简化你的开发,提升开发效率.
Mybatis-Plus学习以及实践
简介
- 即对Mybatis进行了增强,结合了Hiberante的类型,封装了一些单表的操作,可以对进行单表的操作不需要写一些sql,直接上手开发,加快了开发效率,不过同时也会造成访问数据库的代码混杂的情况,有利有弊.
 
参考网址
- 官网文档,官方文档.
 
开发环境
Eclipse
java8
SpringBoot + maven
开始开发
这里只是配置运行一下简单的Mybatis-plus项目,试验的对象只有一张表,完成对齐的CURD.
初始化一个SpringBoot或者复制SpringBoot项目,初始化的时候可以去springBoot提供的网址进行初始化 Spring Initializr
配置pom.xml
    <!-- mybatis-plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.2.0</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.2.0</version>
    </dependency>
    <!-- mysql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.13</version>
        <scope>runtime</scope>
    </dependency>
Dao/Service/Entity
生成Entity,基本的Entity和Mybatis的一致,有个主键的注解可以注意下,影响不大.
Mapper里面不需要添加其他内容,新建一个空的class,然后继承BaseMapper即可
public interface ByReconcileDepartMapper extends BaseMapper<ByReconcileDepart>{}
Service也不需要添加,继承IService
public interface IByReconcileDepartService extends IService<ByReconcileDepart> {}
ServiceImpl也不需要添加,需要继承ServiceImpl,实现IByReconcileDepartService,注解为@Service
public class ByReconcileDepartServiceImpl extends ServiceImpl<ByReconcileDepartMapper, ByReconcileDepart> implements IByReconcileDepartService {}
到这里一个表的对应的实体,service,mapper已经构建完成,还是非常方便的,代码也看起来挺简洁.
基本方法
这里只介绍一下常用的几个方法,详细的介绍需要自行去官网查看.
因为Mapper和Service继承的父类中已经默认实现了基础方法,基本包含了单表的CURD,这里直接使用,不需要添加其他代码.
查询类
提供了条件构造器QueryWrapper,即条件构造,基本的使用方法为allEq,eq等,使用方式基本为先构造一个条件构造器Wrapper,然后赋给其条件,但条件为key-value,多条件为Map,List.然后将其当做参数传递给指定的查询方法.
多个条件查询
@Test
public void listByMap() {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("scenes_name", "大型自助机");
Collection<ByReconcileDepart> listByMap = service.listByMap(map);
System.out.println(listByMap);
}
得到单个,注意一下第二个参数影响如果查询出来多个会不会报错的问题
@Test
public void getOne() {
HashMap<String,Object> map = new HashMap<String, Object>();
map.put("scenes_name", "大型自助机");
map.put("platform_mch_id","1540492611");
map.put("seq",null);
System.out.println(map);
QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>(); // 第二个参数为是否关注map中为null的建, 默认为关注,即会添加seq is null, false 会剔除掉为null的键
q.allEq(map,false); // 第二个参数为查询多个是否会报错, 默认为true 会报错, 可手动指定为false,不会报错并且会返回一个
ByReconcileDepart one = service.getOne(q,false);
System.out.println(one);
}
Group By
@Test
public void listGroupBy() {
QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>();
q.eq("scenes_name", "大型自助机");
q.groupBy("platform_mch_id"); List<ByReconcileDepart> list = service.list(q);
System.out.println(list);
}
Order By
@Test
public void listOrderBy() {
QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>();
q.eq("scenes_name", "大型自助机");
q.orderByDesc("scenes_name","platform_mch_id"); List<ByReconcileDepart> list = service.list(q);
System.out.println(list);
}
Or,添加Or条件,默认两个条件是用and连接, 只有手动调用or才会用or,例如下面如果不用条件则是and 调用了则是or
@Test
public void listOr() {
QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>();
// 这里注意,默认两个条件是用and连接, 只有手动调用or才会用or,例如下面如果不用条件则是and 调用了则是or
q.eq("scenes_name", "大型自助机");
q.or();
q.eq("platform_mch_id", "1540492611");
q.orderByDesc("scenes_name","platform_mch_id"); List<ByReconcileDepart> list = service.list(q);
System.out.println(list);
}
Or嵌套, 1-2层嵌套可以使用,如果多层嵌套的话不推荐使用,推荐使用手写sql,如果使用的话会增加后期的维护工作量.
@Test
public void listOrAnd() {
QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>();
// 嵌套查询, where ( scenes_name = ? OR ( ( scenes_name = ? AND scenes_name = ? ) ) )
q.eq("scenes_name", "大型自助机");
q.or(i->i.eq("scenes_name", "1").eq("scenes_name", "大型")); List<ByReconcileDepart> list = service.list(q);
System.out.println(list);
}
And嵌套
@Test
public void listOrAnd2() {
QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>();
// 嵌套查询, where ( scenes_name = ? AND ( ( scenes_name = ? AND scenes_name = ? ) ) )
q.eq("scenes_name", "大型自助机");
q.and(i->i.eq("scenes_name", "1").eq("scenes_name", "大型")); List<ByReconcileDepart> list = service.list(q);
System.out.println(list);
}
apply 手动添加Where条件
@Test
public void listapply() {
QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>();
// 手动拼接sql条件, 有两种形式, 一种为直接写死sql,一种使用占位符, 后面为可变参数 apply(String applySql, Object... params)
q.apply("seq = 5"); List<ByReconcileDepart> list = service.list(q);
System.out.println(list);
}
更新类
其中还提供了保存,删除接口,其使用方法比较简单,可以根据官网或者自己点进去代码查看即可,下面只介绍一下通过UpdateWrapper来进行更新的方式.
提供了条件构造器UpdateWrapper,其基本使用方法和QueryWrapper一致,不过添加了Set,即设置需要更新的字段
@Test
public void updateWrapper() {
// set为设置update set * 的内容,设置where后面的内容和条件选择器一致
UpdateWrapper<ByReconcileDepart> w = new UpdateWrapper<ByReconcileDepart>();
w.eq("seq", 5);
w.set("organization_code", "123");
w.set("omg", "123"); boolean update = service.update(w);
System.out.println(update);
}
分页插件
pom.xml
以前使用的是pagehelper,不过直接引用的话会有jar包冲突,需要剔除一下jar即可.
<!-- pagehelper 解决掉jar包冲突 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
代码示例
    @Test
    public void listPage() {
        QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>();
        q.eq("scenes_name", "大型自助机");
        // 可以整合pagehandler, pom文件注意剔除,  getTotal 获取总条数, 注意配置文件的配置方式
        Page<ByReconcileDepart> startPage = PageHelper.startPage(5, 3);
        List<ByReconcileDepart> list = service.list(q);
        long total = startPage.getTotal();
        System.out.println(total);
        System.out.println(list.size());
    }
生成代码
pom.xml
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.2.0</version>
</dependency>
<!-- 默认模板pom -->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.1</version>
</dependency>
注意pom.xml中添加对应的引擎引用
同时需要手动将 mybatis-plus-generator jar包中的模板文件copy到自己的项目中,jar包中的模板文件再resource/template中,打开jar包方法为解压即可.
代码
官网的代码复制下来更改一下数据库连接,就可以直接生成看一下结果,正式用的话需要更改一下包名以及公共类型的代码.
这里全都是用的默认提供的生成规则,如果需要自定义模板的话自己去官网查看
同时需要自己手动添加数据库驱动.
- 在这一步遇到了一个报错,The server time zone value,即JDBC时区的问题,引起的原因是Mysql驱动的版本过高,解决办法为在数据库连接地址后面添加serverTimezone=GMT%2B8,或者降低版本(N多办法中的其中两个).
 
多层or/and嵌套推荐手写sql,Mybatis-plus只有在简单查询中好用,复杂查询推荐手写sql,便于以后的修改.
乐观锁插件
- 原生的Mybatis如果需要启动乐观锁的话需要手动再sql中实现,现在提供了内置的控制方法. 这样的话还是比较好用的,虽然不如Hinerbate那样只能,还是能解决一些方法.
 
配置
- 添加配置Bean
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
 - 对应的字段添加 @Version 注解
 
说明
仅支持 updateById(id) 与 update(entity, wrapper) 方法
在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
newVersion 会回写到 entity 中
如果乐观锁冲突的话不会报错,会返回0,这样就不如Hibernate好,Hibernate会报出一个指定的错误,这里只能根据返回的来做判断,这样就不能判断是乐观锁冲突返回的0,还是因为不符合条件不能更新返回的0.
乐观锁冲突出现后需要进行重试,重新获取对象,然后重新更新.
Demo
- 自己的学习Demo放到demo-github,有需要的可以去看下,具体的使用代码再Test内
 
Mybatis-Plus学习.,简化你的开发,提升开发效率.的更多相关文章
- 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第六天】
		
https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...
 - Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发
		
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6869133.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)——My ...
 - 提升开发效率的一款mybatis开发神器
		
文末附有完整案例的代码内容!! 以前在开发的时候,使用mybatis的时候,经常都需要先配置xml映射文件,然后每条sql操作都需要自己进行手动编写,对于一些复杂的sql这么来操作确实有必要,但是如果 ...
 - Spring+SpringMVC+MyBatis深入学习及搭建(十五)——SpringMVC注解开发(基础篇)
		
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7065294.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十四)--S ...
 - Spring+SpringMVC+MyBatis深入学习及搭建(十六)——SpringMVC注解开发(高级篇)
		
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7085268.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十五)——S ...
 - mybatis自己学习的一些总结
		
曾经一直在使用spring的JDBCTEMPLATE和hibernate做项目.两个都还不错,spring的jdbctemplate用起来比較麻烦,尽管非常easy.而hibernate呢,用起来非常 ...
 - IOS开发-提升app性能的25条建议和技巧
		
前言 这篇文章介绍了作者开发工作中总结的25个iOS开发tips, 多年之前读过这篇文章.收益良多,基本每一个tips在我的应用开发过程中都使用过.今天把这篇文章又一次整理转发下,与大家一起学习,不论 ...
 - 学习版pytest内核测试平台开发万字长文入门篇
		
前言 2021年,测试平台如雨后春笋般冒了出来,我就是其中一员,写了一款pytest内核测试平台,在公司落地.分享出来后,有同学觉得挺不错,希望能开源,本着"公司代码不要传到网上去,以免引起 ...
 - MyBatis 3学习笔记
		
MyBatis 3 一.MyBatis简介 优秀的持久层框架,支持支持自定义 SQL.存储过程以及高级映射,专注于SQL的编写.  为什么不使用工具类进行数据库操作:  功能简单,sql语句编写在 ...
 
随机推荐
- HYSBZ - 4016 最短路径树问题 点分治 + 最短路径最小字典序
			
题目传送门 题解:首先对于给定的图,需要找到那些从1好点出发然后到x号点的最短路, 如果有多条最短路就要找到字典序最小的路,这样扣完这些边之后就会有一棵树.然后再就是很普通的点分治了. 对于扣边这个问 ...
 - hdu 4081 Qin Shi Huang's National Road System(次小生成树prim)
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4081 题意:有n个城市,秦始皇要修用n-1条路把它们连起来,要求从任一点出发,都可以到达其它的任意点. ...
 - jquery中的 $(function(){ .. }) 函数
			
2017-04-29 在讲解jquery中的 $(function(){ .. }) 函数之前,我们先简单了解下匿名函数.匿名函数的形式为:(function(){ ... }),又如 functio ...
 - HDU 1223 还是畅通工程(最小生成树prim模板)
			
一个很简单的prim模板,但虽然是模板,但也是最基础的,也要脱离模板熟练打出来 后期会更新kruskal写法 #include<iostream> #include<cstdio&g ...
 - Vert.x Web之Router
			
Vert.x Web 是一系列用于基于 Vert.x 构建 Web 应用的构建模块. Vert.x Web 的大多数特性被实现为了处理器(Handler),因此您随时可以实现您自己的处理器.我们预计随 ...
 - C#中读写Xml配置文件常用方法工具类
			
场景 有时需要使用配置文件保存一些配置的属性,使其在下次打开时设置仍然生效. 这里以对xml配置文件的读写为例. 1.读取XML配置文. 2.写入XML配置文件. 3.匹配 XPath 表达式的第一个 ...
 - 编译gaia
			
./rkst/mkimage.sh rk3066-eng -j8 gaia 分别是编译文件路径 编译的输出类型 处理器分配数 待编译模块 //flash gaia1. adb remount2. ad ...
 - [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher 题解报告
			
来刷kuangbin字符串了,字符串处理在ACM中是很重要的,一般比赛都会都1——2道有关字符串处理的题目,而且不会很难的那种,大多数时候都是用到一些KMP的性质或者找规律. 点击标题可跳转至VJ比赛 ...
 - windows下docker与.net core 的简单示例
			
一 windows 下安装docker 二 .net core 项目 新建一个空的ASP.NET Core Web 应用程序 在该项目的目录下执行dotnet publish,可以看到在bin\Deb ...
 - 表达式树练习实践:C# 循环与循环控制
			
目录 表达式树练习实践:C# 循环 LabelTarget for / while 循环 无限循环 最简单的循环 多次循环 break 和 continue 一起 表达式树练习实践:C# 循环 C# ...