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

<!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.14.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>4.3.14.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>4.3.14.RELEASE</version><scope>test</scope></dependency><!-- mp 依赖 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>2.3</version></dependency>

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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"><param name="Encoding" value="UTF-8" /><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="%-5p %d{MM-dd
HH:mm:ss,SSS} %m (%F:%L) n" /></layout></appender><logger name="java.sql"><level value="debug" /></logger><logger name="org.apache.ibatis"><level value="info" /></logger><root><level value="debug" /><appender-ref ref="STDOUT" /></root>
</log4j:configuration>

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:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>

5、spring-dao.xml:

 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"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.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"><!-- 配置整合mybatis-plus过程 --><!-- 1、配置数据库相关参数properties的属性:${url} --><context:property-placeholder location="classpath:jdbc.properties" />
<!-- 2、配置数据库连接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/>
</bean>
<!-- mybatis的sqlsessionFactorybean:org.mybatis.spring.SqlSessionFactoryBean--><!-- 3、配置mybatis-plus的sqlSessionFactory --><bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis-config.xml"/><property name="typeAliasesPackage" value="com.zhu.mybatisplus.entity"/></bean><!-- 4、DAO接口所在包名,Spring会自动查找其下的类 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.zhu.mybatisplus.dao" /><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/></bean></beans>

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<Employee> {
}

8、测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-dao.xml"})
public class test {@Autowiredprivate DataSource dataSource;@Testpublic void testDataSource() throws SQLException {System.out.println(dataSource.getConnection());}
}

