点击上方“Java基基”,选择“设为星标”

做积极的人,而不是积极废人!

源码精品专栏

  • 原创 | Java 2020 超神之路,很肝~

  • 中文详细注释的开源项目

  • RPC 框架 Dubbo 源码解析

  • 网络应用框架 Netty 源码解析

  • 消息中间件 RocketMQ 源码解析

  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析

  • 作业调度中间件 Elastic-Job 源码解析

  • 分布式事务中间件 TCC-Transaction 源码解析

  • Eureka 和 Hystrix 源码解析

  • Java 并发源码

来源:me.csdn.net/Danny_idea

以前在开发的时候,使用mybatis的时候,经常都需要先配置xml映射文件,然后每条sql操作都需要自己进行手动编写,对于一些复杂的sql这么来操作确实有必要,但是如果只是一些非常简单的insert,update,delete,select这类型的语句而言,也需要开发人员花费额外的时间进行手动编写的话,确实费时又费力。

能否为mybatis特别定制一套能够自动为我们生成一些简单sql功能,同时又支持我们进行自定义sql设置功能的强大框架呢?

mybatis plus因此诞生了。

这只小鸟太魔性了

mybatis plus是一款专门针对于传统MyBatis开发中sql需要手动进行映射配置繁琐缺点的一款框架技术,这款框架技术提供了十分丰富的api供开发者们使用,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

Mybatis plus到底有多方便呢,我们闲话不多说,直接上手代码实例来进行演示:

首先我们需要导入一些相关的pom依赖配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.sise</groupId><artifactId>mybatis-plus</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.9.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>com.baomidou</groupId><artifactId>mybatisplus-spring-boot-starter</artifactId><version>1.0.5</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>2.3</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>

导入了jar包之后,为了方便测试,我们首先在数据库里面搭建相关的数据表信息

