Eclipsejava
java8mysql
SpringBoot + mavengit
这里只是配置运行一下简单的Mybatis-plus项目,试验的对象只有一张表,完成对齐的CURD.github
初始化一个SpringBoot或者复制SpringBoot项目,初始化的时候能够去springBoot提供的网址进行初始化 Spring Initializrspring
<!-- 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>
生成Entity,基本的Entity和Mybatis的一致,有个主键的注解能够注意下,影响不大.sql
Mapper里面不须要添加其余内容,新建一个空的class,而后继承BaseMapper
public interface ByReconcileDepartMapper extends BaseMapper<ByReconcileDepart>{}
Service也不须要添加,继承IService
public interface IByReconcileDepartService extends IService<ByReconcileDepart> {}
ServiceImpl也不须要添加,须要继承ServiceImpl,实现IByReconcileDepartService,注解为@Servicemybatis
public class ByReconcileDepartServiceImpl extends ServiceImpl<ByReconcileDepartMapper, ByReconcileDepart> implements IByReconcileDepartService {}
到这里一个表的对应的实体,service,mapper已经构建完成,仍是很是方便的,代码也看起来挺简洁.app
这里只介绍一下经常使用的几个方法,详细的介绍须要自行去官网查看.
由于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); }
之前使用的是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()); }
<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包方法为解压便可.
官网的代码复制下来更改一下数据库链接,就能够直接生成看一下结果,正式用的话须要更改一下包名以及公共类型的代码.
这里全都是用的默认提供的生成规则,若是须要自定义模板的话本身去官网查看
同时须要本身手动添加数据库驱动.
多层or/and嵌套推荐手写sql,Mybatis-plus只有在简单查询中好用,复杂查询推荐手写sql,便于之后的修改.
@Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); }
仅支持 updateById(id) 与 update(entity, wrapper) 方法
在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
newVersion 会回写到 entity 中
若是乐观锁冲突的话不会报错,会返回0,这样就不如Hibernate好,Hibernate会报出一个指定的错误,这里只能根据返回的来作判断,这样就不能判断是乐观锁冲突返回的0,仍是由于不符合条件不能更新返回的0.
乐观锁冲突出现后须要进行重试,从新获取对象,而后从新更新.