当前位置: 首页 > news >正文

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和实际传参不符的问题传参是整型&#xff0c;结果是false日期比较入参是字符串入参是Date父子递归查询上下级查询方法一方法二传参数组inmapper中接口注解映射配置 自动下划线驼峰 使用mybatis的自动下划线驼峰转换 mybatis有一个选项…...

【UEFI实战】BIOS与IPMI

KCS KCS全称是Keyboard Controller Style&#xff0c;关于这个名称不用过多的追究&#xff0c;只需要知道它是系统&#xff08;BIOS和OS&#xff09;和BMC通信的一种基本方式即可。本文将介绍BIOS下的KCS接口&#xff0c;包括接口使用方式和数据。内容参考自《ipmi-second-gen…...

90%的人都不算会网络安全,这才是真正的白帽子技术【红队】

我敢说&#xff0c;现在网上90%的文章都没有把网络安全该学的东西讲清楚。 为什么&#xff1f;因为全网更多的都是在讲如何去渗透和公鸡&#xff0c;却没有把网安最注重的防御讲明白。 老话说得好&#xff1a;“攻击&#xff0c;是为了更好的防御。”如果连初衷都忘了&#x…...

关于vuex的使用

1.首先安装vuex npm install vuex --save 这时如果直接安装vuex&#xff0c;不指定版本的话&#xff0c;就会直接安装最新的vuex的版本。所以会出现报错。 报错就安装这个 npm install --save vuex3 2.创建文件夹&#xff0c; 有的时候安装好会自动创建vuex的文件夹 &#xf…...

第53篇-某商城sign参数分析-webpack【2023-03-07】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析三、完整代码一、前言 今天再来试一个webpack的例子吧,网址: aHR0cHM6Ly9tLnlxYi5jb20vYmFuay9…...

探秘MySQL——排查与调优

文章目录一、问题排查一&#xff1a;SQL执行出错二、问题排查二&#xff1a;慢查询0.几个重要参数1.配置慢查询日志命令行配置&#xff08;重启失效&#xff09;修改配置文件&#xff08;永久生效&#xff09;2.查看慢查询日志3.问题排查1&#xff1a;Look_time耗时4.问题排查2…...

【9.数据页结构】

概述 InnoDB 的数据是按「数据页」为单位来读写的&#xff0c;也就是说&#xff0c;当需要读一条记录的时候&#xff0c;并不是将这个记录本身从磁盘读出来&#xff0c;而是以页为单位&#xff0c;将其整体读入内存。数据库的 I/O 操作的最小单位是页&#xff0c;InnoDB 数据页…...

演唱会总是抢不到票?教你用Python制作一个自动抢票脚本

人生苦短 我用python 这个大家应该都知道吧&#xff1f; 是中国综合类现场娱乐票务营销平台&#xff0c; 业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域。 如何快速抢票&#xff1f; 那么&#xff0c; 今天带大家用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】

引言&#xff1a; 北京时间&#xff1a;2023/3/9/12:58&#xff0c;下午两点有课&#xff0c;现在先把引言给搞定&#xff0c;这样就能激励我更早的把这篇博客给写完了&#xff0c;万事开头难这句话还是很有道理的&#xff0c;刚好利用现在昏昏欲睡的时候&#xff0c;把这个没…...

高速PCB设计指南(八)

七、产品内部的电磁兼容性设计 1 印刷电路板设计中的电磁兼容性 1.1 印刷线路板中的公共阻抗耦合问题 数字地与模拟地分开&#xff0c;地线加宽。 1.2 印刷线路板的布局 ※对高速、中速和低速混用时&#xff0c;注意不同的布局区域。 ※对低模拟电路和数字逻辑要分离。…...

什么是腾讯云关系型数据库(MySQL/SQL Server/MariaDB/PostgreSQL详解)

什么是腾讯云关系型数据库&#xff1f;腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL详细介绍。腾讯云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库&#xff0c;提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL…...

进程通信相关概念

一、概念 1.1 通信方式有哪些 管道&#xff1a;水管&#xff0c;男纸条放入水管&#xff0c;女看了拿走不回复 消息队列&#xff1a;大盒子&#xff0c;男放入纸条&#xff0c;女看了不拿走&#xff0c;男女都可放 共享内存&#xff1a;直接桌子&#xff0c;男放桌上&#…...