本文所有代码本人均亲自测试过,本文涉及代码又较多,为了不影响篇幅,故非必要处不再截图。接下来的所有操作都是基于此整合好的项目。
三、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 {@Autowiredprivate EmplopyeeDao emplopyeeDao;@Testpublic 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<String,Object> columnMap = new HashMap<>();
columnMap.put("last_name","东方不败");//写表中的列名
columnMap.put("gender","1");
List<Employee> employees = emplopyeeDao.selectByMap(columnMap);
System.out.println(employees.size());

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

List<Integer> idList = new ArrayList<>();
idList.add(1);
idList.add(2);
idList.add(3);
List<Employee> employees = emplopyeeDao.selectBatchIds(idList);
System.out.println(employees);

注:把需要查询的id都add到list集合中,然后调用selectBatchIds方法,传入该list集合即可,该方法返回的是对应id的所有记录,所有返回值也是用list接收。(5)、分页查询:
List<Employee> 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<String,Object> columnMap = new HashMap<>();
columnMap.put("gender",0);
columnMap.put("age",18);
emplopyeeDao.deleteByMap(columnMap);

注:该方法与selectByMap类似,将条件封装在columnMap中,然后调用deleteByMap方法,传入columnMap即可,返回值是Integer类型,表示影响的行数。(3)、根据id批量删除:

 List<Integer> idList = new ArrayList<>();idList.add(1);idList.add(2);emplopyeeDao.deleteBatchIds(idList);

注:该方法和selectBatchIds类似,把需要删除的记录的id装进idList,然后调用deleteBatchIds,传入idList即可。
四、全局策略配置:
通过上面的小案例我们可以发现,实体类需要加@TableName注解指定数据库表名,通过@TableId注解指定id的增长策略。实体类少倒也无所谓,实体类一多的话也麻烦。所以可以在spring-dao.xml的文件中进行全局策略配置。

<!-- 5、mybatisplus的全局策略配置 -->
<bean id="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"><!-- 2.3版本后,驼峰命名默认值就是true,所以可不配置 --><!--<property name="dbColumnUnderline" value="true"/>--><!-- 全局主键自增策略,0表示auto --><property name="idType" value="0"/><!-- 全局表前缀配置 --><property name="tablePrefix" value="tb_"/>
</bean>

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

<!-- 3、配置mybatisplus的sqlSessionFactory -->
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="configLocation" value="classpath:mybatis-config.xml"/><property name="typeAliasesPackage" value="com.zhu.mybatisplus.entity"/><!-- 注入全局配置 --><property name="globalConfig" ref="globalConfiguration"/>
</bean>

如此一来,实体类中的@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<Employee> employees = emplopyeeDao.selectPage(new Page<Employee>(1,3),new EntityWrapper<Employee>().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<Employee> employees = emplopyeeDao.selectList(new EntityWrapper<Employee>().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<Employee> employees = emplopyeeDao.selectList(new EntityWrapper<Employee>().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<Employee> employees = emplopyeeDao.selectPage(new Page<Employee>(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<Employee>().eq("last_name","tom").eq("age",25));
}

注:该案例表示把last_name为tom,age为25的所有用户的信息更新为employee中设置的信息。6、根据条件删除:

emplopyeeDao.delete(new EntityWrapper<Employee>().eq("last_name","tom").eq("age",16)
);

注:该案例表示把last_name为tom、age为16的所有用户删除。
总结:
以上便是mybatis-plus的入门教程,介绍了其如何与spring整合、通用crud的使用、全局策略的配置以及条件构造器的使用,但是这并不是MP的所有内容,其强大不限于此。

mybatis plus 使用函数_mybatis-plus的使用 ------ 入门相关推荐

  1. mybatis 调用 oracle函数_MyBatis之启动分析(一)

    作者丨ytao 来源丨ytao(ytao-blog) 前言 MyBatis 作为目前最常用的持久层框架之一,分析其源码,对我们的使用过程中可更好的运用它.本系列基于 mybatis-3.4.6进行分析 ...

  2. mybatis可以用oracle,使用MyBatis调用oracle函数(基于注释)

    我需要使用注解在MyBatis中调用Oracle函数.使用MyBatis调用oracle函数(基于注释) 我的映射: @Select("{ CALL #{outParam, jdbcType ...

  3. 函数中的apply,call入门介绍

    ###函数中的apply,call入门   牵扯到apply,call就要先说一下它们和函数的渊源 Javascript函数既是也是对象   它和其它的javascript对象没有什么区别.并且每个函 ...

  4. else if函数 c语言,C语言入门 — if else

    C语言入门简单条件判断语句,if else, 本文章会使用到< 1.if else 可以简单的理解为"如果 就 否则"的语句,下面以举例子来进行解释,使用if else 判断 ...

  5. mybatis对mysql if函数_Mybatis使用mysql函数if出现错误

    在mybatis的mapper文件中使用IF函数的时候,莫名其妙的报错,但是在sql语句是正确的,可以在navcat中运行,但是在mapper文件中使用就是报错,查阅资料发现说什么情况的都有,有说缺少 ...

  6. mysql的映射文件调用函数_MyBatis中调用存储过程和函数

    一.调用存储过程 1.首先在数据库中定义存储过程,定义的存储过程的代码如下: //定义存储过程 create or replace procedure pag_add(p1 varchar2,p2 v ...

  7. mybatis 取查询值_Mybatis --- 映射文件、参数处理、参数值的获取、select元素

    这样就可以在insert函数中获取新添加的用户的 id主键,否则获取不到 select * from student where id = #{id} insert into student(name ...

  8. mybatis 不生效 参数_MyBatis参数使用@Param注解获取不到自增id问题

    一.背景 群里有个哥们分享了一个mybatis的小"坑". "分享一个菜鸡点:mybatis中使用@param注解后,要keyProperty="注解名.id& ...

  9. Mybatis使用concat函数

    开发时遇到一个需求,用户角色存在变更,使用关联关系浪费空间,于是想到使用在数据库字段中存放字符串,以,分割,这样获取到数据之后使用AuthorityUtils.commaSeparatedString ...

  10. mybatis mysql 模糊查询语句_mybatis模糊查询语句及注意事项

    select count(*) from t_user loginacct like concat("%",#{queryText},"%") 1.动态查询语句 ...

最新文章

  1. Python+OpenCV 图像处理系列(3)—— 画线、矩形、画圆、画椭圆、画多边形
  2. HTTP协议处理流程
  3. python导入excel数据-如何把python中的数据导入excel
  4. Windows纸牌×××式计分法
  5. 初步学习Linux文件基本属性和Cygwin STATUS_ACCESS_VIOLATION 错误
  6. vim在每行行首或行尾添加/删除内容
  7. 计算机Java程序设计标准讲义
  8. 安卓开发工程师面试题!春招我借这份PDF的复习思路,不吃透都对不起自己
  9. 数字化技术浪潮下,医院临床科研如何「华丽变身」
  10. sigprocmask()函数实例详解,设置信号规定时间堵塞,取消信号堵塞
  11. BBE Sound Sonic Sweet(激励混音效果器)v4.2.0 绿色版
  12. Python网络爬虫开发实战使用XPath,xpath的多种用法
  13. 一个页面多个ajax统一loading,页面有多个向后台发送的请求加载过程中显示loading,加载完成loading消失...
  14. 使用Caronte在CTF比赛中完成网络流量分析
  15. 开源demo| 你画我猜——让你的生活更有趣
  16. c语言中特殊符号怎么定义,C语言特殊符号意义
  17. 飞浆论文复现:用于图像到图像翻译的具有自适应层实例化的非监督的生成对抗网络
  18. 实战为上!深入解析20个运维命令
  19. 达梦数据库导入dmp文件
  20. 整理:console的用法

热门文章

  1. 登顶 GitHub 趋势榜,标星1.8k:200 行 JS 代码让画面人物瞬间消失!
  2. 深度揭秘铁路 12306 的架构
  3. 3 年后端、4 年前端,聊聊用户认证鉴权
  4. 大数据、物联网、AI 等技术正当时!
  5. 生物信息 Python 库 - Dash Bio 究竟厉害在哪里?
  6. 赶超 Python 与 Java,JavaScript 问鼎最受欢迎的编程语言
  7. AI 外挂!百度 Lens 是如何突破人眼视觉极限的?
  8. 设计糟糕的 RESTful API 就是在浪费时间!
  9. “腾讯也感受到危机了!”
  10. Android 9 带着 AI 来了,为什么我们还停留在 6?