mybatis----小细节

1、起别名

在MyBatis中,<typeAliases>元素用于定义类型别名,它可以将Java类名映射为一个更简短的别名,这样在映射文件中可以直接使用别名而不需要完整的类名。

下面是一个示例:

在mybatis核心配置文件中配置typeAliases标签

<typeAliases><typeAlias alias="Acount" type="duhong.entity.Account"/>
</typeAliases>

为duhong.entity.Account类指定了别名Account。

定义了这些别名后,我们可以在映射文件中直接使用这些别名来引用对应的Java类,例如:

<resultMap id="AccountMap" type="Account">

通过使用别名,我们可以简化映射文件中的配置,并提高代码可读性和可维护性。

2、mybatis核心配置文件加载映射文件的其他方式

<package name="duhong.dao"/>

这种声明方式,会使mybatis查找duhong/dao下对应的xml文件,不过这种方式要求xml资源目录与dao层目录一致,而且xml名称要与mapper接口名称一致。

3、#{}与${}的区别

在MyBatis中,#{} 和 ${} 用于处理SQL语句中的参数,但是它们在作用和安全性方面有所不同。

  1. #{} 语法:
    在MyBatis中,当你使用 #{} 来表示一个参数占位符时,MyBatis会在运行时将其替换为一个参数的值,并且会使用预处理语句(PreparedStatement)来处理参数。也就是说,不管参数值是什么,它都会被视为一个字符串值并且正确地转义。
SELECT * FROM some_table WHERE id = #{id}
  1. ${} 语法:
    与 #{} 不同,当你使用 ${} 时,MyBatis会直接将这个位置替换为变量的字面值。也就是说,如果你的变量中包含了特定的SQL关键词或结构,它将不做任何转义直接嵌入SQL语句中。
SELECT * FROM ${tableName} WHERE column = #{value}

测试:

dao层添加接口

//查询所有,按降序排列
List<Account> selectAllByDesc(String key);

mapper中添加查询语句

resultMap id="AccountMap" type="duhong.entity.Account">
<id property="id" column="id"></id>
<result property="accountNumber" column="account_number"></result>
<result property="accountType" column="account_type"></result>
<result property="balance" column="balance"></result>
</resultMap>
<select id="selectAllByDesc" resultMap="AccountMap">select * from account ORDER BY balance ${order};
</select>

添加junit,测试

SqlSession sqlSession= SqlSessionUtil.openSession();@Test
public void test(){AccountDao mapper = sqlSession.getMapper(AccountDao.class);List<Account> account = mapper.selectAllByDesc("DESC");for (Account account1 : account) {System.out.println(account);}}

将${}换成#{},执行出错,原因在于DESC是sql语句的关键字,而#{}会将参数转化为字符串。

4、模糊查询

<select id="selectLikeAll" resultMap="AccountMap">select * from account where account_number like '%${key}%';
</select>
//模糊查询
List<Account> selectLikeAll(String key);
@Test
public void likeTest(){AccountDao accountDao=sqlSession.getMapper(AccountDao.class);List<Account> accounts = accountDao.selectLikeAll("1");System.out.println(accounts);
}

同样直接使用#{}也会出错,#{}在' '中并不会被赋值

改进方式sql中使用concat拼接字符串

