mybatis实战
目录
- 配置
- 自动下划线驼峰
- MyBatis解析的SQL和实际传参不符的问题
- 传参是整型,结果是false
- 日期比较
- 入参是字符串
- 入参是Date
- 父子递归查询
- 上下级查询
- 方法一
- 方法二
- 传参数组
- in
- mapper中接口注解映射
配置
自动下划线驼峰
使用mybatis的自动下划线驼峰转换
mybatis有一个选项叫mapUnderscoreToCamelCase,当表中的字段名与对象的属性名相同只是下划线和驼峰写法的差异时适用。
配置了mapUnderscoreToCamelCase之后mybatis在将ResultSet查出的数据设置到对象的时候会尝试先将下划线转换为驼峰然后前面拼接set去设置属性。

然后查询:
/**
- 根据ID查询,开了自动驼峰转换
- @param id
- @return
*/
@Select(“SELECT * FROM t_user WHERE id=#{id}”)
User loadByIdAutoAlias(Long id);
查看打印的结果,birth_day属性填充到了对象中:

MyBatis解析的SQL和实际传参不符的问题
传参是整型,结果是false
传参is_finished =1 但是查询确实false
==> Preparing: select RES.* from item RES where RES.project_id = ? and RES.is_finished = ? and RES.is_qualified = ? order by RES.plan_end_time DESC limit ?, ?
==> Parameters: 1586971605296447490(String), 1(Integer), false(Boolean), 0(Integer), 10(Integer)
参考:记一次MyBatis解析的SQL和实际传参不符的问题
原因是后面排序判断的时候少了一个等号
错误写法
<choose><when test="isFinished = null or isFinished == 0">order by RES.plan_start_time asc</when><otherwise>order by RES.plan_end_time DESC</otherwise></choose>
会导致这个地方计算的结果 isFinished =false

正确写法应该是:isFinished == null
<choose><when test="isFinished == null or isFinished == 0">order by RES.plan_start_time asc</when><otherwise>order by RES.plan_end_time DESC</otherwise></choose>
日期比较
原文链接:https://blog.csdn.net/afkbcgz/article/details/88057869
入参是字符串
@Param("startTime") String startTime, @Param("endTime") String endTime);
xml映射
SELECTCOUNT(*)FROM target_reward_settle_accounts_dailyWHERE<![CDATA[create_time >= str_to_date( #{startTime},'%Y-%m-%d %H:%i:%s')AND create_time < str_to_date( #{endTime},'%Y-%m-%d %H:%i:%s')]]>
入参是Date
@Param("startTime") Date startTime, @Param("endTime") Date endTime);
xml映射
SELECTCOUNT(*)FROM target_reward_settle_accounts_dailyWHERE<![CDATA[create_time >= #{startTime,jdbcType=TIMESTAMP}AND create_time < #{endTime,jdbcType=TIMESTAMP}]]>
父子递归查询
原文链接:https://blog.csdn.net/m0_67402564/article/details/123987858
如果表里有一列是设置父级ID,那么我们可以根据这个父级ID进行递归,最后成为返回父子集合的list。下面是贴上mapper的代码,我们最后只需要调用getAllMenu,就可以返回List<Menu><resultMap type="com.example.demo.entity.Menu" id="menuTree"><id column="menuId" property="menuId"/><result column="menuName" property="menuName"/><result column="menuAddr" property="menuAddr"/><result column="menuSts" property="menuSts"/><result column="menuSort" property="menuSort"/><result column="menuImg" property="menuImg"/><collection property="children" ofType="com.example.demo.entity.Menu" column="menuId" select="getMenuChildren"/>
</resultMap>
<!-- 先查询菜单根级目录 -->
<!-- 这里的返回结果必须为resultMap,并且值为上面构建的resultMap的id的值 -->
<select id="getAllMenu" resultMap="menuTree">SELECT m1.menuId,m1.menuName,m1.menuAddr,m1.menuSts,m1.menuSort,m1.menuImgFROMmenu m1WHERE m1.supMenuId=0
</select><!-- 再利用上次查询结果colliection中column的值cid做递归查询,查出所有子菜单 -->
<!-- 这里的返回结果必须为resultMap,并且值为上面构建的resultMap的id的值 -->
<select id="getMenuChildren" resultMap="menuTree">SELECT m2.menuId,m2.menuName,m2.menuAddr,m2.menuSts,m2.menuSort,m2.menuImgFROM menu m2WHERE m2.supMenuId=#{menuId}
</select>
上下级查询
方法一
参考:https://blog.csdn.net/qq853632587/article/details/118901263
<resultMap id="OrderResultMap" type="com.gxu.construction.business.order.dto.ImproveOrderDTO"><id column="id" jdbcType="VARCHAR" property="id"/><result column="level" jdbcType="INTEGER" property="level"/><result column="title" jdbcType="VARCHAR" property="title"/><result column="improver_name" jdbcType="VARCHAR" property="improverName"/><result column="require_improve_time" jdbcType="TIMESTAMP" property="requireImproveTime"/><result column="actual_improve_time" jdbcType="TIMESTAMP" property="actualImproveTime"/><result column="remark" jdbcType="VARCHAR" property="reviewRemark"/><collection property="files" ofType="com.gxu.construction.file.dto.FileDTO" column="id" select="queryOrderFilesList"/></resultMap><!-- 批量获取整改工单信息 --><select id="selectListByIds" resultMap="OrderResultMap" >select id,title,level,improver_name,require_improve_time,actual_improve_time,remarkfrom improve_order RES where id in<foreach collection="orderIds" index="index" item="id" open="(" separator="," close=")">#{id}</foreach></select><!--级联查询订单项信息--><select id="queryOrderFilesList" resultType="com.gxu.construction.file.dto.FileDTO" parameterType="java.lang.String">select id,file_id as fileId,file_key as fileKey from file_record where business_key = #{id}</select>
方法二
原文链接:https://blog.csdn.net/tian_yu_2012/article/details/123271498
public class EntityA {private Integer a;private Integer ad;
}public class EntityB{private Integer b;private Integer aId;
}public class EntityAVo {private Integer a;private Integer ad;private List<EntityB> alist;
}
<resultMap id="aMap" type="EntityAVo"><result property="a" column="a"/><result property="ad" column="ad"/><collection property="alist" ofType="EntityB"><result column="b" property="b"/><result column="a_id" property="aId"/></collection>
</resultMap><select id="test" resultMap="aMap">SELECT A.a,A.ad,B.b,B.a_idFROMALEFT JOIN B ON B.a_id = A.a
</select>
传参数组
in
参考:https://blog.csdn.net/menghuanzhiming/article/details/79206068
int deleteByFormIds(@Param("list") List<Integer> ids);
select * from t where id in <foreach item="id" index="index" collection="ids" open="(" separator="," close=")"> #{id, jdbcType=INTEGER} </foreach>
mapper中接口注解映射
https://www.bbsmax.com/A/nAJv76385r/
/*** 插入记录,手动分配主键** @param user* @return*/@Insert("INSERT INTO t_user (id, username, passwd) VALUES (#{id}, #{username}, #{passwd})")int addUserAssignKey(User user);/*** 插入记录,数据库生成主键** @param user* @return*/@Options(useGeneratedKeys = true, keyProperty = "id")@Insert("INSERT INTO t_user (username, passwd) VALUES (#{username}, #{passwd})")int addUserGeneratedKey(User user);/*** 插入记录,选择主键** @param user* @return*/@Insert("INSERT INTO t_user (username, passwd) VALUES (#{username}, #{passwd})")@SelectKey(statement = "SELECT UNIX_TIMESTAMP(NOW())", keyColumn = "id", keyProperty = "id", resultType = Long.class, before = true)int addUserSelectKey(User user);/*** 删除记录** @param id* @return*/@Delete("DELETE FROM t_user WHERE id=#{id}")int delete(Long id);/*** 修改记录** @param user* @return*/@Update("UPDATE t_user SET username=#{username}, passwd=#{passwd} WHERE id=#{id}")int update(User user);/*** 根据ID查询,开了自动驼峰转换** @param id* @return*/@Select("SELECT * FROM t_user WHERE id=#{id}")User loadByIdAutoAlias(Long id);/*** 使用ResultMap** @param id* @return*/@Results(id = "userMap", value = {@Result(id=true, column = "id", property = "id"),@Result(column = "username", property = "username"),@Result(column = "passwd", property = "passwd"),@Result(column = "birth_day", property = "birthDay")})@Select("SELECT * FROM t_user WHERE id=#{id}")User loadByIdResultMap(Long id);/*** 引用其他的Result** @param id* @return*/@ResultMap("userMap")@Select("SELECT * FROM t_user WHERE id=#{id}")User loadByIdResultMapReference(Long id);
相关文章:
mybatis实战
目录配置自动下划线驼峰MyBatis解析的SQL和实际传参不符的问题传参是整型,结果是false日期比较入参是字符串入参是Date父子递归查询上下级查询方法一方法二传参数组inmapper中接口注解映射配置 自动下划线驼峰 使用mybatis的自动下划线驼峰转换 mybatis有一个选项…...
【UEFI实战】BIOS与IPMI
KCS KCS全称是Keyboard Controller Style,关于这个名称不用过多的追究,只需要知道它是系统(BIOS和OS)和BMC通信的一种基本方式即可。本文将介绍BIOS下的KCS接口,包括接口使用方式和数据。内容参考自《ipmi-second-gen…...
90%的人都不算会网络安全,这才是真正的白帽子技术【红队】
我敢说,现在网上90%的文章都没有把网络安全该学的东西讲清楚。 为什么?因为全网更多的都是在讲如何去渗透和公鸡,却没有把网安最注重的防御讲明白。 老话说得好:“攻击,是为了更好的防御。”如果连初衷都忘了&#x…...
关于vuex的使用
1.首先安装vuex npm install vuex --save 这时如果直接安装vuex,不指定版本的话,就会直接安装最新的vuex的版本。所以会出现报错。 报错就安装这个 npm install --save vuex3 2.创建文件夹, 有的时候安装好会自动创建vuex的文件夹 …...
第53篇-某商城sign参数分析-webpack【2023-03-07】
声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析三、完整代码一、前言 今天再来试一个webpack的例子吧,网址: aHR0cHM6Ly9tLnlxYi5jb20vYmFuay9…...
探秘MySQL——排查与调优
文章目录一、问题排查一:SQL执行出错二、问题排查二:慢查询0.几个重要参数1.配置慢查询日志命令行配置(重启失效)修改配置文件(永久生效)2.查看慢查询日志3.问题排查1:Look_time耗时4.问题排查2…...
【9.数据页结构】
概述 InnoDB 的数据是按「数据页」为单位来读写的,也就是说,当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位,将其整体读入内存。数据库的 I/O 操作的最小单位是页,InnoDB 数据页…...
演唱会总是抢不到票?教你用Python制作一个自动抢票脚本
人生苦短 我用python 这个大家应该都知道吧? 是中国综合类现场娱乐票务营销平台, 业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域。 如何快速抢票? 那么, 今天带大家用Python来制作一个自动抢票的脚本小程序 本文源码python安…...
【系统开发】WebSocket + SpringBoot + Vue 搭建简易网页聊天室
文章目录一、数据库搭建二、后端搭建2.1 引入关键依赖2.2 WebSocket配置类2.3 配置跨域2.4 发送消息的控制类三、前端搭建3.1 自定义文件websocket.js3.2 main.js中全局引入websocket3.3 App.vue中声明websocket对象3.4 聊天室界面.vue3.5 最终效果一、数据库搭建 很简单的一个…...
Learning C++ No.14【STL No.4】
引言: 北京时间:2023/3/9/12:58,下午两点有课,现在先把引言给搞定,这样就能激励我更早的把这篇博客给写完了,万事开头难这句话还是很有道理的,刚好利用现在昏昏欲睡的时候,把这个没…...
高速PCB设计指南(八)
七、产品内部的电磁兼容性设计 1 印刷电路板设计中的电磁兼容性 1.1 印刷线路板中的公共阻抗耦合问题 数字地与模拟地分开,地线加宽。 1.2 印刷线路板的布局 ※对高速、中速和低速混用时,注意不同的布局区域。 ※对低模拟电路和数字逻辑要分离。…...
什么是腾讯云关系型数据库(MySQL/SQL Server/MariaDB/PostgreSQL详解)
什么是腾讯云关系型数据库?腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL详细介绍。腾讯云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL…...
进程通信相关概念
一、概念 1.1 通信方式有哪些 管道:水管,男纸条放入水管,女看了拿走不回复 消息队列:大盒子,男放入纸条,女看了不拿走,男女都可放 共享内存:直接桌子,男放桌上&#…...
05.Java的运算符
1.运算符计算机的最基本的用途之一就是执行数学运算,比如:int a 10;int b 20;a b;a < b;上述 和 < 等就是运算符,即:对操作数进行操作时的符号,不同运算符操作的含义不同。作为一门计算机语言,Ja…...
轮转数组(力扣189)
轮转数组 题目描述: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7…...
主流的“对象转换工具”使用示例大全以及性能的对比
目录 前言 源码地址 代码示例 引入依赖 先定两个实体用于转换 定义一个接口让所有转换器都集成 Apache BeanUtils BeanCopier bean-mapping bean-mapping-asm Dozer 自己写get/set JMapper json2json MapStruct(推荐) ModelMapper OriK…...
分享10个不错的C语言开源项目
今天跟大家分享10个重量级的C语言开源项目,C语言确实经得住考验: Redis:Redis是一个开源的高性能的键值对数据库。它以C语言编写,具有极高的性能和可靠性。 Nginx:Nginx是一个高性能的HTTP和反向代理服务器࿰…...
【阅读笔记】JavaScript设计模式与开发实践2--闭包与单例、策略模式
目录闭包与高阶函数Function 扩展函数柯里化函数单例模式透明的单例模式惰性单例策略模式策略模式发展策略模式实现闭包与高阶函数 Array.prototype.sort 接受一个函数当作参数,用户可以自行在该函数内指定排序方式 // 由小到大排序 let res [1, 4, 2].sort((a, …...
设计模式(二十)----行为型模式之责任链模式
1、概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同…...
数据持久化层--冷热分离
业务场景 有一个系统的主要功能是这样的:它会对接客户的邮件服务器,自动收取发到几个特定客服邮箱的邮件,每收到一封客服邮件,就自动生成一个工单。之后系统就会根据一些规则将工单分派给不同的客服专员处理。 这家媒体集团客户两年多产生了近2000万的工单,工单的操作记…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
