mybatis-plus常用使用方法

**

mybaits-plus常用使用方法
**
常用三层分别继承方法
1.1mapper层(接口定义层)可以用BaseMapper<>
例如:
在这里插入图片描述
1.2.里面常用的封装方法有
在这里插入图片描述

1.3常用方法介绍

【添加数据:(增)】int insert(T entity);              // 插入一条记录
注:T         表示任意实体类型entity    表示实体对象【删除数据:(删)】int deleteById(Serializable id);    // 根据主键 ID 删除int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);  // 根据 map 定义字段的条件删除int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper); // 根据实体类定义的 条件删除对象int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 进行批量删除
注:id        表示 主键 IDcolumnMap 表示表字段的 map 对象wrapper   表示实体对象封装操作类,可以为 null。idList    表示 主键 ID 集合(列表、数组),不能为 null 或 empty【修改数据:(改)】int updateById(@Param(Constants.ENTITY) T entity); // 根据 ID 修改实体对象。int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper); // 根据 updateWrapper 条件修改实体对象
注:update 中的 entity 为 set 条件,可以为 null。updateWrapper 表示实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)【查询数据:(查)】T selectById(Serializable id); // 根据 主键 ID 查询数据List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 进行批量查询List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); // 根据表字段条件查询T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 根据实体类封装对象 查询一条记录Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询记录的总条数List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(返回 entity 集合)List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(返回 map 集合)List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(但只保存第一个字段的值)<E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(返回 entity 集合),分页<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(返回 map 集合),分页
注:queryWrapper 表示实体对象封装操作类(可以为 null)page 表示分页查询条件

2.1service层(接口方法)可以用IService<>
介绍:
使用 代码生成器 生成的 service 接口中,其继承了 IService 接口。
  IService 内部进一步封装了 BaseMapper 接口的方法(当然也提供了更详细的方法)。
  使用时,可以通过 生成的 mapper 类进行 CRUD 操作,也可以通过 生成的 service 的实现类进行 CRUD 操作。(当然,自定义代码执行也可)
此处简单介绍一下 IService 中封装的常用方法。

2.2方法介绍

【添加数据:(增)】default boolean save(T entity); // 调用 BaseMapper 的 insert 方法,用于添加一条数据。boolean saveBatch(Collection<T> entityList, int batchSize); // 批量插入数据
注:entityList 表示实体对象集合 batchSize 表示一次批量插入的数据量,默认为 1000【添加或修改数据:(增或改)】boolean saveOrUpdate(T entity); // id 若存在,则修改, id 不存在则新增数据default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper); // 先根据条件尝试更新,然后再执行 saveOrUpdate 操作boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize); // 批量插入并修改数据 【删除数据:(删)】default boolean removeById(Serializable id); // 调用 BaseMapper 的 deleteById 方法,根据 id 删除数据。default boolean removeByMap(Map<String, Object> columnMap); // 调用 BaseMapper 的 deleteByMap 方法,根据 map 定义字段的条件删除default boolean remove(Wrapper<T> queryWrapper); // 调用 BaseMapper 的 delete 方法,根据实体类定义的 条件删除对象。default boolean removeByIds(Collection<? extends Serializable> idList); // 用 BaseMapper 的 deleteBatchIds 方法, 进行批量删除。【修改数据:(改)】default boolean updateById(T entity); // 调用 BaseMapper 的 updateById 方法,根据 ID 选择修改。default boolean update(T entity, Wrapper<T> updateWrapper); // 调用 BaseMapper 的 update 方法,根据 updateWrapper 条件修改实体对象。boolean updateBatchById(Collection<T> entityList, int batchSize); // 批量更新数据【查找数据:(查)】default T getById(Serializable id); // 调用 BaseMapper 的 selectById 方法,根据 主键 ID 返回数据。default List<T> listByIds(Collection<? extends Serializable> idList); // 调用 BaseMapper 的 selectBatchIds 方法,批量查询数据。default List<T> listByMap(Map<String, Object> columnMap); // 调用 BaseMapper 的 selectByMap 方法,根据表字段条件查询default T getOne(Wrapper<T> queryWrapper); // 返回一条记录(实体类保存)。Map<String, Object> getMap(Wrapper<T> queryWrapper); // 返回一条记录(map 保存)。default int count(Wrapper<T> queryWrapper); // 根据条件返回 记录数。default List<T> list(); // 返回所有数据。default List<T> list(Wrapper<T> queryWrapper); // 调用 BaseMapper 的 selectList 方法,查询所有记录(返回 entity 集合)。default List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper); // 调用 BaseMapper 的 selectMaps 方法,查询所有记录(返回 map 集合)。default List<Object> listObjs(); // 返回全部记录,但只返回第一个字段的值。default <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper); // 调用 BaseMapper 的 selectPage 方法,分页查询default <E extends IPage<Map<String, Object>>> E pageMaps(E page, Wrapper<T> queryWrapper); // 调用 BaseMapper 的 selectMapsPage 方法,分页查询
注:get 用于返回一条记录。list 用于返回多条记录。count 用于返回记录总数。page 用于分页查询。【链式调用:】default QueryChainWrapper<T> query(); // 普通链式查询default LambdaQueryChainWrapper<T> lambdaQuery(); // 支持 Lambda 表达式的修改default UpdateChainWrapper<T> update(); // 普通链式修改default LambdaUpdateChainWrapper<T> lambdaUpdate(); // 支持 Lambda 表达式的修改
注:query 表示查询update 表示修改Lambda 表示内部支持 Lambda 写法。
形如:query().eq("column", value).one();lambdaQuery().eq(Entity::getId, value).list();update().eq("column", value).remove();lambdaUpdate().eq(Entity::getId, value).update(entity);

