前言:

mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。

欢迎大家关注我的公众号 javawebkf,目前正在慢慢地将简书文章搬到公众号,以后简书和公众号文章将同步更新,且简书上的付费文章在公众号上将免费。

一、mybatis-plus简介:

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。

二、spring整合mybatis-plus:

正如官方所说,mybatis-plus在mybatis的基础上只做增强不做改变,因此其与spring的整合亦非常简单。只需把mybatis的依赖换成mybatis-plus的依赖,再把sqlSessionFactory换成mybatis-plus的即可。接下来看具体操作:

1、pom.xml:

核心依赖如下:

org.springframework

spring-context

4.3.14.RELEASE

org.springframework

spring-orm

4.3.14.RELEASE

org.springframework

spring-test

4.3.14.RELEASE

test

com.baomidou

mybatis-plus

2.3

注意:这些是核心依赖,本项目还用到了mysql驱动、c3p0、日志(slf4j-api,slf4j-log4j2)、lombok。集成mybatis-plus要把mybatis、mybatis-spring去掉,避免冲突;lombok是一个工具,添加了这个依赖,开发工具再安装Lombok插件,就可以使用它了,最常用的用法就是在实体类中使用它的@Data注解,这样实体类就不用写set、get、toString等方法了。关于Lombok的更多用法,请自行百度。

2、log4j.xml:

3、jdbc.properties:

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql:///数据库名?useUnicode=true&characterEncoding=utf8

jdbc.username=#

jdbc.password=#

4、mybatis-config.xml:

/p>

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

注:因为是与spring整合,所有mybatis-plus的大部分都写在spring的配置文件中,这里定义一个空的mybatis-config.xml即可。

5、spring-dao.xml:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:p="http://www.springframework.org/schema/p"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:jee="http://www.springframework.org/schema/jee"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd

http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

6、entity:

@Data

@TableName(value = "tb_employee")//指定表名

public class Employee {

//value与数据库主键列名一致,若实体类属性名与表主键列名一致可省略value

@TableId(value = "id",type = IdType.AUTO)//指定自增策略

private Integer id;

//若没有开启驼峰命名,或者表中列名不符合驼峰规则,可通过该注解指定数据库表中的列名,exist标明数据表中有没有对应列

@TableField(value = "last_name",exist = true)

private String lastName;

private String email;

private Integer gender;

private Integer age;

}

7、mapper:

public interface EmplopyeeDao extends BaseMapper {

}

这样就完成了mybatis-plus与spring的整合。首先是把mybatis和mybatis-spring依赖换成mybatis-plus的依赖,然后把sqlsessionfactory换成mybatis-plus的,然后实体类中添加@TableName、@TableId等注解,最后mapper继承BaseMapper即可。

8、测试:

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration({"classpath:spring/spring-dao.xml"})

public class test {

@Autowired

private DataSource dataSource;

@Test

public void testDataSource() throws SQLException {

System.out.println(dataSource.getConnection());

}

}

运行该junit,可输出获取到的连接,说明整合没问题:

image.png

本文所有代码本人均亲自测试过,本文涉及代码又较多,为了不影响篇幅,故非必要处不再截图。接下来的所有操作都是基于此整合好的项目。

三、mp的通用crud:

需求:

存在一张 tb_employee 表,且已有对应的实体类 Employee,实现tb_employee 表的 CRUD 操作我们需要做什么呢?

基于 Mybatis:

需要编写 EmployeeMapper 接口,并在 EmployeeMapper.xml 映射文件中手动编写 CRUD 方法对应的sql语句。

基于 MP:

只需要创建 EmployeeMapper 接口, 并继承 BaseMapper 接口。

我们已经有了Employee、tb_employee了,并且EmployeeDao也继承了BaseMapper了,接下来就使用crud方法。

1、insert操作:

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration({"classpath:spring/spring-dao.xml"})

public class test {

@Autowired

private EmplopyeeDao emplopyeeDao;

@Test

public void testInsert(){

Employee employee = new Employee();

employee.setLastName("东方不败");

employee.setEmail("dfbb@163.com");

employee.setGender(1);

employee.setAge(20);

emplopyeeDao.insert(employee);

//mybatisplus会自动把当前插入对象在数据库中的id写回到该实体中

System.out.println(employee.getId());

}

}

执行添加操作,直接调用insert方法传入实体即可。

