一、mybatis-plus简介
(一)什么是mybatis-plus
mybatis-plus是一个mybatis(opens new window)的增强工具,在mybatis的基础上只做增强不做改变,为简化开发。
(二)mybatis-plus的优势
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响。
- 损耗小:启动即会自动注入基本curd,性能基本无损耗,直接面向对象操作。
- 强大的crud操作:内置通用mapper、通用service,仅仅通过少量配置即可实现单表大部分crud操作,更有强大的条件构造器,满足各类使用需求。
- 支持lambda形式调用:通过 lambda 表达式,方便的编写各类查询条件,无需再担心字段写
- 错。
- 支持主键自动生成:支持多达4种主键策略(内含分布式唯一 id 生成器 - sequence),可自由配置,完美解决主键问题。
- 支持activerecord模式:支持 activerecord 形式调用,实体类只需继承 model 类即可进行强大的 crud 操作。
- 支持自定义全局通用操作:支持全局通用方法注入( write once, use anywhere )。
- 内置代码生成器:采用代码或者 maven 插件可快速生成 mapper 、 model 、 service 、 controller 层代码,支持模板引擎,更有超多自定义配置等您来使用。
- 内置分页插件:基于 mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 list 查询。
- 分页插件支持多种数据库:支持 mysql、mariadb、oracle、db2、h2、hsql、sqlite、
- postgre、sqlserver 等多种数据库。
- 内置性能分析插件:可输出 sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询。
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作。
(三)mybatis-plus的框架结构
二、springboot整合mybatis-plus入门
(一)创建maven工程,添加依赖
<dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <version>5.1.47</version> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <scope>test</scope> </dependency> <dependency> <groupid>com.baomidou</groupid> <artifactid>mybatis-plus-boot-starter</artifactid> <version>3.4.2</version> </dependency> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>4.12</version> </dependency>
(二)创建数据库表employee
create table employee( emp_id bigint(20) not null, name varchar(30), emp_gender varchar(6), age int, email varchar(50), primary key(emp_id) ); insert into employee(emp_id,name,emp_gender,age,email) values(1367686308726788098,'刘晓娟','女',20,'liuxianjuan@qq.com'); insert into employee(emp_id,name,emp_gender,age,email) values(1367709299695099906,'张春雨','男',28,'zhangchunyu@sina.com'); insert into employee(emp_id,name,emp_gender,age,email) values(1367717669156028418,'何雨柱','男',23,'heyuzhu@126.com');
(三)构建数据模型employee
public class employee { private long empid; private string name; private string empgender; private integer age; private string email; public long getempid() { return empid; } public void setempid(long empid) { this.empid = empid; } public string getname() { return name; } public void setname(string name) { this.name = name; } public string getempgender() { return empgender; } public void setempgender(string empgender) { this.empgender = empgender; } public integer getage() { return age; } public void setage(integer age) { this.age = age; } public string getemail() { return email; } public void setemail(string email) { this.email = email; } @override public string tostring() { return "employee{" + "empid=" + empid + ", name='" + name + '\'' + ", empgender='" + empgender + '\'' + ", age=" + age + ", email='" + email + '\'' + '}'; } }
(四)配置application.yml
spring: datasource: driver-class-name: com.mysql.jdbc.driver url: jdbc:mysql:///mybatis_plus username: root password: root logging: level: com: offcn: mapper: debug
(五)编写springboot启动类
@springbootapplication @mapperscan("com.offcn.mapper") public class mybatisplus01application { public static void main(string[] args) { springapplication.run(mybatisplus01application.class, args); } }
(六)编写mapper接口
public interface employeemapper extends basemapper<employee> {}
(七)启动服务测试结果
@runwith(springrunner.class) @springboottest public class mybatisplus01applicationtests { @autowired private employeemapper employeemapper; @test public void testselect(){ list<employee> employeelist = employeemapper.selectlist(null); employeelist.foreach( system.out::println); } }
三、lombok插件
(一)lombok插件简介
lombok是一个插件,用途是使用注解给你类里面的字段,自动的加上属性,构造器,tostring方法,equals方法等,比较方便的一点是,你在更改字段的时候,lombok会立即发生改变以保持和你代码的一致性。
(二)常用的lombok注解介绍
@data | 注在类上,提供类的get、set、equals、hashcode、tostring等方法 |
@getter | 加在类上,可以自动生成参数的getter方法 |
@setter | 加在类上,可以自动生成参数的setter方法 |
@tostring | 加在类上,调用tostring()方法,可以输出实体类中所有属性的值 |
@requiredargsconstructor | 生成一个包含常量,和标识了notnull的变量的构造方法。生成的构造方法是私有的private |
@equalsandhashcode | 生成equals和hashcode方法, 默认使用非静态的属性, 可以通过exclude参数排除不需要生成的属性。 通过of参数来指定需要生成的属性 |
(三)idea安装lombok插件
首先我们需要安装intellij idea中的lombok插件,打开intellij idea后点击菜单栏中的file-->settings,或者使用快捷键ctrl+alt+s进入到设置页面。
我们点击设置中的plugins进行插件的安装,在右侧选择browse repositories...,然后在搜索页面输入lombok变可以查询到下方的lombok plugin,鼠标点击lombok plugin可在右侧看到install按钮,点击该按钮便可安装。
安装完成之后重启idear即可。
(四)lombok插件的使用
1、引入依赖
<dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <version>1.18.4</version> <scope>provided</scope> </dependency>
2、去除employee类中的setter和getter方法
public class employee { private long empid; private string name; private string empgender; private integer age; private string email; }
3、在employee类上添加lombok注解
@noargsconstructor @allargsconstructor @data @tostring public class employee { private long empid; private string name; private string empgender; private integer age; private string email; }
四、crud
(一)basemapper接口方法介绍
basemapper中提供了crud方法,具体方法如下:
// 插入一条记录 int insert(t entity); // 根据 entity 条件,删除记录 int delete(@param(constants.wrapper) wrapper<t> wrapper); // 删除(根据id 批量删除) int deletebatchids(@param(constants.collection) collection<? extends serializable> idlist); // 根据 id 删除 int deletebyid(serializable id); // 根据 columnmap 条件,删除记录 int deletebymap(@param(constants.column_map) map<string, object> columnmap); // 根据 whereentity 条件,更新记录 int update(@param(constants.entity) t entity, @param(constants.wrapper) wrapper<t> updatewrapper); // 根据 id 修改 int updatebyid(@param(constants.entity) t entity); list<t> selectlist(@param(constants.wrapper) wrapper<t> querywrapper); // 查询(根据 columnmap 条件) list<t> selectbymap(@param(constants.column_map) map<string, object> columnmap); // 根据 wrapper 条件,查询全部记录 list<map<string, object>> selectmaps(@param(constants.wrapper) wrapper<t> querywrapper); // 根据 wrapper 条件,查询全部记录。注意: 只返回第一个字段的值 list<object> selectobjs(@param(constants.wrapper) wrapper<t> querywrapper); // 根据 entity 条件,查询全部记录(并翻页) ipage<t> selectpage(ipage<t> page, @param(constants.wrapper) wrapper<t> querywrapper); // 根据 wrapper 条件,查询全部记录(并翻页) ipage<map<string, object>> selectmapspage(ipage<t> page, @param(constants.wrapper) wrapper<t> querywrapper); // 根据 wrapper 条件,查询总记录数 integer selectcount(@param(constants.wrapper) wrapper<t> querywrapper);
(二)insert方法
//插入一条记录
int insert (t entity);
测试:
@test public void testinsert() { employee employee=new employee(); //employee.setempid(100000); employee.setname("刘龙"); employee.setempgender("男"); employee.setage(25); employee.setemail("liulong@163.com"); employeemapper.insert(employee); }
从上面的异常可以看出,我们没有给employee类的empid属性赋值,定义数据库时对应的emp_id列不能为空,所以出错了,为了解决这个错误,你可以给empid属性赋值一个值,可以解决此问题。
mybatis-plus默认采用雪花算法生成唯一值,如果想使用mybatis-plus自动生成的雪花算法值可以在实体类的属性上加@filedid注解。
(三)@tableid注解
描述:主键注解
属性 | 类型 | 必须指定 | 默认值 | 描述 |
value | string | 否 | " " | 主键字段名 |
type | enum | 否 | idtype.none | 主键类型 |
idtype
值 | 描述 |
auto | 数据库id自增 |
none | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于input) |
input | insert前自行set主键值 |
@noargsconstructor @allargsconstructor @data @tostring public class employee { //使用数据库自增策略 //@tableid(type=idtype.auto) //默认使用雪花算法生成数字 @tableid private long empid; private string empname; private string empgender; private integer age; private string email; }
(四)@tablename注解
描述:表名注解
属性 | 类型 | 必须指定 | 默认值 | 描述 |
value | string | 否 | " " | 主键字段名 |
type | enum | 否 | idtype.none | 主键类型 |
当表名跟实体类类名不一致时,要使用@tablename注解进行映射
@noargsconstructor @allargsconstructor @data @tostring @tablename(value = "tb_employee") public class employee { //使用数据库自增策略 //@tableid(type=idtype.auto) //默认使用雪花算法生成数字 @tableid private long empid; private string empname; private string empgender; private integer age; private string email; }
(五)@tablefield注解
描述:字段注解(非主键)
属性 | 类型 | 必须指定 | 默认值 | 描述 |
value | string | 否 | "" | 数据库字段名 |
el | string | 否 | "" | |
exist | boolean | 否 | true | 是否为数据库表字段 |
condition | string | 否 | "" | |
update | string | 否 | "" | |
insertstrategy | enum | n | default | |
updatestrategy | enum | n | default | |
wherestrategy | enum | n | default | |
fill | enum | 否 | fieldfill.default | 字段自动填充策略 |
select | boolean | 否 | true | 是否进行select查询 |
"" |
@noargsconstructor @allargsconstructor @data @tostring @tablename(value = "tb_employee") public class employee { @tableid private long empid; //当表中的列与实体类属性不一致时,使用tablefield指定数据库中的列名 @tablefield(value = "emp_name") private string name; private string empgender; private integer age; private string email; //当表中没有remark时,使用tablefield的exist=false属性忽略该字段 @tablefield(exist = false) private string remark; }
(六)插入数据获取主键值
修改employee的empid注解
@tableid(type=idtype.auto) private long empid;
mysql-plus会自动获取自增主键,把数据库的emp_id设置为自增。测试获取自增主键
public void testinsert() { employee employee=new employee(); employee.setname("刘龙200"); employee.setempgender("男"); employee.setage(25); employee.setemail("liulong@163.com"); employee.setremark("该员工是一个好员工"); employeemapper.insert(employee); system.out.println(employee.getempid()); }
(七)更新数据的通用方法
1、updatebyid方法
根据id进行记录更新,如果对象属性未传值,则不会更新该字段,保持数据库表原来字段值
public void testupdatebyid() { employee employee=new employee(); employee.setempid(10) employee.setname("刘龙"); employee.setempgender("女"); employee.setage(23); employee.setemail("liulong@163.com"); employeemapper.updatebyid(employee); }
2、update(entity,wrapper)方法
public void testdatebyid(){ //根据员工的名字,更新 employee employee2=new employee(); employee2.setempgender("男"); employee2.setage(18); employee2.setemail("liulong@126.com"); employeemapper.update(employee2,new updatewrapper<employee>().eq("name","刘龙")); }
(八)查询数据的通用方法
1、selectbyid方法
根据id查询指定记录
@test public void testselectbyid() { employee employee=employeemapper.selectbyid(1); system.out.println(employee); }
2、selectbatchids方法
批量查询指多个id的记录集合
@test public void testselectbatchids() { list list= arrays.aslist(1,2,3); list<employee> employeelist = employeemapper.selectbatchids(list); employeelist.foreach(system.out::println); }
3、selectbymap方法
根据map集合中传入的条件进行查询,每个条件都是and关系
@test public void testselectbymap() { map<string,object> map=new hashmap<>(); map.put("emp_gender","男"); map.put("age",29); list<employee> employeelist = employeemapper.selectbymap(map); employeelist.foreach(system.out::println); }
(九)删除数据方法
1、deletebyid方法
根据id删除记录
@test public void testdeletebyid(){ int rows=employeemapper.deletebyid(1); system.out.println("受影响的行数:"+rows); }
2、deletebymap方法
根据map中的条件进行删除,map中的条件在sql语句中是and关系
@test public void testdeletebymap(){ map<string,object> map=new hashmap<>(); map.put("emp_gender","男"); map.put("emp_name","刘辉"); int rows=employeemapper.deletebymap(map); system.out.println("受影响的行数:"+rows); }
3、deletebatchids方法
根据传入list集合中的id进行批量删除
@test public void testdeletebatchids(){ list list= arrays.aslist(4,7,1); int rows=employeemapper.deletebatchids(list); system.out.println("受影响的行数:"+rows); }
五、mybatis-plus条件构造器
(一)条件构造器介绍
在mybatis-plus中提了构造条件的类wrapper,它可以根据自己的意图定义我们需要的条件。wrapper是一个抽象类,一般情况下我们用它的子类querywrapper来实现自定义条件查询。
(二)selectone方法
//查询姓名为刘辉军并且性别为男的员工 @test public void testselectone(){ querywrapper<employee> querywrapper=new querywrapper<>(); querywrapper.eq("name","刘辉军"); querywrapper.eq("emp_gender","男"); employee employee = employeemapper.selectone(querywrapper); system.out.println(employee); }
(三)selectlist方法
//查询姓名中带有"磊"的并且年龄小于30的员工 @test public void testselectlist(){ querywrapper<employee> querywrapper=new querywrapper<>(); querywrapper.like("name","磊").lt("age",30); list<employee> employeelist = employeemapper.selectlist(querywrapper); employeelist.foreach(system.out::println); } //查询姓刘的或者性别为男,按年龄的除序排序 @test public void testselectlist2(){ querywrapper<employee> querywrapper=new querywrapper<>(); querywrapper.like("name","王") .or().eq("emp_gender","男") .orderbydesc("age"); list<employee> employeelist = employeemapper.selectlist(querywrapper); employeelist.foreach(system.out::println); } //查询姓刘的并且(年龄小于35或者邮箱不为空) @test public void testselectlist3(){ querywrapper<employee> querywrapper=new querywrapper<>(); querywrapper.likeright("name","刘") .and(wq->wq.lt("age",35).or().isnotnull("email")); list<employee> employeelist = employeemapper.selectlist(querywrapper); employeelist.foreach(system.out::println); }
(四)selectpage方法
selectpage用于分页,在mybatis-plus中分页有两种:一种是逻辑分页或叫内存分页,另一个是物理分页。内存分页就是把数据全部查询出来放到内容中,返回你想要的一部分数据,当数据量非常庞大时,这种方法就行不通了,因为太耗内容,所以一般采用物理分页,需要springmvc中加入物理分页配置:
@configuration public class mybatisplusconfig { @bean public mybatisplusinterceptor mybatisplusinterceptor() { mybatisplusinterceptor interceptor = new mybatisplusinterceptor(); interceptor.addinnerinterceptor(new paginationinnerinterceptor(dbtype.mysql)); return interceptor; } }
@test public void testselectpage(){ querywrapper<employee> querywrapper=new querywrapper<>(); querywrapper.lt("age",50); page<employee> page=new page<>(1,2); page<employee> employeepage = employeemapper.selectpage(page, querywrapper); system.out.println("当前页:"+ employeepage.getcurrent()); system.out.println("每页记录数:"+employeepage.getsize()); system.out.println("总记录数:"+employeepage.gettotal()); system.out.println("总页数:"+employeepage.getpages()); list<employee> employeelist = employeepage.getrecords(); employeelist.foreach(system.out::println); }
(五)update方法
//根据姓名和年龄修改记录 @test public void testupdate(){ querywrapper<employee> updatewrapper=new querywrapper<>(); updatewrapper.eq("name","刘龙") .eq("age",25); employee employee=new employee(); employee.setempid(1367720249630318593l); employee.setname("刘龙"); employee.setemail("lilong111@.qq.com"); employee.setage(26); employee.setempgender("女"); int rows=employeemapper.update(employee,updatewrapper); system.out.println("受影响的行数:"+rows); }
(六)delete方法
//根据姓名和年龄删除记录 @test public void testdelete(){ querywrapper<employee> querywrapper=new querywrapper<>(); querywrapper.eq("name","刘龙") .eq("age",26); int rows=employeemapper.delete(querywrapper); system.out.println("受影响的行数:"+rows); }
六、mybatis-plus的service封装
(一)通用service简介
mybatis-plus除了通用的mapper还有通用的servcie层,这也减少了相对应的代码工作量,把通用 的接口提取到公共。其实按照mp的这种思想,可以自己也实现一些通用的controller。
(二)通用service常用方法介绍
/** * 插入一条记录(选择字段,策略插入) * * @param entity 实体对象 */ default boolean save(t entity) { return sqlhelper.retbool(getbasemapper().insert(entity)); } /** * 根据 id 选择修改 * * @param entity 实体对象 */ default boolean updatebyid(t entity) { return sqlhelper.retbool(getbasemapper().updatebyid(entity)); } /** * tableid 注解存在更新记录,否插入一条记录 * * @param entity 实体对象 */ boolean saveorupdate(t entity); /** * 根据 wrapper,查询一条记录 <br/> * <p>结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("limit 1")</p> * * @param querywrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.querywrapper} */ default t getone(wrapper<t> querywrapper) { return getone(querywrapper, true); } /** * 根据 wrapper,查询一条记录 * * @param querywrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.querywrapper} * @param throwex 有多个 result 是否抛出异常 */ t getone(wrapper<t> querywrapper, boolean throwex);
(三)通用service的案例
1、构建工程,添加依赖
<dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <version>5.1.47</version> </dependency> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <optional>true</optional> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <scope>test</scope> </dependency> <dependency> <groupid>com.baomidou</groupid> <artifactid>mybatis-plus-boot-starter</artifactid> <version>3.4.2</version> </dependency>
2、构建service接口
public interface emloyeeservice extends iservice<employee> { }
3、构建service实现类
@service public class employeeserviceimpl extends serviceimpl<employeemapper,employee> implements emloyeeservice { }
4、通用service测试
@test public void testsave(){ employee employee=new employee(); employee.setname("孙宝来"); employee.setempgender("男"); employee.setage(30); employee.setemail("sunbaolai@qq.com"); employeeservice.save(employee); } @test public void testsaveorupdate(){ employee employee=new employee(); employee.setempid(1367720249630318594l); employee.setname("孙宝来"); employee.setempgender("女"); employee.setage(33); employee.setemail("sunbaolai@qq.com"); employeeservice.saveorupdate(employee); } @test public void testgetone(){ querywrapper<employee> querywrapper=new querywrapper<>(); querywrapper.gt("age",24); employee employee = employeeservice.getone(querywrapper,false); system.out.println(employee); }
七、mybatis-plus代码生成器
(一)代码生成器介绍
代码生成器顾名思义就是为我们生成一些代码,省去了我们一些时间。autogenerator 是 mybatis-plus 的代码生成器,通过 autogenerator 可以快速生成 entity、mapper、mapper xml、service、controller 等各个模块的代码,极大的提升了开发效率,mybatis-plus从3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖,才能实现代码生成器功能。
(二)构建maven工程,引入依赖
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <scope>test</scope> </dependency> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <version>5.1.47</version> </dependency> <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> <dependency> <groupid>org.apache.velocity</groupid> <artifactid>velocity-engine-core</artifactid> <version>2.3</version> </dependency> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> </dependency>
(三)编写生成器代码
1、globalconfig全局配置编码
// 代码生成器 autogenerator mpg = new autogenerator(); // 全局配置 globalconfig gc = new globalconfig(); //获取工程路径 string projectpath = system.getproperty("user.dir"); gc.setoutputdir(projectpath + "/src/main/java"); gc.setauthor("zs");//设置作者 gc.setopen(false);//生成是后是否打开资源管理器 gc.setfileoverride(false);//重新生成文件时是否覆盖 gc.setservicename("%sservice"); // gc.setswagger2(true); 实体属性 swagger2 注解 mpg.setglobalconfig(gc);
2、datasourceconfig数据源配置编码
// 数据源配置 datasourceconfig dsc = new datasourceconfig(); dsc.seturl("jdbc:mysql://localhost:3306/mybatis_plus? useunicode=true&usessl=false&characterencoding=utf8"); // dsc.setschemaname("public"); dsc.setdrivername("com.mysql.jdbc.driver"); dsc.setusername("root"); dsc.setpassword("root"); dsc.setdbtype(dbtype.mysql); mpg.setdatasource(dsc);
3、packageconfig包名策略配置
// 包配置 packageconfig pc = new packageconfig(); pc.setmodulename(null); pc.setparent("com.offcn.ssm"); pc.setcontroller("controller"); pc.setentity("entity"); pc.setservice("service"); pc.setmapper("mapper"); mpg.setpackageinfo(pc);
4、strategyconfig策略配置编码
//策略配置 strategyconfig strategy = new strategyconfig(); strategy.setinclude("tb_employee");//对那一张表生成代码 strategy.setnaming(namingstrategy.underline_to_camel);//数据库表映射到实体的命名策略 strategy.settableprefix(pc.getmodulename() + "_"); //生成实体时去掉表前缀 strategy.setcolumnnaming(namingstrategy.underline_to_camel);//数据库表字段映射到实体的命名策略 strategy.setentitylombokmodel(true); // lombok 模型 @accessors(chain = true) setter链式操作 strategy.setrestcontrollerstyle(true); //restful api风格控制器 strategy.setcontrollermappinghyphenstyle(true); //url中驼峰转连字符 mpg.setstrategy(strategy);
5、执行
//执行 mpg.execute();
(四)执行生成器代码完成测试
在主启动类上用@mapperscan扫描mapper接口
@mapperscan("com.offcn.ssm.mapper")
在application.yml中添加数据库配置信息
spring: datasource: driver-class-name: com.mysql.jdbc.driver url: jdbc:mysql:///mybatis_plus username: root password: root logging: level: com: offcn: mybatis: dao: debug
在生成的controller中编写查询方法
@requestmapping("/tb-employee") public class tbemployeecontroller { @autowired private tbemployeeservice tbemployeeservice; @requestmapping("/emps") public list<tbemployee> getemployees(){ list<tbemployee> list = tbemployeeservice.list(); return list; } }
到此这篇关于全网最全mybatis-plus详解的文章就介绍到这了,更多相关mybatis-plus详解内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论