3.1条件构造器
  上面介绍的 接口方法的参数中,会出现各种 wrapper,比如 queryWrapper、updateWrapper 等。wrapper 的作用就是用于定义各种各样的查询条件(where)。

Wrapper  条件构造抽象类-- AbstractWrapper 查询条件封装,用于生成 sql 中的 where 语句。-- QueryWrapper Entity 对象封装操作类,用于查询。-- UpdateWrapper Update 条件封装操作类,用于更新。-- AbstractLambdaWrapper 使用 Lambda 表达式封装 wrapper-- LambdaQueryWrapper 使用 Lambda 语法封装条件,用于查询。-- LambdaUpdateWrapper 使用 Lambda 语法封装条件,用于更新。

3.2常用条件
  参考源码以及官方文档总结的,还是一句话,混个眼熟,多用用就熟练

【通用条件:】
【比较大小: ( =, <>, >, >=, <, <= )】eq(R column, Object val); // 等价于 =,例: eq("name", "老王") ---> name = '老王'ne(R column, Object val); // 等价于 <>,例: ne("name", "老王") ---> name <> '老王'gt(R column, Object val); // 等价于 >,例: gt("name", "老王") ---> name > '老王'ge(R column, Object val); // 等价于 >=,例: ge("name", "老王") ---> name >= '老王'lt(R column, Object val); // 等价于 <,例: lt("name", "老王") ---> name < '老王'le(R column, Object val); // 等价于 <=,例: le("name", "老王") ---> name <= '老王'【范围:(between、not between、in、not in)】between(R column, Object val1, Object val2); // 等价于 between a and b, 例: between("age", 18, 30) ---> age between 18 and 30notBetween(R column, Object val1, Object val2); // 等价于 not between a and b, 例: notBetween("age", 18, 30) ---> age not between 18 and 30in(R column, Object... values); // 等价于 字段 IN (v0, v1, ...),例: in("age",{1,2,3}) ---> age in (1,2,3)notIn(R column, Object... values); // 等价于 字段 NOT IN (v0, v1, ...), 例: notIn("age",{1,2,3}) ---> age not in (1,2,3)inSql(R column, Object... values); // 等价于 字段 IN (sql 语句), 例: inSql("id", "select id from table where id < 3") ---> id in (select id from table where id < 3)notInSql(R column, Object... values); // 等价于 字段 NOT IN (sql 语句)【模糊匹配:(like)】like(R column, Object val); // 等价于 LIKE '%值%',例: like("name", "王") ---> name like '%王%'notLike(R column, Object val); // 等价于 NOT LIKE '%值%',例: notLike("name", "王") ---> name not like '%王%'likeLeft(R column, Object val); // 等价于 LIKE '%值',例: likeLeft("name", "王") ---> name like '%王'likeRight(R column, Object val); // 等价于 LIKE '值%',例: likeRight("name", "王") ---> name like '王%'【空值比较:(isNull、isNotNull)】isNull(R column); // 等价于 IS NULL,例: isNull("name") ---> name is nullisNotNull(R column); // 等价于 IS NOT NULL,例: isNotNull("name") ---> name is not null【分组、排序:(group、having、order)】groupBy(R... columns); // 等价于 GROUP BY 字段, ..., 例: groupBy("id", "name") ---> group by id,nameorderByAsc(R... columns); // 等价于 ORDER BY 字段, ... ASC, 例: orderByAsc("id", "name") ---> order by id ASC,name ASCorderByDesc(R... columns); // 等价于 ORDER BY 字段, ... DESC, 例: orderByDesc("id", "name") ---> order by id DESC,name DESChaving(String sqlHaving, Object... params); // 等价于 HAVING ( sql语句 ), 例: having("sum(age) > {0}", 11) ---> having sum(age) > 11【拼接、嵌套 sql:(or、and、nested、apply)】or(); // 等价于 a or b, 例:eq("id",1).or().eq("name","老王") ---> id = 1 or name = '老王'or(Consumer<Param> consumer); // 等价于 or(a or/and b),or 嵌套。例: or(i -> i.eq("name", "李白").ne("status", "活着")) ---> or (name = '李白' and status <> '活着')and(Consumer<Param> consumer); // 等价于 and(a or/and b),and 嵌套。例: and(i -> i.eq("name", "李白").ne("status", "活着")) ---> and (name = '李白' and status <> '活着')nested(Consumer<Param> consumer); // 等价于 (a or/and b),普通嵌套。例: nested(i -> i.eq("name", "李白").ne("status", "活着")) ---> (name = '李白' and status <> '活着')apply(String applySql, Object... params); // 拼接sql(若不使用 params 参数,可能存在 sql 注入),例: apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08") ---> date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")last(String lastSql); // 无视优化规则直接拼接到 sql 的最后,可能存若在 sql 注入。exists(String existsSql); // 拼接 exists 语句。例: exists("select id from table where age = 1") ---> exists (select id from table where age = 1)【QueryWrapper 条件:】select(String... sqlSelect); // 用于定义需要返回的字段。例: select("id", "name", "age") ---> select id, name, ageselect(Predicate<TableFieldInfo> predicate); // Lambda 表达式,过滤需要的字段。lambda(); // 返回一个 LambdaQueryWrapper【UpdateWrapper 条件:】set(String column, Object val); // 用于设置 set 字段值。例: set("name", null) ---> set name = nulletSql(String sql); // 用于设置 set 字段值。例: setSql("name = '老李头'") ---> set name = '老李头'lambda(); // 返回一个 LambdaUpdateWrapper```