2、update操作:

@Test

public void testUpdate(){

Employee employee = new Employee();

employee.setId(1);

employee.setLastName("更新测试");

//emplopyeeDao.updateById(employee);//根据id进行更新,没有传值的属性就不会更新

emplopyeeDao.updateAllColumnById(employee);//根据id进行更新,没传值的属性就更新为null

}

注:注意这两个update操作的区别,updateById方法,没有传值的字段不会进行更新,比如只传入了lastName,那么age、gender等属性就会保留原来的值;updateAllColumnById方法,顾名思义,会更新所有的列,没有传值的列会更新为null。

3、select操作:

(1)、根据id查询:

Employee employee = emplopyeeDao.selectById(1);

(2)、根据条件查询一条数据:

Employee employeeCondition = new Employee();

employeeCondition.setId(1);

employeeCondition.setLastName("更新测试");

//若是数据库中符合传入的条件的记录有多条,那就不能用这个方法,会报错

Employee employee = emplopyeeDao.selectOne(employeeCondition);

注:这个方法的sql语句就是where id = 1 and last_name = 更新测试,若是符合这个条件的记录不止一条,那么就会报错。

(3)、根据查询条件返回多条数据:

当符合指定条件的记录数有多条时,上面那个方法就会报错,就应该用这个方法。

Map columnMap = new HashMap<>();

columnMap.put("last_name","东方不败");//写表中的列名

columnMap.put("gender","1");

List employees = emplopyeeDao.selectByMap(columnMap);

System.out.println(employees.size());

注:查询条件用map集合封装,columnMap,写的是数据表中的列名,而非实体类的属性名。比如属性名为lastName,数据表中字段为last_name,这里应该写的是last_name。selectByMap方法返回值用list集合接收。

(4)、通过id批量查询:

List idList = new ArrayList<>();

idList.add(1);

idList.add(2);

idList.add(3);

List employees = emplopyeeDao.selectBatchIds(idList);

System.out.println(employees);

注:把需要查询的id都add到list集合中,然后调用selectBatchIds方法,传入该list集合即可,该方法返回的是对应id的所有记录,所有返回值也是用list接收。

(5)、分页查询:

List employees = emplopyeeDao.selectPage(new Page<>(1,2),null);

System.out.println(employees);

注:selectPage方法就是分页查询,在page中传入分页信息,后者为null的分页条件,这里先让其为null,讲了条件构造器再说其用法。这个分页其实并不是物理分页,而是内存分页。也就是说,查询的时候并没有limit语句。等配置了分页插件后才可以实现真正的分页。

4、delete操作:

(1)、根据id删除:

emplopyeeDao.deleteById(1);

(2)、根据条件删除:

Map columnMap = new HashMap<>();

columnMap.put("gender",0);

columnMap.put("age",18);

emplopyeeDao.deleteByMap(columnMap);

注:该方法与selectByMap类似,将条件封装在columnMap中,然后调用deleteByMap方法,传入columnMap即可,返回值是Integer类型,表示影响的行数。

(3)、根据id批量删除:

List idList = new ArrayList<>();

idList.add(1);

idList.add(2);

emplopyeeDao.deleteBatchIds(idList);

注:该方法和selectBatchIds类似,把需要删除的记录的id装进idList,然后调用deleteBatchIds,传入idList即可。

四、全局策略配置:

通过上面的小案例我们可以发现,实体类需要加@TableName注解指定数据库表名,通过@TableId注解指定id的增长策略。实体类少倒也无所谓,实体类一多的话也麻烦。所以可以在spring-dao.xml的文件中进行全局策略配置。

这里配置了还没用,还需要在sqlSessionFactory中注入配置才会生效。如下:

如此一来,实体类中的@TableName注解和@TableId注解就可以去掉了。

五、条件构造器(EntityWrapper):

以上基本的 CRUD 操作,我们仅仅需要继承一个 BaseMapper 即可实现大部分单表 CRUD 操作。BaseMapper 提供了多达 17 个方法供使用, 可以极其方便的实现单一、批量、分页等操作,极大的减少开发负担。但是mybatis-plus的强大不限于此,请看如下需求该如何处理:

需求:

我们需要分页查询 tb_employee 表中,年龄在 18~50 之间性别为男且姓名为 xx 的所有用户,这时候我们该如何实现上述需求呢?

