Mybatis的高级用法

MybatisPlus

实体类注释字段

@TableName(“数据库表名”)

@TableId(“主键名”)

@TableField(“字段名”)

BaseMapper接口对象方法

普通查询
1、主键 T selectById(Serializable id)

使用场景为通过主键查询,只要该主键类型实现了Serialzable接口即可。

@Test
public void selectById() {User user = userMapper.selectById(6);System.out.println(user);
}
2、批量主键 List selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList)

使用场景为通过主键的集合去批量查询,前提主键的类型实现了Serializable接口。

@Test
public void selectBatchById() {List<Long> userListId = Arrays.asList(1L, 2L, 3L);List<User> userList = userMapper.selectBatchIds(userListId);userList.forEach(System.out::println);
}
3、批量条件 List selectByMap(@Param(Constants.COLUMN_MAP) Map<String,Object> columnMap)

使用场景为传入一个Map集合,key为表字段,value为表字段值。注意:Map的key为数据表的字段名,不是实体类属性名。

@Test
public void selectByMap() {Map<String, Object> userMap = new HashMap<>();userMap.put("age", 20);List<User> userList = userMapper.selectByMap(userMap);userList.forEach(System.out::println);
}
条件构造器查询

BaseMapper以条件构造器(Wrapper)为参数的查询方法

批量条件 List selectList(@Param(Constans.WRAPPER) Wrapper queryWrapper):

实例

    @Testvoid testWrapper3() {QueryWrapper<Person> wrapper=new QueryWrapper<>();wrapper.ne("age",18);List<Person> personList = personMapper.selectList(wrapper);personList.forEach(System.out::println);}
select不列出全部字段

select(String …columns)

condition作用

该条件决定是否加入最后生成的sql中,如果为true就加入,如果false就不加入,类似于动态的sql拼接

传统方法

使用condition的方法

实体作为条件构造器构造方法的参数

QueryWrapper一个参数的构造方法,如果传入一个部不为null的对象,默认会进行进行等值比较,也就是where后拼接条件。

注:1.并且通过entity参数生成的等值和QueryWrapper的条件构造方法生成的没有任何关系。

        2.可以通过在实体类上添加注解,指定该属性使用那种操作,默认使用等值。

AllEq用法

传入一个map集合对象,就会按照等值进行操作。key为字段名称,value为字段值。如果字段的值为null,那么sql就会拼接为is null这种形式。如果传入的null,想要忽略掉,也就是不进行拼接,那么就传入第二个参数为false。

其他使用条件构造器的方法
方法说明
selectMap

List集合的泛型不再是实体,而是map集合。其中key表示字段名,value表示字段值。

使用场景1:当实体类属性非常多时,不易查看。如果返回的是一个实体类,那么即使我们设定了返回字段,那么它的值为null,但是属性仍然存在。如果返回的是Map类型,当指定了返回字段时,那么没返回的就不会存在。

使用场景2:当返回的不是一条一条记录时,也就是返回的字段不在实体类属性中,比如一些统计,像平均值,最大值,最小值这样的。

selectObject

List集合的泛型不再是实体,而是Object,只返回第一个字段的值。其他的会被舍弃。

使用场景:只返回一列时可以使用它。

selectCount

查询符合条件的总记录数的。

注意:使用它时,就不能指定返回的列了,因为它会在后面拼接COUNT(1)。

selectOne

查询符合条件的数据,只会返回一条数据。