05.Java的运算符

1.运算符计算机的最基本的用途之一就是执行数学运算&#xff0c;比如&#xff1a;int a 10;int b 20;a b;a < b;上述 和 < 等就是运算符&#xff0c;即&#xff1a;对操作数进行操作时的符号&#xff0c;不同运算符操作的含义不同。作为一门计算机语言&#xff0c;Ja…...

轮转数组(力扣189)

轮转数组 题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例1&#xff1a; 输入: 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&#xff08;推荐&#xff09; ModelMapper OriK…...

分享10个不错的C语言开源项目

今天跟大家分享10个重量级的C语言开源项目&#xff0c;C语言确实经得住考验&#xff1a; Redis&#xff1a;Redis是一个开源的高性能的键值对数据库。它以C语言编写&#xff0c;具有极高的性能和可靠性。 Nginx&#xff1a;Nginx是一个高性能的HTTP和反向代理服务器&#xff0…...

【阅读笔记】JavaScript设计模式与开发实践2--闭包与单例、策略模式

目录闭包与高阶函数Function 扩展函数柯里化函数单例模式透明的单例模式惰性单例策略模式策略模式发展策略模式实现闭包与高阶函数 Array.prototype.sort 接受一个函数当作参数&#xff0c;用户可以自行在该函数内指定排序方式 // 由小到大排序 let res [1, 4, 2].sort((a, …...

设计模式(二十)----行为型模式之责任链模式

1、概述 在现实生活中&#xff0c;常常会出现这样的事例&#xff1a;一个请求有多个对象可以处理&#xff0c;但每个对象的处理条件或权限不同。例如&#xff0c;公司员工请假&#xff0c;可批假的领导有部门负责人、副总经理、总经理等&#xff0c;但每个领导能批准的天数不同…...

数据持久化层--冷热分离

业务场景 有一个系统的主要功能是这样的:它会对接客户的邮件服务器,自动收取发到几个特定客服邮箱的邮件,每收到一封客服邮件,就自动生成一个工单。之后系统就会根据一些规则将工单分派给不同的客服专员处理。 这家媒体集团客户两年多产生了近2000万的工单,工单的操作记…...

Ubuntu16.04系统 VSCode中python开发插件的安装

VSCode中python开发插件的安装 1. python python插件提供了代码分析&#xff0c;高亮&#xff0c;规范化等很多基本功能 2. Python for vscode 3. Python Preview 实时可视化你的代码结果。如果你Leedcode等题时&#xff0c;可以安装这个插件。能为VSCode切换各种主题皮肤…...

buuctf-pwn write-ups (12)

文章目录buu093-wustctf2020_easyfastbuu094-ciscn_2019_es_1buu095-wdb2018_guessbuu096-gyctf_2020_some_thing_excetingbuu097-axb_2019_heapbuu098-oneshot_tjctf_2016buu099-护网杯_2018_gettingstartbuu100-wustctf2020_number_gamebuu101-zctf2016_note2buu093-wustctf2…...

Linux- 系统随你玩之--网络上的黑客帝国

文章目录1、前言2、TCPDump介绍2.1、问题来了&#xff1a; 所有用户都可以采用该命令吗&#xff1f;2.2、抓包原理2.3、特点2.3.1、参数化支持2.2.2、 TCP功能3、 服务器安装Tcpdump3.1、安装3.2、检查安装是否正常。4、tcpdump 命令4.1、常用功能选项4.2、输出内容5、实操5.1、…...

Python每日一练(20230312)

目录 1. 提示用户输入的简单菜单 ★ 2. 字母异位词分组 ★★ 3. 俄罗斯套娃信封问题 ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 1. 提示用户输入的简单菜单 如果用户选择菜单选项1&#xff0c;提示用户输入1到10之间的整数&a…...

人生又有几个四年

机缘 不知不觉&#xff0c;已经来 csdn 创作四周年啦~ 我是在刚工作不到一年的时候接触 csdn 的&#xff0c;当时在学习 node&#xff0c;对 node 的文件相关的几个 api 总是搞混&#xff0c;本来还想着在传统的纸质笔记本上记一下&#xff0c;但是想想我大学记了好久的笔记本…...

第九章:Java集合