使用MyBatis : 需要在 SQL 映射文件中编写带条件查询的 SQL,并用PageHelper 插件完成分页. 实现以上一个简单的需求,往往需要我们做很多重复单调的工作。

使用MP: 依旧不用编写 SQL 语句,MP 提供了功能强大的条件构造器 ------ EntityWrapper。

接下来就直接看几个案例体会EntityWrapper的使用。

1、分页查询年龄在18 - 50且gender为0、姓名为tom的用户:

List employees = emplopyeeDao.selectPage(new Page(1,3),

new EntityWrapper()

.between("age",18,50)

.eq("gender",0)

.eq("last_name","tom")

);

注:由此案例可知,分页查询和之前一样,new 一个page对象传入分页信息即可。至于分页条件,new 一个EntityWrapper对象,调用该对象的相关方法即可。between方法三个参数,分别是column、value1、value2,该方法表示column的值要在value1和value2之间;eq是equals的简写,该方法两个参数,column和value,表示column的值和value要相等。注意column是数据表对应的字段,而非实体类属性字段。

2、查询gender为0且名字中带有老师、或者邮箱中带有a的用户:

List employees = emplopyeeDao.selectList(

new EntityWrapper()

.eq("gender",0)

.like("last_name","老师")

//.or()//和or new 区别不大

.orNew()

.like("email","a")

);

注:未说分页查询,所以用selectList即可,用EntityWrapper的like方法进行模糊查询,like方法就是指column的值包含value值,此处like方法就是查询last_name中包含“老师”字样的记录;“或者”用or或者orNew方法表示,这两个方法区别不大,用哪个都可以,可以通过控制台的sql语句自行感受其区别。

3、查询gender为0,根据age排序,简单分页:

List employees = emplopyeeDao.selectList(

new EntityWrapper()

.eq("gender",0)

.orderBy("age")//直接orderby 是升序,asc

.last("desc limit 1,3")//在sql语句后面追加last里面的内容(改为降序,同时分页)

);

注:简单分页是指不用page对象进行分页。orderBy方法就是根据传入的column进行升序排序,若要降序,可以使用orderByDesc方法,也可以如案例中所示用last方法;last方法就是将last方法里面的value值追加到sql语句的后面,在该案例中,最后的sql语句就变为select ······ order by desc limit 1, 3,追加了desc limit 1,3所以可以进行降序排序和分页。

4、分页查询年龄在18 - 50且gender为0、姓名为tom的用户:

条件构造器除了EntityWrapper,还有Condition。用Condition来处理一下这个需求:

List employees = emplopyeeDao.selectPage(

new Page(1,2),

Condition.create()

.between("age",18,50)

.eq("gender","0")

);

注:Condition和EntityWrapper的区别就是,创建条件构造器时,EntityWrapper是new出来的,而Condition是调create方法创建出来。

5、根据条件更新:

@Test

public void testEntityWrapperUpdate(){

Employee employee = new Employee();

employee.setLastName("苍老师");

employee.setEmail("cjk@sina.com");

employee.setGender(0);

emplopyeeDao.update(employee,

new EntityWrapper()

.eq("last_name","tom")

.eq("age",25)

);

}

注:该案例表示把last_name为tom,age为25的所有用户的信息更新为employee中设置的信息。

6、根据条件删除:

emplopyeeDao.delete(

new EntityWrapper()

.eq("last_name","tom")

.eq("age",16)

);

注:该案例表示把last_name为tom、age为16的所有用户删除。

总结:

以上便是mybatis-plus的入门教程,介绍了其如何与spring整合、通用crud的使用、全局策略的配置以及条件构造器的使用,但是这并不是MP的所有内容,其强大不限于此。避免篇幅过长,想了解mybatis-plus的更多用法请参考《mybatis-plus的使用 ------ 进阶》,同时在文末会给出案例的源码。

以上内容属于个人笔记整理,如有错误,欢迎批评指正!