(3)简单使用,测试一下 QueryWrapper

@Test
public void testQueryWrapper() {// Step1:创建一个 QueryWrapper 对象QueryWrapper<User> queryWrapper = new QueryWrapper<>();// Step2: 构造查询条件queryWrapper.select("id", "name", "age").eq("age", 20).like("name", "j");// Step3:执行查询userService.list(queryWrapper).forEach(System.out::println);
}

常见使用方法查询:

/*** 最简单的根据id查询* <p>* ==>  Preparing: SELECT id,version,age,gender,name,position,account,password,status,type,create_time,update_time FROM sys_user WHERE id=?* ==> Parameters: 20(Integer)*/@Testpublic void selectById() {SysUser sysUser = sysUserMapper.selectById(20);System.out.println("sysUser=" + sysUser);`在这里插入代码片`}

 /*** 根据多个id批量查询* <p>* ==>  Preparing: SELECT id,version,age,gender,name,position,account,password,status,type,create_time,update_time FROM sys_user WHERE id IN ( ? , ? , ? , ? )* ==> Parameters: 17(Integer), 18(Integer), 19(Integer), 20(Integer)*/@Testpublic void selectBatchIds() {List<Integer> asList = Arrays.asList(17, 18, 19, 20);List<SysUser> sysUsers = sysUserMapper.selectBatchIds(asList);System.out.println("list=" + sysUsers);}

 	/*** 条件构造器* <p>* 1、名字中包含 东平 并且年龄小于等于30* name like '%东平%' and age<=30* ==>  Preparing: SELECT id,version,age,gender,name,position,account,password,status,type,create_time,update_time FROM sys_user* WHERE (name LIKE ? AND age <= ?)* ==> Parameters: %东平%(String), 30(Integer)* <p>* 备注:* 等于的英语单词是:equals* 小于的英文:less than* le表示小于等于 <=* lt表示小于 <* <p>* 同样的道理* 大于的英文为 greater than* gt 表示大于 >* ge 表示大于等于 >=*/@Testpublic void testQueryWrapper1() {QueryWrapper queryWrapper = new QueryWrapper<SysUser>();queryWrapper.like("name", "东平");queryWrapper.le("age", 30);List<SysUser> sysUsers = sysUserMapper.selectList(queryWrapper);System.out.println("list=" + sysUsers);}

