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

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>

相关文章:

  • rust跟我学七:获取外网IP地址
  • 【话题】边缘计算的挑战和机遇
  • Windows 项目从0到1的部署
  • 软件工程:黑盒测试等价分类法相关知识和多实例分析
  • Unity | 渡鸦避难所-7 | 攻击碰撞检测
  • axios的原理及源码解析
  • 一篇综述洞悉医学大型语言模型的原理,应用和挑战
  • c语言:用一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。
  • 李沐《动手学深度学习》线性神经网络 softmax回归
  • python/c++ Leetcode题解——118. 杨辉三角
  • uniapp写微信小程序实现电子签名
  • latex如何修改论文标题为罗马数字【已解决】
  • Java后端sql编写
  • 在uni-app中使用sku插件,实现商品详情页规格展示和交互。
  • 什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(一)
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 10个最佳ES6特性 ES7与ES8的特性
  • docker容器内的网络抓包
  • Hibernate最全面试题
  • javascript面向对象之创建对象
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Python学习之路13-记分
  • spring cloud gateway 源码解析(4)跨域问题处理
  • vue-router 实现分析
  • Web设计流程优化:网页效果图设计新思路
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 问题之ssh中Host key verification failed的解决
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 自定义函数
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #stm32驱动外设模块总结w5500模块
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $.ajax()
  • (done) 两个矩阵 “相似” 是什么意思?
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (正则)提取页面里的img标签
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .Net的C#语言取月份数值对应的MonthName值
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @Import注解详解
  • @NestedConfigurationProperty 注解用法
  • [BZOJ1053][HAOI2007]反素数ant
  • [C#]DataTable常用操作总结【转】
  • [c#基础]DataTable的Select方法
  • [CTSC2014]企鹅QQ
  • [Django开源学习 1]django-vue-admin
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