CREATE TABLE `teacher` (`id` int(11) NOT NULL AUTO_INCREMENT,`teacher_name` varchar(60) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,`teacher_pwd` varchar(60) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=gbk;

该表对应的实体类:

package com.sise.model;import com.baomidou.mybatisplus.annotations.TableName;/*** @author idea* @data 2019/5/24*/
@TableName(value = "teacher")
public class Teacher {private int id;private String teacherName;private String teacherPwd;public int getId() {return id;}public Teacher() {}public Teacher(int id) {this.id = id;}public Teacher setId(int id) {this.id = id;return this;}public String getTeacherName() {return teacherName;}public Teacher setTeacherName(String teacherName) {this.teacherName = teacherName;return this;}public String getTeacherPwd() {return teacherPwd;}public Teacher setTeacherPwd(String teacherPwd) {this.teacherPwd = teacherPwd;return this;}@Overridepublic String toString() {return "Teacher{" +"id=" + id +", teacherName='" + teacherName + '\'' +", teacherPwd='" + teacherPwd + '\'' +'}';}
}

通常我们在开发的时候都会自定义一个Dao层,mybatis plus里面提供了一个叫做BaseMapper的接口,内部已经提供了相当多的crud操作函数的封装。可以来仔细查看一下该接口的内容:

/*** Copyright (c) 2011-2020, hubin (jobob@qq.com).* <p>* Licensed under the Apache License, Version 2.0 (the "License"); you may not* use this file except in compliance with the License. You may obtain a copy of* the License at* <p>* http://www.apache.org/licenses/LICENSE-2.0* <p>* Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the* License for the specific language governing permissions and limitations under* the License.*/
package com.baomidou.mybatisplus.mapper;import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;/*** <p>* Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能* </p>* <p>* 这个 Mapper 支持 id 泛型* </p>** @author hubin* @Date 2016-01-23*/
public interface BaseMapper<T> {/*** <p>* 插入一条记录* </p>** @param entity 实体对象* @return int*/Integer insert(T entity);/*** <p>* 插入一条记录* </p>** @param entity 实体对象* @return int*/Integer insertAllColumn(T entity);/*** <p>* 根据 ID 删除* </p>** @param id 主键ID* @return int*/Integer deleteById(Serializable id);/*** <p>* 根据 columnMap 条件,删除记录* </p>** @param columnMap 表字段 map 对象* @return int*/Integer deleteByMap(@Param("cm") Map<String, Object> columnMap);/*** <p>* 根据 entity 条件,删除记录* </p>** @param wrapper 实体对象封装操作类(可以为 null)* @return int*/Integer delete(@Param("ew") Wrapper<T> wrapper);/*** <p>* 删除(根据ID 批量删除)* </p>** @param idList 主键ID列表* @return int*/Integer deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);/*** <p>* 根据 ID 修改* </p>** @param entity 实体对象* @return int*/Integer updateById(@Param("et") T entity);/*** <p>* 根据 ID 修改* </p>** @param entity 实体对象* @return int*/Integer updateAllColumnById(@Param("et") T entity);/*** <p>* 根据 whereEntity 条件,更新记录* </p>** @param entity  实体对象* @param wrapper 实体对象封装操作类(可以为 null)* @return*/Integer update(@Param("et") T entity, @Param("ew") Wrapper<T> wrapper);/*** <p>* 根据 whereEntity 条件,更新记录* </p>** @param setStr  set字符串* @param wrapper 实体对象封装操作类(可以为 null)* @return*/Integer updateForSet(@Param("setStr") String setStr, @Param("ew") Wrapper<T> wrapper);/*** <p>* 根据 ID 查询* </p>** @param id 主键ID* @return T*/T selectById(Serializable id);/*** <p>* 查询(根据ID 批量查询)* </p>** @param idList 主键ID列表* @return List<T>*/List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);/*** <p>* 查询(根据 columnMap 条件)* </p>** @param columnMap 表字段 map 对象* @return List<T>*/List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);/*** <p>* 根据 entity 条件,查询一条记录* </p>** @param entity 实体对象* @return T*/T selectOne(@Param("ew") T entity);/*** <p>* 根据 Wrapper 条件,查询总记录数* </p>** @param wrapper 实体对象* @return int*/Integer selectCount(@Param("ew") Wrapper<T> wrapper);/*** <p>* 根据 entity 条件,查询全部记录* </p>** @param wrapper 实体对象封装操作类(可以为 null)* @return List<T>*/List<T> selectList(@Param("ew") Wrapper<T> wrapper);/*** <p>* 根据 Wrapper 条件,查询全部记录* </p>** @param wrapper 实体对象封装操作类(可以为 null)* @return List<T>*/List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> wrapper);/*** <p>* 根据 Wrapper 条件,查询全部记录* 注意: 只返回第一个字段的值* </p>** @param wrapper 实体对象封装操作类(可以为 null)* @return List<Object>*/List<Object> selectObjs(@Param("ew") Wrapper<T> wrapper);/*** <p>* 根据 entity 条件,查询全部记录(并翻页)* </p>** @param rowBounds 分页查询条件(可以为 RowBounds.DEFAULT)* @param wrapper   实体对象封装操作类(可以为 null)* @return List<T>*/List<T> selectPage(RowBounds rowBounds, @Param("ew") Wrapper<T> wrapper);/*** <p>* 根据 Wrapper 条件,查询全部记录(并翻页)* </p>** @param rowBounds 分页查询条件(可以为 RowBounds.DEFAULT)* @param wrapper   实体对象封装操作类* @return List<Map<String, Object>>*/List<Map<String, Object>> selectMapsPage(RowBounds rowBounds, @Param("ew") Wrapper<T> wrapper);}

这些内置的功能都是已经提前自定义好了的,因此对于一些常用的简单的sql我们可以避免使用手动拼接的方式来实现,大大提升了开发人员的开发效率,结合文章上边所说的教师对象,我们自定义一个Mapper接口用于实现crud的操作:

package com.sise.dao;import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.sise.model.Teacher;
import org.apache.ibatis.annotations.Mapper;/*** @author idea* @data 2019/5/24*/
@Mapper
public interface TeacherMapper extends BaseMapper<Teacher> {
}

为了方便测试,我直接选择了在controller里面引用dao函数的功能。

1.提前定义好的插入功能:

BaseMapper里面封装了已经定义好的insert语句,能够方便我们直接调用,无须自己手动编写sql

@GetMapping(value = "/insert")public void insert(){Teacher  teacher=new Teacher();teacher.setTeacherName(createRandomStr(6));teacher.setTeacherPwd(createRandomStr(6));teacherMapper.insert(teacher);}/*** 生成随机字符串** @return*/private static String createRandomStr(int length){String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";Random random=new Random();StringBuffer sb=new StringBuffer();for(int i=0;i<length;i++){int number=random.nextInt(str.length());sb.append(str.charAt(number));}return sb.toString();}

生成的sql语句:

INSERT INTO teacher ( id, teacher_name, teacher_pwd ) VALUES ( 0, 'mNJXIf', 'LKTnam' );

2.提前定义好的删除功能

BaseMapper里面提供有已经定义好的delete功能,

   @GetMapping(value = "/delete")public void delete(){Teacher  teacher=new Teacher();teacher.setId(11);EntityWrapper entityWrapper=new EntityWrapper(teacher);teacherMapper.delete(entityWrapper);}

生成的sql语句:

DELETE FROM teacher WHERE id=11;

3.提前定义好的更新功能

BaseMapper里面定义了相关的update功能,但是在进行update的时候有个地方需要注意,来看看下边这段代码先

    @GetMapping(value = "/update")public void update(){//update的判断条件EntityWrapper entityWrapper=new EntityWrapper(new Teacher(1));//更新之后的对象Teacher teacher=new Teacher();teacher.setTeacherPwd("new-pwd");teacherMapper.update(teacher,entityWrapper);}

生成的sql语句:

UPDATE teacher SET teacher_pwd='new-pwd'  WHERE id=1;

mybatis-plus里面提供了一个叫做EntityWrapper的对象封装操作类,通过传入相关的Entity来判断传入的查询参数,这里的使用让我回想起了以前用hibernate的那种味道,不得不说这种功能的设计确实帮开发者的开发效率提升了很多。

以前写更新语句的时候,经常是需要在xml里面进行非常多繁琐耗时的sql拼接工作,现在mybatis-plus通过EntityWrapper这个封装类,大大节省了相应时间。

4.根据指定id进行查询

mybatis-plus也默认提供了关键字查询的功能,可以将查询参数通过对象Entity的形式注入,非常方便。

ps:mybatis-plus已经默认带有了sql注入的预防功能,因此这点可以放心使用。

  @GetMapping(value = "/selectAllById")public Teacher selectByTeacherName(int id){return teacherMapper.selectOne(new Teacher(id));}

生成的sql语句:

SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwdFROM teacherWHERE id=0;

5.使用Map来进行多关键字的查询

有些时候,除了使用查询时候使用Entity关键字来进行查询之外,还可以通过使用Map的形式来进行多关键字的搜索实现,相关代码如下所示:

    @GetMapping(value = "/selectAllByMap")public List<Teacher> selectAllByEntity(String name){Map<String,Object> hashMap=new HashMap<>();hashMap.put("teacher_name",name);return teacherMapper.selectByMap(hashMap);}

注意,这里的map放入的key值需要和表里面的字段命名一致。

生成的sql语句:

SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwdFROM teacherWHERE teacher_name = 'qwe';

6.统计查询

    @GetMapping(value = "/selectCountByEntity")public int selectCount(String name){Teacher teacher=new Teacher();teacher.setId(1);teacher.setTeacherName(name);EntityWrapper<Teacher> entityWrapper=new EntityWrapper<>(teacher);return teacherMapper.selectCount(entityWrapper);}

生成的sql语句:

SELECT COUNT(1)  FROM teacher  WHERE id=1 AND teacher_name='qwe';

7.分页查询

在实际开发中,分页查询功能一直是非常普遍需要运用到的一点,在mybatis-plus里面,他提供了一个叫做Page的类供我们使用,相应的代码如下所示:

   @GetMapping(value = "/selectAllInPage")public List<Teacher> selectAllInPage(int pageNumber,int pageSize){Page<Teacher> page =new Page<>(pageNumber,pageSize);EntityWrapper<Teacher> entityWrapper = new EntityWrapper<>();entityWrapper.ge("id", 1);return teacherMapper.selectPage(page,entityWrapper);}

生成的sql语句:

SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd  FROM teacher  WHERE (id >= 1) LIMIT 0,1;

mybatis-plus使用的分页技术是传统的 limit 物理分页方式。

8. in 查询

查询的时候,如果需要使用in查询的话,可以使用selectBatchIds这个api功能:

    @GetMapping(value = "/selectInIdArr")public List<Teacher> selectInIdArr(){List<Integer> idList=new ArrayList<>();idList.add(1);idList.add(10);idList.add(11);return teacherMapper.selectBatchIds(idList);}

生成的sql语句:

SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE id IN ( 1 , 10 , 11 );

9.复杂条件查询

针对于比较复杂的多条件查询,mybatis-plus内部提供的EntityWrapper支持有许多丰富的查询api功能供我们使用。

为了方便理解,下边通过实际的代码案例来进行解释

*allEq查询*(相当于条件全部都要求满足的情况)

 @GetMapping(value = "/selectAllByWrapper1")public  List<Teacher> selectAllByWrapper1(){Map<String,Object> map=new HashMap<>();map.put("teacher_name","name");map.put("teacher_pwd","pwd");EntityWrapper entity=new EntityWrapper();entity.allEq(map);return teacherMapper.selectList(entity);}

生成的sql语句:

SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwdFROM teacherWHERE (teacher_pwd = 'pwd' AND teacher_name = 'name');

*ne查询*

   @GetMapping(value = "/selectAllByWrapper3")public List<Teacher> selectAllByWrapper3(){EntityWrapper entity=new EntityWrapper();entity.ne("teacher_name","name");return teacherMapper.selectList(entity);}

生成的sql语句:

SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwdFROM teacherWHERE (teacher_name <> 'name');

*eq查询*

    @GetMapping(value = "/selectAllByWrapper2")public List<Teacher> selectAllByWrapper2(){EntityWrapper entity=new EntityWrapper();entity.eq("teacher_name","name");return teacherMapper.selectList(entity);}

生成的sql语句:

SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwdFROM teacherWHERE (teacher_name = 'name');

*复杂的多条件查询:*

  @GetMapping(value = "/selectAllByWrapper4")public  List<Teacher> selectAllByWrapper4(){EntityWrapper entity=new EntityWrapper();entity.gt("id","0");entity.le("id",11);entity.ne("teacher_name","null_name");entity.like("teacher_name","tt");entity.notLike("teacher_pwd","sadas");entity.orderBy("id");return teacherMapper.selectList(entity);}

生成的sql语句:

*组合的and和or条件查询:*

生成的sql语句:

SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwdFROM teacherWHERE (id>1) OR (id=0 AND teacher_name='name' AND teacher_pwd IS NULL);

*having和groupby查询:*

生成的sql语句:

SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwdFROM teacher GROUP BY teacher_name HAVING (id>1);

除了常规的基于Mapper的直接操作数据库操作功能以外,Mybatis-plus内部还提供了一个叫做IService的接口,内部含有很多丰富的CRUD操作功能可以供开发人员调用:

/*** Copyright (c) 2011-2016, hubin (jobob@qq.com).* <p>* Licensed under the Apache License, Version 2.0 (the "License"); you may not* use this file except in compliance with the License. You may obtain a copy of* the License at* <p>* http://www.apache.org/licenses/LICENSE-2.0* <p>* Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the* License for the specific language governing permissions and limitations under* the License.*/
package com.baomidou.mybatisplus.service;import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;/*** <p>* 顶级 Service* </p>** @author hubin* @Date 2016-04-20*/
public interface IService<T> {/*** <p>* 插入一条记录(选择字段,策略插入)* </p>** @param entity 实体对象* @return boolean*/boolean insert(T entity);/*** <p>* 插入一条记录(全部字段)* </p>** @param entity 实体对象* @return boolean*/boolean insertAllColumn(T entity);/*** <p>* 插入(批量),该方法不适合 Oracle* </p>** @param entityList 实体对象列表* @return boolean*/boolean insertBatch(List<T> entityList);/*** <p>* 插入(批量)* </p>** @param entityList 实体对象列表* @param batchSize  插入批次数量* @return boolean*/boolean insertBatch(List<T> entityList, int batchSize);/*** <p>* 批量修改插入* </p>** @param entityList 实体对象列表* @return boolean*/boolean insertOrUpdateBatch(List<T> entityList);/*** <p>* 批量修改插入* </p>** @param entityList 实体对象列表* @param batchSize* @return boolean*/boolean insertOrUpdateBatch(List<T> entityList, int batchSize);/*** <p>* 批量修改或插入全部字段* </p>** @param entityList 实体对象列表* @return boolean*/boolean insertOrUpdateAllColumnBatch(List<T> entityList);/*** 批量修改或插入全部字段** @param entityList 实体对象列表* @param batchSize* @return boolean*/boolean insertOrUpdateAllColumnBatch(List<T> entityList, int batchSize);/*** <p>* 根据 ID 删除* </p>** @param id 主键ID* @return boolean*/boolean deleteById(Serializable id);/*** <p>* 根据 columnMap 条件,删除记录* </p>** @param columnMap 表字段 map 对象* @return boolean*/boolean deleteByMap(Map<String, Object> columnMap);/*** <p>* 根据 entity 条件,删除记录* </p>** @param wrapper 实体包装类 {@link Wrapper}* @return boolean*/boolean delete(Wrapper<T> wrapper);/*** <p>* 删除(根据ID 批量删除)* </p>** @param idList 主键ID列表* @return boolean*/boolean deleteBatchIds(Collection<? extends Serializable> idList);/*** <p>* 根据 ID 选择修改* </p>** @param entity 实体对象* @return boolean*/boolean updateById(T entity);/*** <p>* 根据 ID 修改全部字段* </p>** @param entity 实体对象* @return boolean*/boolean updateAllColumnById(T entity);/*** <p>* 根据 whereEntity 条件,更新记录* </p>** @param entity  实体对象* @param wrapper 实体包装类 {@link Wrapper}* @return boolean*/boolean update(T entity, Wrapper<T> wrapper);/*** <p>* 根据 whereEntity 条件,自定义set值更新记录* </p>** @param setStr  set值字符串* @param wrapper 实体包装类 {@link Wrapper}* @return boolean*/boolean updateForSet(String setStr, Wrapper<T> wrapper);/*** <p>* 根据ID 批量更新* </p>** @param entityList 实体对象列表* @return boolean*/boolean updateBatchById(List<T> entityList);/*** <p>* 根据ID 批量更新* </p>** @param entityList 实体对象列表* @param batchSize  更新批次数量* @return boolean*/boolean updateBatchById(List<T> entityList, int batchSize);/*** <p>* 根据ID 批量更新全部字段* </p>** @param entityList 实体对象列表* @return boolean*/boolean updateAllColumnBatchById(List<T> entityList);/*** <p>* 根据ID 批量更新全部字段* </p>** @param entityList 实体对象列表* @param batchSize  更新批次数量* @return boolean*/boolean updateAllColumnBatchById(List<T> entityList, int batchSize);/*** <p>* TableId 注解存在更新记录,否插入一条记录* </p>** @param entity 实体对象* @return boolean*/boolean insertOrUpdate(T entity);/*** 插入或修改一条记录的全部字段** @param entity 实体对象* @return boolean*/boolean insertOrUpdateAllColumn(T entity);/*** <p>* 根据 ID 查询* </p>** @param id 主键ID* @return T*/T selectById(Serializable id);/*** <p>* 查询(根据ID 批量查询)* </p>** @param idList 主键ID列表* @return List<T>*/List<T> selectBatchIds(Collection<? extends Serializable> idList);/*** <p>* 查询(根据 columnMap 条件)* </p>** @param columnMap 表字段 map 对象* @return List<T>*/List<T> selectByMap(Map<String, Object> columnMap);/*** <p>* 根据 Wrapper,查询一条记录* </p>** @param wrapper 实体对象* @return T*/T selectOne(Wrapper<T> wrapper);/*** <p>* 根据 Wrapper,查询一条记录* </p>** @param wrapper {@link Wrapper}* @return Map<String,Object>*/Map<String, Object> selectMap(Wrapper<T> wrapper);/*** <p>* 根据 Wrapper,查询一条记录* </p>** @param wrapper {@link Wrapper}* @return Object*/Object selectObj(Wrapper<T> wrapper);/*** <p>* 根据 Wrapper 条件,查询总记录数* </p>** @param wrapper 实体对象* @return int*/int selectCount(Wrapper<T> wrapper);/*** <p>* 查询列表* </p>** @param wrapper 实体包装类 {@link Wrapper}* @return*/List<T> selectList(Wrapper<T> wrapper);/*** <p>* 翻页查询* </p>** @param page 翻页对象* @return*/Page<T> selectPage(Page<T> page);/*** <p>* 查询列表* </p>** @param wrapper {@link Wrapper}* @return*/List<Map<String, Object>> selectMaps(Wrapper<T> wrapper);/*** <p>* 根据 Wrapper 条件,查询全部记录* </p>** @param wrapper 实体对象封装操作类(可以为 null)* @return List<Object>*/List<Object> selectObjs(Wrapper<T> wrapper);/*** <p>* 翻页查询* </p>** @param page    翻页对象* @param wrapper {@link Wrapper}* @return*/@SuppressWarnings("rawtypes")Page<Map<String, Object>> selectMapsPage(Page page, Wrapper<T> wrapper);/*** <p>* 翻页查询* </p>** @param page    翻页对象* @param wrapper 实体包装类 {@link Wrapper}* @return*/Page<T> selectPage(Page<T> page, Wrapper<T> wrapper);}

在使用的过程中,mybatis-plus还能兼容原有mybatis的xml和注解模式的sql拼写功能。

mybatis-plus这种集mybatis与hibernate的优点一起的框架。提供了hibernate的单表CRUD操作的方便同时,又保留了mybatis的特性。

不得不说mybatis-plus的出现搭配上原有的mybatis框架极大的促进了开发效率的提升,同时基友搭配,效率翻倍。因此也有人把它们比做成魂斗罗里面的两兄弟,基友搭配,效率翻倍。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

提升开发效率的一款 mybatis 开发神器相关推荐

  1. 提升开发效率的一款mybatis开发神器

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 本篇同步更新地址; https://me.csdn.net/Dan ...

  2. 提升工作效率的五款实用工具软件及其应用心得

    本文介绍了五款实用的工具软件,包括Microsoft Office Suite.Adobe Creative Suite.GitHub.Slack和Zoom,并详细阐述了它们的应用场景.能解决的问题和 ...

  3. 提升工作效率的7款设计软件

    毕业后,我一直从事的UI设计工作,入行以来接触过各类的设计软件,为了提升工作效率,基本上一有软件推出我就会去尝试,下面就说说几个建议收藏级别的给大家参考. Pixso Pixso是一款专门为国内设计团 ...

  4. python开发效率怎样提高_python 提高开发效率的5个小技巧

    很多时候学习是一种难者不会,会者不难的事情. 下面的5个python技巧是性价比极高的知识点,一学就会,不难但是相当管用. 使用交互模式 使用python -i xxxx.py可以直接进入python ...

  5. python语言开发效率高吗_Python 的开发效率真的比 Java高吗?

    几个例子. 爬虫领域,几年前就用Scrapy抓百度,新浪,股吧等各种东西. 五分钟写好一个小爬虫,爽到暴有没有?当年我就是靠教人写爬虫...才骗到小妹妹跟我约会的. 文本处理,在服务器端处理日志,或者 ...

  6. 大幅度提升工作效率的5款软件,个个都是小巧实用无广告

    今天再来推荐5个超级好用的效率软件,无论是对你的学习还是办公都能有所帮助,每个都堪称神器中的神器,用完后觉得不好用你找我. 1.桌面整理--Fences 很多人习惯把很多文件放在桌面上便于查找,但是当 ...

  7. springboot python 开发效率比较-2018年Java开发值得学习的10大技术

    作为一个开发人员,我们最大的挑战就是保持自己了解新的技术.技术变化很快,你大概每两年就会看到一个新版本的编程语言和框架. 就拿2017年来说,AR.VR.区块链.人工智能等等已经扑面而来了.除了这些离 ...

  8. java手机网页开发_ssm(spring+spring mvc+mybatis)开发java web小说网站,只支持手机端浏览...

    项目描述 java写免费看小说网站 支持腾讯QQ第三方登录+附带社区 数据库只有结构+部分数据 CSS+Js等静态文件采用腾讯云对象云存储(提供源文件) 提供war包可直接部署Tomcat 详细内容可 ...

  9. IDEA工具开发必备设置-极大提高开发效率

    IDEA工具开发必备设置-极大提高开发效率 热部署设置 mybatis编写sql语句自动提示功能 自动清除无效 import 常用快捷键 全局UTF-8编码设置 最后 热部署设置 在开发中我们经常会修 ...

最新文章

  1. 学懂分析,玩转大数据
  2. 使用ServletContext对象完成网页计数器
  3. 现代支付行号查询系统_旅游景区智能管理系统-景区智能导航软件
  4. java正则 找出数字,Java顶用正则表达式找出数字
  5. 「JupyterNotebook」Linux下安装Anaconda3以及后续打开jupyter notebook
  6. d3.js 制作简单的贪吃蛇
  7. 使用word2vec训练中文词向量
  8. sklearn自定义svm核函数(外部和内部定义)
  9. 百度大数据 CMO的新左脑-百度-喻友平
  10. nginx反向代理转发apache配置 之 cookie去哪儿了?
  11. tkmybatis VS mybatisplus
  12. MacDonalds 翻译成“麦当劳”为什么好?英语翻译技巧E
  13. 特征偏度和异常值处理
  14. (几何方面:正六边形面积)编写一个程序,提示用户输入正六边形的边长并显示它的面积。
  15. 计算机的储存器包括内存储器和外存储器,内存储器和外存储器的分类与区别
  16. 为什么要进行WHQL微软徽标认证?
  17. python在Scikit-learn中用决策树和随机森林预测NBA获胜者
  18. 200604013个人日志(摘录一些厦门集美区教育局06年招人的信息)
  19. 大国品牌的幕后英雄们
  20. 数据库入门教程:如何在 MySQL 中选择除了某一列以外的所有列?

热门文章

  1. 2022,出海还是门好生意吗?
  2. java设计模式 通俗解释
  3. 四川劳动保障杂志四川劳动保障杂志社四川劳动保障编辑部2023年第5期目录
  4. WPS excel 使用 MAX() 函数为合并单元格自动填充序号编号
  5. 天生最感性的诱惑,这是你香喷喷的鸡哟
  6. 瀑布式开发和敏捷式开发
  7. 【AIGC】AI欺诈,做好以下几点,无需忧虑
  8. if [ $? -ne 0 ];then 是什么意思
  9. 京津跨域通勤特征与职住空间分布研究
  10. python3实现卡尔曼滤波