使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL。而且,当数据库表结构改动时,对应的所有SQL以及实体类都需要更改。这工作量和效率的影响或许就是区别增删改查程序员和真正程序员的屏障。

Mybatis−plus中通用mapper就把普通的增删改查操作封装成了BaseMapper和IService

* 1.公共的方法进行抽取,抽取到BaseMapper接口中,将用户操作的方法对象,转化为数据库能够识别的SQL语句
* 2.通过userMapper查找父级接口BaseMapper
* 3.根据BaseMapper查找泛型对象User对象
* 4.根据user对象查找指定的注解@TableName,获取表明
* 5.根据user对象的属性,动态获取表中的字段
* 6.在获取字段的同事,获取属性的值,最后进行SQL的拼接
* 7.MP将拼接好的SQL交给Mybatis框架处理执行

一、代码生成

  使用Mybatis-plus 代码生成器 AutoGenerator 以及添加相关依赖,生成代码。这些步骤我上一篇博客已经谢过了,这里是链接:

  Mybatis-plus 代码生成器 AutoGenerator 的简介和(最详细)使用

二、BaseMapper CRUD 接口

说明:

  • 通用 CRUD 封装BaseMapper接口,为 M y b a t i s − P l u s \color{#A4A4A4}{Mybatis-Plus}Mybatis−Plus启动时自动解析实体表关系映射转换为 M y b a t i s \color{#A4A4A4}{Mybatis}Mybatis内部对象注入容器
  • 泛型 T 为任意实体对象
  • 参数 S e r i a l i z a b l e \color{#A4A4A4}{Serializable}Serializable 为任意类型主键 M y b a t i s − P l u s \color{#A4A4A4}{Mybatis-Plus}Mybatis−Plus不推荐使用复合主键约定每一张表都有自己的唯一 id 主键
  • 对象 W r a p p e r \color{#A4A4A4}{Wrapper }Wrapper为 条件构造器

BaseMapper-CRUD官方文档:https://mybatis.plus/guide/crud-interface.html#mapper-crud-%E6%8E%A5%E5%8F%A3

1、增(Insert

// 官网API
// 插入一条记录
// int insert(T entity); @Autowired
private UserMapper userMapper; //添加 -- BaseMapper api不支持批量添加
public void insert() {
//当前数据库id设置为自增,id策略需设置id-type配置
User user = new User();
user.setName("wangsong");
user.setAge(23);
user.setEmail("1720696548@qq.com");
userMapper.insert(user);
System.out.println(user.getId());
}

2、删(Delete)

//    官网api
// // 根据 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); @Autowired
private UserMapper userMapper; // id删除
public void deleteById() {
userMapper.deleteById(8);
} // ids 批量删除
public void deleteBatchIds() {
List<Long> ids = new ArrayList<>();
ids.add(7);
ids.add(6);
userMapper.deleteBatchIds(ids);
} // columnMap 条件删除
public void deleteByMap() {
//kay是字段名 value是字段值
Map<String,Object> map = new HashMap<>();
map.put("id","6");
userMapper.deleteByMap(map);
} // wrapper 条件删除
public void delete() {
// 拼接sql参考:DELETE FROM user WHERE (id = ? AND name = ?)
QueryWrapper<User> wrapper = new QueryWrapper<>();
// kay是字段名 value是字段值
wrapper.eq("id",6)
.eq("name","wangsong");
userMapper.delete(wrapper);
}

3、改(Update)

//    官网api
// //根据 whereEntity 条件,更新记录
// int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
// //根据 ID 修改
// int updateById(@Param(Constants.ENTITY) T entity); @Autowired
private UserMapper userMapper; // 根据id 更新修改
public void updateById() {
User user = new User();
//需要修改的数据 Id
user.setId(9);
//需要修改的数据
user.setName("erping");
user.setAge(23);
user.setEmail("1720696548@qq.com");
userMapper.updateById(user);
} // 使用 updateWrapper 条件修改(2种方式任选其一)
public void update() {
//方式一
// 更新修改字段
User user = new User();
user.setEmail("xie430423@163.com");
// 更新添加,未设置条件 sql: UPDATE user SET email=? ,设置后:UPDATE user SET email=? WHERE (id = ?)
UpdateWrapper<User> wrapper1 = new UpdateWrapper<User>();
wrapper1.eq("id",9);
userMapper.update(user,wrapper1); //方式二
// UpdateWrapper<User> wrapper2 = new UpdateWrapper<User>();
// wrapper2.set("email","666666@qq.com") // 更新的内容,可往后 .set连接
// .eq("id",9); // 更新的条件,可往后 .eq 添加
// userMapper.update(null,wrapper2);
}

4、查(Select)

//    官网api
//
// // 根据 ID 查询
// T selectById(Serializable id);
// // 根据 entity 条件,查询一条记录
// T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
//
// // 查询(根据ID 批量查询)
// List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// // 根据 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); @Autowired
private UserMapper userMapper; // id查询
@Test
public void selectById(){
User user = userMapper.selectById(1L);
System.out.println(user.toString());
} // ids 批量查询
public void selectBatchIds(){
List<Long> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
List<User> users = userMapper.selectBatchIds(ids);
System.out.println(users.toString());
} // 查询全部
public void selectList(){
List<User> users = userMapper.selectList(null);
System.out.println(users.toString());
} // 条件查询 queryWrapper(无条件则查询全部)
public void selectListWrapper(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("id",1);
List<User> users = userMapper.selectList(wrapper);
System.out.println(users.toString());
} // 分页查询 selectPage
// 需添加分页插件配置: 详见config/MybatisPlusConfig.java
public void selectPage(){
// 页数 /每页记录数
Page<User> page = new Page<>(1,2);
// 分页 / 参数二:wrapper查询条件
Page<User> userPage = userMapper.selectPage(page, null);
System.out.println("总页数"+userPage.getPages());
System.out.println("总记录数"+userPage.getTotal());
System.out.println(userPage.getRecords().toString());
}

5、配置分页拦截器

//Spring boot方式
@EnableTransactionManagement
@Configuration
@MapperScan("com.xxgg.blog.mapper")
public class MybatisPlusConfig { /**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
} @Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> configuration.setUseDeprecatedExecutor(false);
}
}

三、IBaseService CRUD 接口

说明:

  • 通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 g e t 查询单行、 r e m o v e 删除、 l i s t 查询集合、 p a g e 分页,前缀命名方式区分 Mapper 层避免混淆,
  • 泛型 T 为任意实体对象
  • 建议如果存在自定义通用 Service 方法的可能,请创建自己的 I B a s e S e r v i c e继承 Mybatis-Plus 提供的基类
  • 对象W r a p p e r 为 条件构造器

Service官网Api文档:https://mybatis.plus/guide/crud-interface.html#service-crud

注: B a s e M a p p e r 不支持批量操作, I B a s e S e r v i c e 支持批量操作

1、save(增)

// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);

2、SaveOrUpdate(增或改)

// TableId 注解存在更新记录,否插入一条记录
boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

3、Remove(删)

// 根据 entity 条件,删除记录
boolean remove(Wrapper<T> queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);
// 删除(根据ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);

4、Update(改)

// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper<T> updateWrapper);
// 根据 whereEntity 条件,更新记录
boolean update(T entity, Wrapper<T> updateWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);

5、Get(按条件查)

// 根据 ID 查询
T getById(Serializable id);
// 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
T getOne(Wrapper<T> queryWrapper, boolean throwEx);
// 根据 Wrapper,查询一条记录
Map<String, Object> getMap(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

6、List(查)

// 查询所有
List<T> list();
// 查询列表
List<T> list(Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查询(根据 columnMap 条件)
Collection<T> listByMap(Map<String, Object> columnMap);
// 查询所有列表
List<Map<String, Object>> listMaps();
// 查询列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
// 查询全部记录
List<Object> listObjs();
// 查询全部记录
<V> List<V> listObjs(Function<? super Object, V> mapper);
// 根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

7、Page(分页查)

// 无条件分页查询
IPage<T> page(IPage<T> page);
// 条件分页查询
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
// 无条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page);
// 条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);

8、Count(查记录数)

// 查询总记录数
int count();
// 根据 Wrapper 条件,查询总记录数
int count(Wrapper<T> queryWrapper);

9、Chain(链式)

query(链式查询)

// 链式查询 普通
QueryChainWrapper<T> query();
// 链式查询 lambda 式。注意:不支持 Kotlin
LambdaQueryChainWrapper<T> lambdaQuery(); // 示例:
query().eq("column", value).one();
lambdaQuery().eq(Entity::getId, value).list();

update(链式更改)

// 链式更改 普通
UpdateChainWrapper<T> update();
// 链式更改 lambda 式。注意:不支持 Kotlin
LambdaUpdateChainWrapper<T> lambdaUpdate(); // 示例:
update().eq("column", value).remove();
lambdaUpdate().eq(Entity::getId, value).update(entity);

四、参数说明

下面列举前面出现的参数说明:

官方文档:https://mybatis.plus/guide/

Mybatis-plus中通用mapper的CRUD(增、删、改、查)操作封装BaseMapper和IService(最详细)的更多相关文章

  1. 怎样从C#中打开数据库并进行 增 删 改 查 操作

    首先 在C#中引用数据库的操作! (因为我们用的是SQLserver数据库,所以是SqlClient) using System.Data.SqlClient; 1:要实现对数据库的操作,我们必须先登 ...

  2. JDBC中执行sql语句的 增 , 删 , 改 , 查 的方法

    executeQuery()  : 执行 SELECT 语句,它几乎是使用最多的 SQL 语句 executeUpdate() :   执行 INSERT.UPDATE 或 DELETE 语句以及 S ...

  3. 好用的SQL TVP~~独家赠送[增-删-改-查]的例子

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  4. iOS FMDB的使用(增,删,改,查,sqlite存取图片)

    iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...

  5. iOS sqlite3 的基本使用(增 删 改 查)

    iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...

  6. django ajax增 删 改 查

    具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...

  7. ADO.NET 增 删 改 查

    ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...

  8. MVC EF 增 删 改 查

    using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...

  9. python基础中的四大天王-增-删-改-查

    列表-list-[] 输入内存储存容器 发生改变通常直接变化,让我们看看下面列子 增---默认在最后添加 #append()--括号中可以是数字,可以是字符串,可以是元祖,可以是集合,可以是字典 #l ...

  10. MongoDB增 删 改 查

    增 增加单篇文档 > db.stu.insert({sn:'001', name:'lisi'}) WriteResult({ "nInserted" : 1 }) > ...

随机推荐

  1. uniapp中封装一个弹框组件

    第一步:在components下创建 popup.vue子组件: popup.vue中 <template> <view> <view class="popus ...

  2. 2022NewStarCTF新生赛一些比较有意思的题目wp

    Misc_蚁剑流量分析 Pcap的文件可以直接使用工具 编辑器打开目录,一个一个看,可以找到eval危险函数 看到n3wst4r,直接使用linux正则匹配,找出相关内容 Url解码,了解一下蚁剑流量 ...

  3. C/S UDP通信实践踩坑记录与对于ICMP的进一步认识

    背景 最近有个业务场景需要服务端(简称S)与客户端(简称C)设计一套基于UDP的通信协议--要求尽可能快的前提下可容忍一定丢包率,得以比较深入地学习和了解UDP通信和实践,在开发调试期间先后碰到了C端 ...

  4. [OpenCV实战]37 图像质量评价BRISQUE

    摄影是全世界数百万人最喜爱的爱好.毕竟,这有多难啊!用美国著名摄影师阿巴斯•黛安娜的话来说: 拍照就像深夜踮着脚尖走进厨房,偷奥利奥饼干. 拍照很容易,但是拍一张高质量的照片却很难.它需要良好的组成和 ...

  5. 巧用Fiddler开启运营商定制版路由器被阉割的功能,免去刷公版固件的风险

    前言: 三大运营商都有自己的定制版路由器,一般会在自家营销活动中作为赠品送给用户 正巧我家里就有两台电信定制版的华为路由器,都是这两年双十一在某宝上买宽带时送的 两台路由器型号分别是TC7001和TC ...

  6. Educational Codeforces Round 33 (Rated for Div. 2) 虚拟赛体验

    前言 就只做出了 \(A,B,C,D\) 是不是很弱? A.Chess For Three A,B,C 三人下棋,A和B先下,每次下完棋之后由现在观战的人(例如第一局就由C)代替下输的人. 每次输入一 ...

  7. 【大型软件开发】浅谈大型Qt软件开发(三)QtActive Server如何通过COM口传递自定义结构体?如何通过一个COM口来获得所有COM接口?

    前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...

  8. 【MRTK】HoloLens开发基础项目设置

    前言 好记性不如烂笔头,之前做项目的时候很熟练很顺手就没有写笔记.因为排期问题项目中断几个月之后需要重新拾起来,结果发现自己现在忘记得差不多了,于是还是决定写点东西记录一下.即便是简单的项目设置,忘记 ...

  9. JSP第十一次作业

    1.第十二周上机作业(邮件功能)的控制层代码改用为servlet实现.2.学习通发布了考试,截止到本周六.  com.gd.dao  BaseDao 1 package com.gd.dao; 2 3 ...

  10. 浅谈Python中的in,可能有你不知道的

    Python中的in,没那么简单,虽然也不难 https://docs.python.org/zh-cn/3.9/reference/expressions.html#membership-test- ...