注意: 查询的结果必须是一条或者查不到(多于1条就会报错

更新、删除和插入操作

更新(可以用updateWrapper传递条件)

删除

插入

Mybatis的example类

        mybatis-generator会为每个字段产生Criterion,为底层的mapper.xml创建动态sql。如果表的字段比较多,产生的example类会十分庞大。理论上通过example类可以构造你想到的任何筛选条件。在mybatis-generator中加以配置,配置数据表的生成操作就可以自动生成example了。
mybatis 的mapper接⼝提供了增、删、改、查的⽅法。避免过多使⽤xml来直接写sql。

mapper接口中的函数及方法

方法名功能
int countByExample(UserExample example)按条件计数
int deleteByPrimaryKey(Integer id)按主键删除
int deleteByExample(UserExample example)按条件查询
String/Integer insert(User record)插入数据(返回值为ID)
User selectByPrimaryKey(Integer id)按主键查询
ListselectByExample(UserExample example)按条件查询
ListselectByExampleWithBLOGs(UserExample example)按条件查询(包括BLOB字段)。只有当数据表中的字段类型有为二进制的才会产生。
int updateByPrimaryKey(User record)按主键更新
int updateByPrimaryKeySelective(User record)按主键更新值不为null的字段
int updateByExample(User record, UserExample example)按条件更新
int updateByExampleSelective(User record, UserExample example)按条件更新值不为null的字段

example实例方法

example 用于添加条件,相当于where后面的部分,理论上单表的任何复杂条件查询都可以使用example来完成。

方法说明
example.setOrderByClause(“字段名 ASC”);添加升序排列条件,DESC为降序
example.setDistinct(false)去除重复,boolean型,true为选择不重复的记录。
example.and(Criteria criteria)为example添加criteria查询条件,关系为与
example.or(Criteria criteria)为example添加criteria查询条件,关系为或
criteria.andXxxIsNull添加字段xxx为null的条件
criteria.andXxxIsNotNull添加字段xxx不为null的条件
criteria.andXxxEqualTo(value)添加xxx字段等于value条件
criteria.andXxxNotEqualTo(value)添加xxx字段不等于value条件
criteria.andXxxGreaterThan(value)添加xxx字段大于value条件
criteria.andXxxGreaterThanOrEqualTo(value)添加xxx字段大于等于value条件
criteria.andXxxLessThan(value)添加xxx字段小于value条件
criteria.andXxxLessThanOrEqualTo(value)添加xxx字段小于等于value条件
criteria.andXxxIn(List<?>)添加xxx字段值在List<?>条件
criteria.andXxxNotIn(List<?>)添加xxx字段值不在List<?>条件
criteria.andXxxLike(“%”+value+”%”)添加xxx字段值为value的模糊查询条件
criteria.andXxxNotLike(“%”+value+”%”)添加xxx字段值不为value的模糊查询条件
criteria.andXxxBetween(value1,value2)添加xxx字段值在value1和value2之间条件
criteria.andXxxNotBetween(value1,value2)添加xxx字段值不在value1和value2之间条件

常见用法

排序查询
@Overridepublic UpgradeNotifyInfoDTO queryLatestNotify(Integer appType) {UpgradeNotifyInfoDTO notifyDTO=new UpgradeNotifyInfoDTO();SportAppUpgradeNotifyExample example = new SportAppUpgradeNotifyExample();//法1example.setOrderByClause("`create_time` desc");SportAppUpgradeNotifyExample.Criteria criteria =  example.createCriteria();criteria.andAppTypeEqualTo(appType);// 0- 禁用 1-启用criteria.andStatusEqualTo(1);//法2直接合并来写example.setOrderByClause("`create_time` desc").createCriteria().andAppTypeEqualTo(appType).andStatusEqualTo(1);List<SportAppUpgradeNotify> list = upgradeNotifyMapper.selectByExample(example);if (!CollectionUtils.isEmpty(list)){BeanUtils.copyProperties(list.get(0),notifyDTO);}return notifyDTO;}
查询limit, 只返回前50条数据

通过Pagehelper做分页查询,那么limit同样可以使用Pagehelper。如下,查询符合条件中的前50条。这里不会返回数据总数 count。

 public List<ShopCityInfoRespDTO> queryShopList(String shopCityName,String shopCityId) {List<ShopCityInfoRespDTO> shopCityList = new ArrayList<>();//设置查询条件ShopInfoExample example = new ShopInfoExample();ShopInfoExample.Criteria criteria =  example.createCriteria();criteria.andStatusEqualTo("0");if(!StringUtils.isEmpty(shopCityId)) {criteria.andShopIdEqualTo(shopCityId);}if(!StringUtils.isEmpty(shopCityName)) {criteria.andShopNameLike("%" + shopCityName + "%");}// 这里限制查询50条数据,但不能返回总数PageHelper.startPage(1, 50);List<ShopInfo>  shopInfoList = shopInfoMapper.selectByExample(example);if(CollectionUtils.isEmpty(shopInfoList)){return shopCityList;}for (ShopInfo shopInfo : shopInfoList){ShopCityInfoRespDTO  respDTO = new ShopCityInfoRespDTO();respDTO.setCompanyId(shopInfo.getCompanyId());respDTO.setShopCityId(shopInfo.getShopId());respDTO.setShopCityName(shopInfo.getShopName());respDTO.setShopCityCode(shopInfo.getShopCode());respDTO.setShopType(1);shopCityList.add(respDTO);}return shopCityList;}

参考文章

MyBatis的Example类详解 - 稷下元歌 - 博客园 (cnblogs.com)icon-default.png?t=O83Ahttps://www.cnblogs.com/fgxwan/p/16977628.htmlMyBatis-Plus快速入门-(干货满满+超详细)_mybatis-plus 入门-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_45537947/article/details/111399311

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

excel表格加锁忘密码怎么解决?

百度好多方法都无效&#xff0c;下面方法可行&#xff1a; 点击sheet单元格名称&#xff0c;鼠标右边出现弹框选择“查看代码”&#xff1a; 出现的框中输入以下代码: Sub demo()// 锁定当前工作表&#xff0c;允许筛选操作ActiveSheet.Protect DrawingObjects:True, CONTENT…

Vue中ref、reactive、toRef、toRefs的区别

一、ref、reactive setup 函数中默认定义的变量并不是响应式的&#xff08;即数据变了以后页面不会跟着变&#xff09;&#xff0c;如果想让变量变为响应式的变量&#xff0c;需要使用 ref 和 reactive 函数修饰变量。 ref 函数可以把基本类型变量变为响应式引用reactive 函数…

PDF全能免费转换 3.18 | 免费PDF工具集,多种转换和美化功能

PDF全能免费转换是一款主打免费好用的PDF工具集&#xff0c;功能丰富且实用。主要功能包括&#xff1a;PDF转Word/PPT/Excel/TXT/图片&#xff0c;PDF压缩和合并&#xff0c;多图合并成长图或PDF&#xff0c;身份证扫描、文件扫描、证件扫描&#xff0c;证件照换底色&#xff0…

DICOM标准:DICOM标准中的公用模块、核心模块详解(一)——病人、研究、序列、参考帧和设备模块属性详解

目录 概述 1 公用病人IE模块 1.1 病人模块 2 公用的研究IE模块 2.1 常规研究模块 2.2 病人研究模块 3 公用序列IE模块 3.1 常规序列模块 3.1.1 常规序列属性描述 4 公用参考帧信息实体模块 4.1 参考帧模块 4.1.1 参考帧属性描述 5 公用设备IE模块 5.1 常规设备模…

Webpack 配置module.css报错Uncaught TypeError: Cannot read properties of undefined

我的项目结构如下: 入口文件是index.jsx&#xff0c;组件Button.jsx使用了样式button.module.css .btn {background-color: #4CAF50;border: none;color: white; padding: 15px 32px;text-align: center;text-decoration: none;display: inline-block;font-size: 16px;margin:…

PyCharm中pylint安装与使用

目录 1. 安装插件2. pycharm中使用该功能3. 命令行使用 1. 安装插件 然后重启 2. pycharm中使用该功能 3. 命令行使用 前提是先 pip install pylint pylint demo01.py下面红框内容的意思是&#xff0c;得到10分/ 满分10分&#xff0c;上次运行获得8.33分&#xff0c;经调整…

无人机避障——大疆与Airsim中的角速度信息订阅获取

本文先将Airsim仿真中的角速度信息获取弄好&#xff0c;然后再将大疆SDK中的角速度话题订阅一下&#xff0c;并验证获取角速度信息&#xff0c;后续为DWA动态窗口法替代PID作为局部路径规划做足准备。 Airsim中的角速度信息获取 Airsim无人机状态获取&#xff1a;getMultirot…

绿宝石二十载:如何打破国外在高端电容市场的垄断?

【哔哥哔特导读】作为本土电容器企业&#xff0c;绿宝石凭借二十年的技术创新与市场深耕&#xff0c;在高端电容市场取得了显著突破。从铝电解电容器到叠层式固态电容器&#xff0c;绿宝石是如何做到的&#xff1f; 在当今竞争激烈的电子元器件市场中&#xff0c;技术创新、定…

JS中DOM和BOM

DOM DOM&#xff08;文档对象模型&#xff09;是一个跨平台和语言独立的接口&#xff0c;它允许程序和脚本动态地访问和更新文档的内容、结构和样式。在网页浏览器中&#xff0c;DOM 通常表示 HTML 或 XML 文档的对象模型。DOM 将网页内容视为节点树&#xff0c;其中每个节点都…

从配置anaconda到配置pycharm

Anaconda 是全球领先的数据科学与机器学习平台&#xff0c;专为开发者、数据分析师设计。通过 Anaconda&#xff0c;可以轻松管理数据环境、安装依赖包&#xff0c;快速启动数据分析、机器学习项目。 丰富的 Python 数据科学库&#xff1a;Anaconda 集成了常用的 Python 数据科…

JAVA开源项目 影城管理系统 计算机毕业设计

本文项目编号 T 045 &#xff0c;文末自助获取源码 \color{red}{T045&#xff0c;文末自助获取源码} T045&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 用…

无人机测绘遥感技术算法概述!

一、数据采集算法 航线规划算法 根据测绘任务需求&#xff0c;利用地理信息系统&#xff08;GIS&#xff09;和遥感技术&#xff0c;对无人机进行航线规划。 考虑地形、气候、障碍物等因素&#xff0c;优化飞行路径&#xff0c;确保数据采集的完整性和准确性。 传感器控制算…

剪绳子小游戏 #线上游玩 #介绍 #部分代码截图展示

自制的割绳子小游戏。 线上游玩地址&#xff1a;戳Rain的剪绳子游戏。 不得不承认做了很久。。。 简单介绍一下。。。 割绳子游戏机制 物理引擎 《割绳子》的核心在于其高度逼真的物理引擎。游戏中的所有物体&#xff0c;包括糖果、绳索、气球、弹簧等&#xff0c;都遵循…

分享一波 百度 C++ 服务器开发面试

之前有粉丝反馈说&#xff0c;有没有 C 服务器开发的面试呀&#xff1f; 还真有&#xff0c;最近有 C 同学被百度从简历池捞起来面试了&#xff0c;目前经历了一二面&#xff0c;我把比较通用的面试问题抽离出来跟大家分享一波。 这次主要面试涵盖的知识点&#xff1a; MySQ…

使用ref对父子组件进行操作

子组件 <template><view><button v-if"option.isShow" click"buttonClick">子组件关闭按钮</button></view> </template><script>export default {data() {return {option: {num: 0}}},methods: {// 父组件调用…

【从零开始的LeetCode-算法】3289. 数字小镇中的捣蛋鬼

数字小镇 Digitville 中&#xff0c;存在一个数字列表 nums&#xff0c;其中包含从 0 到 n - 1 的整数。每个数字本应 只出现一次&#xff0c;然而&#xff0c;有 两个 顽皮的数字额外多出现了一次&#xff0c;使得列表变得比正常情况下更长。 为了恢复 Digitville 的和平&…

ros入门:服务通信(c++)

ros服务通信的原理类似于RPC&#xff0c;其实现原理如下图所示 实验目标 创建一个客户端和一个服务端客户端向服务端发送两个参数num1和num2服务端接收到客户端的两个参数num1和num2&#xff0c;并计算出num1num2的求和结果&#xff0c;最后返回给客户端客户端接收服务端的计算…

域控操作二十四:主域故障辅域接替

模拟环境&#xff1a;上海DC1故障无法开机&#xff0c;导致只有一个DNS的电脑无法上网&#xff08;实际可以添加DC2但是为了实验就不说了&#xff09; FSMO还在DC1上 使用powershell把角色迁移到DC2 ntdsutil roles connections connect to server DC2SHA.whbk.cn quitSeize …

网络安全认证的证书有哪些?

在网络安全领域&#xff0c;专业认证不仅是个人技术能力的象征&#xff0c;也是职业发展的重要推动力。随着网络安全威胁的日益严峻&#xff0c;对网络安全专业人才的需求也在不断增长。本文将介绍一些网络安全认证的证书&#xff0c;帮助有志于从事网络安全行业的人士了解并选…

【MIT-OS6.S081笔记1】xv6环境搭建

最近开始做一个操作系统的神课MIT-OS6.S081&#xff0c;我做的是老版本的2020版本的&#xff0c;环境使用的是VirtualBox的Ubuntu系统&#xff0c;在这里记录一下学习的过程。首先需要搭建一下环境&#xff0c;参考官网Tools Used in 6.S081&#xff0c;这个知乎文章也写得很好…