/*** map条件查询* 注意:map条件中的key是用数据库中的字段对应,而不是与java中的实体对应* ==>  Preparing: SELECT id,version,age,gender,name,position,account,password,status,type,create_time,update_time FROM sys_user WHERE name = ? AND age = ?* ==> Parameters: 李东平(String), 18(String)*/@Testpublic void selectByMap() {Map<String, Object> columnMap = new HashMap<>();columnMap.put("name", "李东平");columnMap.put("age", "18");// columnMap 拼接的条件为 WHERE name = ? AND age = ?List<SysUser> sysUsers = sysUserMapper.selectByMap(columnMap);System.out.println("list=" + sysUsers);}

/*** java实体作为条件* ==>  Preparing: SELECT id,version,age,gender,name,parent_id,position,account,password,status,type,create_time,update_time FROM sys_user WHERE age=? AND name=?* ==> Parameters: 18(Integer), 张无忌(String)*/
@Test
public void test2() {SysUser sysUser = new SysUser().setName("张无忌").setAge(18);QueryWrapper queryWrapper = new QueryWrapper<>(sysUser);//queryWrapper.setEntity(sysUser);List<SysUser> sysUsers = sysUserMapper.selectList(queryWrapper);System.out.println("list=" + sysUsers);
}

常用使用方法连接:
https://www.cnblogs.com/l-y-h/p/12859477.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/433065.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

念念不忘智能编程,必有回响CodeArts Snap

开发者的碎碎念 之前在【我与ModelArts的故事】的文章里&#xff0c;分享过我学习新技术的经历&#xff0c;主要有&#xff1a; 自主学习&#xff0c;比如自学Python&#xff1b;借助华为云的产品边用边学。 在围着"编程学习"这座城池&#xff0c;外围来来回回转了…

matlab appdesigner系列-图窗3-菜单

菜单&#xff0c;常用来作为软件界面上方的菜单栏&#xff0c;可用来集成多种功能 示例&#xff1a;创建菜单栏的file选项&#xff0c;设置open&#xff0c;save&#xff0c;exit三个选项 操作步骤&#xff1a; 1&#xff09;将菜单、图像拖拽到画布上&#xff0c;并修改对应…

【秒剪】如何添加基础文字?

Step1&#xff1a;打开剪辑页&#xff0c;点击下方【文字贴图】 undefined Step2&#xff1a;点击【花字贴图】&#xff0c;选择【基础文字】 undefined Step3&#xff1a;输入文字内容&#xff0c;即可添加到视频中 undefined Step4&#xff1a;添加好文字后&#xff0c;你…

【GTK】GtkApplicationWindow/GtkApplication

一、GtkApplicationWindow 在GTK&#xff08;GIMP Toolkit&#xff09;应用程序开发中&#xff0c;并不是每个GTK程序都必须有一个GtkApplicationWindow&#xff0c;但大多数基于GTK的图形界面应用程序都会使用GtkApplicationWindow&#xff0c;因为它是一个方便的类&#xff…

2024年 微信小程序备案流程

目录清单 前言备案验证前的准备验证备案类型填写备案信息互联网信息服务前置审批项 前言 微信小程序备案从2021年1月1日开始执行。备案是指将小程序的开发者信息、运营主体信息等提交给相关部门进行审核和备案登记的过程。在备案之前&#xff0c;小程序不具备上线运营的资格。…

每次请求sessionid变化【SpringBoot+Vue】

引言&#xff1a;花了一晚上的时间&#xff0c;终于把问题解决了&#xff0c;一开始后端做完后,用apifox所有接口测试都是可以的,但当前端跑起来后发现接收不到后端的数据。 当我写完前后端&#xff0c;主页面和获取当前页面信息接口后&#xff0c;配置了cros注解 CrossOrigin…

Leetcode300. 最长递增子序列

Every day a Leetcode 题目来源&#xff1a;300. 最长递增子序列 解法1&#xff1a;递归 枚举 nums[i] 作为最长递增子序列的末尾元素&#xff0c;那么需要枚举 nums[j] 作为最长递增子序列的倒数第二个元素&#xff0c;其中 j<i 并且 nums[j]<nums[i]。 问题转化为…

使用Halcon匹配助手进行模板匹配

使用Halcon匹配助手进行模板匹配 文章目录 使用Halcon匹配助手进行模板匹配1. 选择匹配方法2. 创建模板3. 检测模板4. 优化匹配速度 使用Halcon匹配助手&#xff0c;可以很方便地选择模板图像&#xff0c;设置匹配参数&#xff0c;并测试匹配结果.Halcon匹配助手支持下面几种匹…

Oracle篇—分区索引的重建和管理(第三篇,总共五篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

RLHF学习

整体流程 三个步骤分解&#xff1a; 预训练一个语言模型 (LM) &#xff1b;聚合问答数据并训练一个奖励模型 (Reward Model&#xff0c;RM) &#xff1b;用强化学习 (RL) 方式微调 LM。 RW RM 的训练是 RLHF 区别于旧范式的开端。这一模型接收一系列文本并返回一个标量奖励&…

南昌市青山湖、滕王阁、洛阳路隧道FM调频广播集群通信调度系统应用案例

一、用户需求 青山湖隧道&#xff0c;是南昌市一条东西走向的城市主干道&#xff0c;隧道为双向6车道&#xff0c;长1070米&#xff0c;其中湖底暗埋段为550米&#xff0c;净高5.45米&#xff0c;两孔每孔净宽12.4米。 滕王阁隧道是南昌市沿江北大道与沿江中大道连通工程&#…

初识MQRabbitMQ快速入门

一、同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你却不能…