第九章&#xff1a;Java集合 9.1&#xff1a;Java集合框架概述 数组、集合都是对多个数据进行存储(内存层面&#xff0c;不涉及持久化)操作的结构&#xff0c;简称Java容器。 数组存储多个数据方面的特点 一旦初始化以后&#xff0c;其长度就确定了。数组一旦定义好&#xff…...

嵌入式学习笔记——STM32的USART通信概述

文章目录前言常用通信协议分类及其特征介绍通信协议通信协议分类1.同步异步通信2.全双工/半双工/单工3.现场总线/板级总线4. 串行/并行通信5. 有线通信、无线通信STM32通信协议的配置方式使用通信协议控制器实现使用IO口模拟的方式实现STM32串口通信概述什么是串口通信STM32F40…...

MySQL性能优化

MySQL性能调优 存储数据类型优化 尽量避免使用 NULL尽量使用可以的最小数据类型。但也要确保没有低估需要存储的范围整型比字符串操作代价更低使用 MySQL 内建的数据类型&#xff08;比如date、time、datetime&#xff09;&#xff0c;比用字符串更快 基本数据类型 数字 整数…...

C语言/动态通讯录

本文使用了malloc、realloc、calloc等和内存开辟有关的函数。 文章目录 前言 二、头文件 三、主界面 四、通讯录功能函数 1.全代码 2.增加联系人 3.删除联系人 4.查找联系人 5.修改联系人 6.展示联系人 7.清空联系人 8.退出通讯录 总结 前言 为了使用通讯录时&#xff0c;可以…...

我用Compose做了一个地图轮子OmniMap

一、前言 半年前&#xff0c;我发布过一篇介绍&#xff1a;Compose里面如何使用地图&#xff0c;比如高德地图 的文章&#xff0c;原本是没有想造什么轮子的✍️ 闲来无事&#xff0c;有一天看到了评论区留言让我把源码地址分享出来&#xff0c;我感觉我太懒了&#xff0c;后来…...

西安网站建设技术/百度上看了不健康的内容犯法吗

重复的随机数废话不多说&#xff0c;首先我们来看使用seed的一个很神奇的现象。func main() {for i : 0; i < 5; i {rand.Seed(time.Now().Unix())fmt.Println(rand.Intn(100))} }// 结果如下 // 90 // 90 // 90 // 90 // 90可能不熟悉seed用法的看到这里会很疑惑&#xff0…...

太原网站优化推广/资源网站优化排名软件公司

电脑软件为何总是默认安装到C盘&#xff1f;1、能开机的电脑务必有C盘&#xff0c;这样不会导致软件安装时找不到“路”。2、对于机械硬盘而言&#xff0c;硬盘的盘片上&#xff0c;磁道的排列是由外向内的同心圆&#xff0c;最外侧的是第一个磁道&#xff0c;靠近轴心是最后一…...

重庆做网站多少钱/兰州压热搜

Linux下高并发socket最大连接数所受的各种限制 在Linux平台上&#xff0c;无论编写客户端程序还是服务端程序&#xff0c;在进行高并发TCP连接处理时&#xff0c;最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个soc…...

百度招聘 网站开发/市场营销手段13种手段

上节我们介绍了随机森林的一些简单情况和使用R语言做二分类结局变量的随机森林模型分析&#xff0c;今天我们继续来介绍为连续变量结局变量的随机森林模型分析&#xff0c;废话不多说&#xff0c;立即开始&#xff0c;使用的数据为SPSS自带的大气层臭氧的数据集&#xff0c;主要…...

青岛做网站方案/宣传软文是什么

变量是什么&#xff1f; 变&#xff1a;变化&#xff0c;重在变字&#xff0c;量&#xff1a;计量&#xff0c;衡量&#xff0c;表示一种状态。 变量字面理解就是一个可能改变的量&#xff0c;也就是这个值是不固定的。 变量名&#xff1a; a.数字 b.字母 c.下划线 变量的定义 …...

z-blog wordpress/合肥最新消息今天

357 Lambda表达式练习1&#xff08;抽象方法无参无返回值&#xff09; 【练习1】 定义一个piano接口&#xff0c;里面定义一个抽象方法&#xff1a;void listen()定义一个PianoDemo测试类&#xff0c;里面提供个方法 main&#xff0c;调用listenPianolistenPiano【练习2】 定…...