MyBatis的核心技术掌握,简单易懂(上)

目录

一.MyBatis中的动态SQL

二.MyBatis中的模糊查询

        1.  # 符号

        2.  $  符号

---问题

---所以大家知道 # 和 $  在MyBatis中的模糊查询中的区别了嘛??

三.MyBatis 中的结果映射

        1. resultType:

        2. resultMap:

---问题

---所以大家知道 resultType 和 resultMap  在MyBatis中的映射中的区别了嘛???


一.MyBatis中的动态SQL

        动态SQL是MyBatis中一个非常有用的功能,可以根据不同的条件来动态生成SQL语句,以实现更灵活的数据操作。在MyBatis中,动态SQL可以通过使用if、choose、when、otherwise等标签来实现。这些标签可以根据条件判断来决定是否包含某部分SQL语句

MyBatis提供了几种方式来实现动态SQL:

1. 使用基于XML的动态SQL:在映射文件(mapper.xml)中使用if、choose、when、otherwise等标签来实现条件判断和SQL片段的动态拼接。例如:

<select id="findUser" parameterType="map" resultType="User">SELECT *FROM userWHERE 1=1<if test="id != null">AND id = #{id}</if><if test="name != null">AND name = #{name}</if>
</select>

在上面的例子中,根据传入的参数map中的id和name是否为空,动态拼接了不同的SQL片段。

2. 使用基于注解的动态SQL:通过在Java方法上使用@SelectProvider、@UpdateProvider等注解,并在对应的Provider类中编写动态SQL逻辑。Provider类可以根据传入参数动态生成SQL语句。例如:


@SelectProvider(type = UserProvider.class, method = "findUser")
User findUser(Map<String, Object> params);public class UserProvider {public String findUser(Map<String, Object> params) {StringBuilder sql = new StringBuilder("SELECT * FROM user WHERE 1=1");if (params.get("id") != null) {sql.append(" AND id = #{id}");}if (params.get("name") != null) {sql.append(" AND name = #{name}");}return sql.toString();}
}

上面的例子中,根据传入的参数params中的id和name是否为空,动态拼接了不同的SQL语句。

使用动态SQL能够根据不同的条件生成不同的SQL语句,提高了查询的灵活性和代码的可维护性。在实际开发中,可以根据具体需求选择适合的动态SQL实现方式。

二.MyBatis中的模糊查询

        1.  # 符号:这种方式是使用预编译的方式处理参数,即将参数值转义后拼接到SQL语句中。在SQL语句执行前,会使用PreparedStatement进行参数绑定。这种方式可以一定程度上防止SQL注入攻击,因为参数值会被转义处理。

例如: 

输出结果:

         在上面的例子中,#{bname}会将传入的bname值进行预编译转义处理,然后再拼接到SQL语句中。

        2.  $  符号:这种方式是直接将参数值按照原样拼接到SQL语句中。在SQL语句执行前,不会进行预编译处理。这种方式适用于处理列名、表名等无法通过预编译处理的情况。然而,这种方式存在SQL注入的风险,因为参数值是直接拼接到SQL语句中,没有经过转义处理。

例如:

 输出结果:

 在上面的例子中,${bname}会将传入的bname值直接拼接到SQL语句中。

---问题

---所以大家知道 # 和 $  在MyBatis中的模糊查询中的区别了嘛???

  •         使用  # 可以有效防止SQL注入攻击,因为参数值会进行预编译处理。但是,这样会导致SQL语句无法被缓存,因为每次参数值不同,都会生成一个新的预编译SQL语句。使用的时候不需要带引号

  •         使用 $ 符号可以处理那些不能被预编译处理的部分,使用符号可以处理那些不能被预编译处理的部分,但是存在SQL注入的风险。此外,使用符号会将参数值直接拼接到SQL语句中,有一定的性能提升,因为SQL语句可以被缓存和重用。在使用的时候需要带引号。并且 $ 可以用来做动态列,完成动态开发

        因此,在使用#和$时需要根据具体场景和需求来选择合适的方式。一般来说,推荐使用#符号,并根据需要在SQL语句中使用动态SQL来处理特殊情况下的参数拼接。

        MyBatis的模糊查询有三种查询方式,上面已经介绍了两种,还有最后一种

                

         它输出的方式和 # 的是一样的,在企业中一般采用这种方式

三.MyBatis 中的结果映射

        在MyBatis的结果映射中,resultTyperesultMap是两种不同的方式来指定结果映射规则。

        1. resultType:

                        resultType是一种简单的结果映射方式,用于指定查询结果应该映射到的Java对  象的类型。可以直接指定Java对象的类名或别名

        例如:

<select id="getUserById" resultType="User">SELECT *FROM userWHERE id = #{id}
</select>

在上面的例子中,resultType="User"指定了查询结果应该映射到User对象。

        2. resultMap:

                resultMap是一种更灵活和复杂的结果映射方式,用于定义详细的结果映射规则。通过                在映射文件(mapper.xml)或注解中定义<resultMap>标签或@Results注解来指定结 映             射规则。可以通过<id>、<result>和<association>等标签或注解来指定如何将查询结果映             射到Java对象的属性。

例如:

<resultMap id="userResultMap" type="User"><id property="id" column="id"/><result property="name" column="name"/><result property="age" column="age"/><association property="department" javaType="Department"><id property="id" column="dept_id"/><result property="name" column="dept_name"/></association>
</resultMap>

在上面的例子中,定义了一个名为userResultMap的结果映射,详细指定了查询结果的字段与Java对象的属性之间的映射关系。

---问题

---所以大家知道 resultTyperesultMap  在MyBatis中的映射中的区别了嘛???

区别和使用场景:

  •  resultType适用于简单的结果映射,当查询结果只涉及一个Java对象时,可以使用resultType来指定映射的Java对象类型。这种方式简单明了,适用于简单的查询场景。

  •  resultMap适用于复杂的结果映射,当查询结果涉及多个Java对象、关联对象或需要自定义映射规则时,可以使用resultMap来定义详细的结果映射规则。这种方式更灵活,适用于复杂的查询场景。

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

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

相关文章

基于spring boot校园疫情信息管理系统/疫情管理系统

摘要 随着计算机技术&#xff0c;网络技术的迅猛发展&#xff0c;Internet 的不断普及&#xff0c;网络在各个领域里发挥了越来越重要的作用。特别是随着近年人民生活水平不断提高&#xff0c;校园疫情信息管理系统给学校带来了更大的帮助。 由于当前疫情防控形势复杂&#xff…

数据库——事务,事务隔离级别

文章目录 什么是事务?事务的特性(ACID)并发事务带来的问题事务隔离级别实际情况演示脏读(读未提交)避免脏读(读已提交)不可重复读可重复读防止幻读(可串行化) 什么是事务? 事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行。 事务最经典也经常被拿出…

python3对接godaddy API,实现自动更改域名解析(DDNS)

python3对接godaddy API&#xff0c;实现自动更改域名解析&#xff08;DDNS&#xff09; 文章开始前&#xff0c;先解释下如下问题&#xff1a; ①什么是域名解析&#xff1f; 域名解析一般是指通过一个域名指向IP地址&#xff08;A解析&#xff09;&#xff0c;然后我们访问…

【Linux】权限

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 目录 &#x1f449;&#x1f3fb;shell命令解释器&#x1f449;&#x1f3fb;Linux用户…

【腾讯云Cloud Studio实战训练营】React 快速构建点餐页面+Python 拼图小游戏

文章目录 一、腾讯云 Cloud Studio 概述1.1 腾讯云 Cloud Studio 简介1.2 腾讯云 Cloud Studio 功能特点1.3 腾讯云 Cloud Studio 产品优势 二、Cloud Studio界面功能介绍2.1 注册登录2.1.1 新注册用户有免费的3000分钟体验 2.2 界面功能介绍2.2.1 空间模板2.2.2 开发空间关闭空…

07-微信小程序-注册页面-模块化

07-微信小程序-注册页面 文章目录 注册页面使用 Page 构造器注册页面参数Object初始数据案例代码 生命周期回调函数组件事件处理函数setData()案例代码 生命周期模块化 注册页面 对于小程序中的每个页面&#xff0c;都需要在页面对应的 js 文件中进行注册&#xff0c;指定页面…

RISC-V中国峰会 | 256核服务器高调亮相,谁与争锋?

8月23日&#xff0c;第三届RISC-V中国峰会&#xff08;RISC-V Summit China 2023&#xff09;在北京香格里拉饭店正式开幕&#xff0c;来自世界各地的行业精英汇聚一堂&#xff0c;为RISC-V生态系统建言献策&#xff0c;凝心聚力&#xff01; 中国工程院院士倪光南、RISC-V国际…

扩散模型实战(六):Diffusers DDPM初探

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xf…

Embedding 向量生成GPT数据使用相关

如果使用python3.6的版本&#xff0c;使用pycharm创建工程&#xff0c;那么默认会使用 docx包&#xff0c;这样运行程序会爆异常&#xff0c;突然想起以前请教的一个大神&#xff0c;想当 初&#xff0c;这个问题困扰了我 两天时间&#xff0c;在此记录一下&#xff1a; pytho…

实验八 网卡驱动移植

【实验目的】 掌握 Linux 内核配置的基本方法&#xff0c;完成对网卡驱动、NFS 等相关功能的配置 【实验环境】 ubuntu 14.04 发行版FS4412 实验平台交叉编译工具&#xff1a;arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行&…

PMP如何备考?学习方式这里有

预习阶段&#xff1a;强烈建议跟着习课视频学习&#xff08;自己看书真的很难看懂&#xff09;&#xff0c;初步了解PMBOK&#xff0c;有个大致印象&#xff1b; 精讲阶段&#xff1a;这个时候就需要静下心来深入了解各个知识模块&#xff0c;不仅是看PMBOK&#xff0c;还要尽…

Linux centos7 高频词统计

如何统计文章中高频词?是我们经常遇到的问题&#xff0c;也是多场合考察个人知识整合能力的重要手段。招聘经典问题&#xff1a;linux中命令行统计文件中前10个高频词。 在讨论此问题中&#xff0c;主要应用到的知识点有&#xff1a;排序、去重、单词查询、grep、sed和awk使用…