tsd3dmapper软件使用方法_mybatis-plus的使用 ------ 入门相关推荐

  1. tsd3dmapper软件使用方法_TOYO模组选型软件使用方法

    直线模组选型对于机械工程师和采购人员来说,是最基础的硬性要求.直线滑台模组选型中性能是其中之一,还要根据需求考虑:相对应的,在选购直线滑台模组时,先根据下面几点需求来断定直线滑台模组的详细参数需求. ...

  2. tsd3dmapper软件使用方法_TS文件连接器:如何快速合并TS文件?

    吴川 华南区技术负责人 概要 TS是"Transport Stream"的缩写,它是一种音视频封装格式,格式全称为MPEG2-TS.当我们想合并多个TS文件,或者想将TS文件与其他 ...

  3. tsd3dmapper软件使用方法_Mapper

    软件简介 一.通用 Mapper 的用途 ? 我个人最早用 MyBatis 时,先是完全手写,然后用上了 MyBatis 代码生成器(简称为 MBG),在使用 MBG 过程中,发现一个很麻烦的问题,如 ...

  4. tsd3dmapper软件使用方法_三维图片重建软件 Pix4Dmapper

    领先的摄影测量软件,可进行专业无人机测绘 将原始图像连接到3D重建的每个点的独特环境,以可视方式验证并提高项目的准确性. 图像 处理从任何角度.任何空中或地面.有人或无人平台拍摄的图像. 视频(mp4 ...

  5. tsd3dmapper软件使用方法_如何使用Global Mapper软件创建基站点图层

    步骤三 设置"通用ASCII文本文件导入选项",完成后即可批量导入点.设置"通用ASCII文本文件导入选项"是关键的步骤.主要要点如下: 1.导入类型 这里我们 ...

  6. 面向过程的软件设计方法

    面向过程的软件设计方法 前面主要是对系统的分析,从而明确我们系统的逻辑模型.也就是说,通过前面几章我们清楚了"系统需要做什么?".而软件设计阶段主要任务则是要实现系统逻辑模型向物流 ...

  7. python画简单的图形的代码-Python实现画图软件功能方法详解

    概述 虽然Python的强项在人工智能,数据处理方面,但是对于日常简单的应用,Python也提供了非常友好的支持(如:Tkinter),本文主要一个简单的画图小软件,简述Python在GUI(图形用户 ...

  8. 单片机 10种软件滤波方法的示例程序

    单片机学习笔记_10种软件滤波方法的示例程序 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad(); 1.限副滤波 /*  A值可根据实际情况调整     v ...

  9. ubuntu更换软件源方法和实验成功软件源地址

    ubuntu更换软件源方法 转载部分内容: 这些bionic.main.restricted.universe.multiverse是什么意思呢,该怎么修改才对,实在是让人头大.简单了解一下:bion ...

最新文章

  1. IDEA中用好Lombok,撸码效率至少提升5倍
  2. c# 四舍五入、上取整、下取整
  3. 【BZOJ】1679: [Usaco2005 Jan]Moo Volume 牛的呼声(数学)
  4. 4~20mA模拟输出(电流环)应用笔记(转)
  5. 理解ASP.NET MVC中的ActionResult
  6. 使用正则表达式把关键字替换加粗
  7. 3月24 matlab函数polyfit(x,y,n)分析
  8. 八位数字后加逗号_【PTE干货】英文数字的读法
  9. android 跨应用服务,跨应用启动Service,出现空指针
  10. 51地图API接口的初次使用
  11. 无人车路径规划算法---(4)基于搜索的路径规划算法 II(贪心/Astar)
  12. PAT甲级 1094 最大的一代
  13. new和delete与内存分配
  14. 广告sdk是什么意思?广告SDK分类及用途介绍
  15. 音频质量的评价方法:简单梳理
  16. excel透视表 统计结果 累加
  17. 第一话 QQ盗号攻防战
  18. G-08 魔王语言解释 (20 分)
  19. Google 面试题 | 判断字符串是否可由重复子字符串组成
  20. 在金融行业中,直播获客应该怎么做呢?

热门文章

  1. eclipse无线循环输出时,怎样关闭
  2. python详细安装教程-超详细Python与PyCharm安装教程,看这一篇就够了
  3. python爬虫教程-Python爬虫入门教程——爬取自己的博客园博客
  4. 从零开始学习python编程-从零开始学python编程一:首行代码
  5. 一张图学会python3语法-一张图理清 Python3 所有知识点
  6. python培训价目表-python培训班费用在多少?
  7. python从入门到放弃 图-python从入门到放弃(二)
  8. 机器学习--用朴素贝叶斯分类法辨别男女声音
  9. VScode Settings Sync同步功能设置
  10. 视频特性TI(时间信息)和SI(空间信息)的计算工具:TIandSI-压缩码流版