<select id="selectLikeAll" resultMap="AccountMap">select * from account where account_number like concat('%',#{key},'%');
</select>

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

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

相关文章

SSH隧道技术

SSH隧道 简介 SSH隧道是一种通过SSH协议在两个网络节点之间建立安全通信的技术。它可以用于多种用途&#xff0c;包括加密和保护敏感数据传输、绕过防火墙限制、远程访问内部服务等。 应用&#xff1a; 端口转发&#xff1a;SSH隧道可以将本地端口转发到远程主机上&#xf…

合并K个升序链表(LeetCode 23)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路方法一&#xff1a;顺序合并方法二&#xff1a;分治合并方法三&#xff1a;使用优先队列合并 参考文献 1.问题描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff…

华为OD机试 - 运输时间(Java JS Python C)

题目描述 M(1 ≤ M ≤ 20)辆车需要在一条不能超车的单行道到达终点,起点到终点的距离为 N(1 ≤ N ≤ 400)。 速度快的车追上前车后,只能以前车的速度继续行驶,求最后一辆车到达目的地花费的时间。 注:每辆车固定间隔 1 小时出发,比如第一辆车 0 时出发,第二辆车 1 …

Python——基本语法(二)

一、while 循环 语法&#xff1a; while 条件表达式:条件表达示为真&#xff0c;就执⾏这⾥的代码&#xff0c;必须缩进 4 个空格多⾏代码保持缩进⼀致 条件表达式可以是: True # 布尔值的 True 1 < 10 # 凡是在 if 语句中使⽤的判断表达示&#xff0c;这⾥都可以使…

【Java实战项目】基于ssm的流浪动物领养系统网站

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【音视频原理】图像相关概念 ② ( 帧率 | 常见帧率标准 | 码率 | 码率单位 )

文章目录 一、帧率1、帧率简介2、常见帧率标准3、帧率 刷新率 二、码率1、码率简介2、码率单位 一、帧率 1、帧率简介 帧率 Frame Rate , 帧 指的是 是 画面帧 , 帧率 是 画面帧 的 速率 ; 帧率 的 单位是 FPS , Frames Per Second , 是 每秒钟 的 画面帧 个数 ; 帧率 是 动画…

VR远程的实现

VR远程是一种使用虚拟现实&#xff08;VR&#xff09;技术进行远程操作的方法。通过VR设备&#xff0c;用户可以在虚拟环境中进行操作&#xff0c;并远程控制物理设备或机器人。 VR远程的实现通常需要以下几个步骤&#xff1a; 建立虚拟环境&#xff1a;使用VR技术创建一个与…

springboot 2.6.13 jdk 1.8版本 常用pom包 application.yml文件记录

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.13</version><relativePath/> <!-- lookup parent from repository --></parent> 数据…

漫漫数学之旅006

文章目录 经典格言数学习题古今评注名人小传 - 格洛里亚斯泰纳姆经典格言 数学上有才华的人没有在历史或英语上有才华的人那么多。——格洛里亚斯泰纳姆(Gloria Steinem) 数学习题 求阴影部分的面积。 古今评注 查尔斯巴贝奇,这位19世纪的英国数学家、发明家和机械工程…

相机内外参标定综合

相机内外参标定 内外参标定常用的工具相机成像原理内外参标定数学原理1&#xff09;求解内参矩阵与外参矩阵的积2&#xff09;求解内参矩阵3&#xff09;求解外参矩阵 内外参标定常用的工具 如图所示&#xff0c;棋盘格是很常见使用的标定工具 左下角写着棋盘格的参数&#xf…

Qt绘画的使用

1. 绘图 绘图组件&#xff1a; 1、绘画对象 2、绘画位置 3、绘画工具 4、绘画时机 绘画时机&#xff1a; 当整个窗口或窗口的一部分需要重新绘制时&#xff0c;会调用绘制事件处理函数 void QWidget::paintEvent(QPaintEvent *event) 绘画对象&#xff1a; QPainter类&#xff…

❤ vue的实际使用

❤ vue的实际使用 vue项目中video标签的动态路径使用方法及里面的坑 需求&#xff1a; 在详情展示的时候播放.mp4文件,然后动态改变这个视频的路径无法生效 原因&#xff1a; 使用video标签的时候,会在里面嵌套一个source标签 <video controls"controls" wi…

群晖Drive搭建云同步服务器结合内网穿透实现Obsidian笔记文件远程多端同步

文章目录 一、简介软件特色演示&#xff1a; 二、使用免费群晖虚拟机搭建群晖Synology Drive服务&#xff0c;实现局域网同步1 安装并设置Synology Drive套件2 局域网内同步文件测试 三、内网穿透群晖Synology Drive&#xff0c;实现异地多端同步Windows 安装 Cpolar步骤&#…

使用内网穿透解决电信无公网IP难题,神卓互联

事情经过 事情是这样的&#xff0c;由于客户的单位通了电信宽带&#xff0c;然后采购了我们的ERP系统安装在单位的服务器上&#xff0c;在单位的时候可以通过输入服务器的局域网Ip地址访问&#xff0c;也就是192.168.2.1xx这样的地址&#xff0c;访问确实没有问题&#xff0c;…

ARCGIS PRO SDK 地图图层单一符号化_____线图层

1、定义渲染器线符号&#xff1a; 1)、自定义线符号 Dim Linesymbol As CIMLineSymbol SymbolFactory.Instance.ConstructLineSymbol(ColorFactory.Instance.RedRGB,width ,SimpleLineStyle) width: 要构造的线条符号的宽度。 Simple…

【漏洞复现】Sentinel Dashboard默认弱口令漏洞

Nx01 产品简介 Sentinel Dashboard是一个轻量级的开源控制台&#xff0c;提供机器发现以及健康情况管理、监控、规则管理和推送的功能。它还提供了详细的被保护资源的实际访问统计情况&#xff0c;以及为不同服务配置的限流规则。 Nx02 漏洞描述 Sentinel Dashboard存在默认弱…

低代码配置-列表页组件设计

保存 表单属性存放 — bill筛选项配置存放 — filterLayout列表按钮存放 — buttonLayout列表布局存放 — listLayoutapi存放 — api 数据结构 layout:{// 存放表单基础配置bill:{},// 存放按钮基础配置buttonLayout:{// inSide 行内按钮 // outSide 全局按钮},// 存放表格列…

墙地砖外形检测的技术方案-外部轮廓检测算法

Ramer算法 利用Canny算子得到墙地砖轮廓后&#xff0c;必须进一步将轮廓线精确分段成墙地砖的四条边&#xff0c;从而可得到墙地砖轮廓尺寸、边直度和直角度指标。采用如下算法实现&#xff1a; 第1&#xff0c;选择较高阈值&#xff0c;利用ramer算法将轮廓线用多边形&#…

软件测试|Python 用户输入和字符串格式化

简介 在 Python 中&#xff0c;用户输入和字符串格式化是编程中常见的任务之一。用户输入使我们能够与用户交互&#xff0c;而字符串格式化帮助我们创建美观的输出。本文将介绍如何在 Python 中执行这些任务&#xff0c;并提供详细示例。 用户输入 在 Python 中&#xff0c;…

MySQL报错:this is incompatible with sql_mode=only_full_group_by

mysql 5.7报错 which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by解决办法 修改配置文件 my.cnf [mysqld] sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZE…