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

news2024/11/20 15:32:22

目录

一.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 user
  WHERE 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 user
  WHERE 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.coloradmin.cn/o/927472.html

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

相关文章

【学习FreeRTOS】第18章——FreeRTOS软件定时器

1.软件定时器的简介 定时器&#xff1a;从指定的时刻开始&#xff0c;经过一个指定时间&#xff0c;然后触发一个超时事件&#xff0c;用户可自定义定时器的周期硬件定时器&#xff1a;芯片本身自带的定时器模块&#xff0c;硬件定时器的精度一般很高&#xff0c;每次在定时时…

文字的力量:如何细节决定工作与个人成长的走向

在工作和个人发展的道路上&#xff0c;写作与沟通是两个不可或缺的技能。而这其中&#xff0c;错别字、敏感词、政治口号、标点错误以及常识性错误这些细节&#xff0c;常常被忽视&#xff0c;但其对个人和工作的影响却是深远的。这些细节不仅直接反映出一个人的专业程度&#…

解决,worldGeo.db中有geom数据的x1表无法在QGIS中成图像

原因:缺少geom数据对应的坐标geometry_columns文件,如下图所示&#xff1a; STEP: 1,在navicat_for_SQLite中将目标表x1中字段geom中blob改成,POINT,或者MULTIPOLYGON等对应的格式 注意&#xff01;&#xff1a;f_table_name 表名 和 f_geometry_column geom空间数据所在字段…

【FPGA】verilog语法的学习与应用 —— 位操作 | 参数化设计

【FPGA】verilog语法的学习与应用 —— 位操作 | 参数化设计 学习新语法&#xff0c;争做新青年 计数器实验升级&#xff0c;让8个LED灯每个0.5s的速率循环闪烁&#xff0c;流水灯ahh好久不见~ 去年光这个就把我折磨够呛。。我肉眼可见的脱发就是从那时候开始的。。在那两个月…

Linux学习记录——이십유 多线程(3)

文章目录 1、生产者消费者模型1、基于BlockingQueue的生产者消费者模型2、对模型全面的认识3、多生产者多消费者 2、信号量1、POSIX信号量2、基于环形队列的生产消费模型3、多生产者多消费者 3、多生产者多消费者模型的意义 1、生产者消费者模型 顾名思义&#xff0c;就像是供…

sed编辑器在windows平台上的使用

一、写在前面 我们经常在linux上使用sed命令去替换文件里面固定字符串&#xff0c;但是有时候我们使用的windows系统&#xff0c;文件太大又不方便传到linux上去操作&#xff0c;反复上去和下载浪费空间&#xff0c;又浪费传输的带宽。所以在windows上我们也必须要有sed工具&a…

Node.js 的 Buffer 是什么?一站式了解指南

在 Node.js 中&#xff0c;Buffer 是一种用于处理二进制数据的机制。它允许你在不经过 JavaScript 垃圾回收机制的情况下直接操作原始内存&#xff0c;从而更高效地处理数据&#xff0c;特别是在处理网络流、文件系统操作和其他与 I/O 相关的任务时。Buffer 是一个全局对象&…

为DOSBOX创建互联网能力

DOSBOX能运行DOS游戏及MASM&#xff0c; C等开发语言&#xff0c;要让它联接互联网还是要一些特殊配置的。 1. 安装npcap软件 下载最新版免费软件npcap.exe&#xff0c;正常安装。它会自己绑定到每一张网卡&#xff0c;建立网卡数据与DOSBOX的交互通道。 2. 查看系统中的网卡…

基于流计算 Oceanus(Flink) CDC 做好数据集成场景

由于第一次做实时&#xff0c;所以踩坑比较多&#xff0c;见谅(测试环境用的flink),小公司没有用到hadoop组件 一、踩坑记录 1:本地代码的flink版本是flink1.15.4&#xff0c;生产环境是flink1.16.1&#xff0c;在使用侧输出流时报错&#xff0c;需要使用以下写法,需要使用Si…

SpingMVC拦截器-异常处理的思路,用户体验不好的地方

1、异常处理机制 1.1 原先我们的异常都是手动的try..catch() 2、他存在着一些缺陷&#xff1a;这里创建了一个Demo的controller,内部有一个show方法&#xff1a; 3、访问内部&#xff0c;我要实现demoshow方法&#xff0c;我们来调用show1和show2的方法&#xff1a; 4、有一…

【HAproxy】

目录 一、概述 1.简介 2.核心功能 3.关键特性 4.应用场景 二、使用步骤 1.内核配置 3.建立配置文件 4.添加为系统服务 5.添加3和5运行级别下自启动 6.启动haproxy 三、调度算法 四、配置文件 五、负载均衡 1.七层负载 1.1 配置负载 1.2 配置监控页面 2.四层负…

丰田中国vs中国丰田:一次历史性的战略探讨

比亚迪、长城、奇瑞等中国汽车品牌表现优异&#xff0c;让原本处于领先地位的日系、美系、德系等合资品牌面临压力&#xff0c;市场份额遭受前所未有的全新挑战。 东风雷诺、广汽菲克、广汽讴歌等逐渐退出中国市场&#xff0c;丰田也面临销售下滑。在中国汽车市场全新竞争格局下…

浅谈容器网络

1.什么是容器网络 容器网络是一种新兴的应用程序沙箱机制&#xff0c;用于家庭桌面和网络规模的 企业网络 解决方案&#xff0c;其概念与虚拟机类似。容器内部与主机和所有其他容器隔离的是一个功能齐全的 Linux 环境&#xff0c;具有自己的用户、文件系统、进程和网络堆栈。容…

跨部门协作如何实现高效无障碍?强推这6个协同办公工具!

在现代职场中&#xff0c;跨部门协作变得越来越常见。不同部门之间的协作能力直接影响到工作效率和协同成果。因此&#xff0c;寻找一款能够有效促进跨部门协作的工具是非常重要的。下面向大家推荐6款可以跨部门协作的工具&#xff0c;并从不同的职场场景进行介绍。 1、飞项 …

P1065 [NOIP2006 提高组] 作业调度方案

题目描述 我们现在要利用 m m m 台机器加工 n n n 个工件&#xff0c;每个工件都有 m m m 道工序&#xff0c;每道工序都在不同的指定的机器上完成。每个工件的每道工序都有指定的加工时间。 每个工件的每个工序称为一个操作&#xff0c;我们用记号 j-k 表示一个操作&…

C#_GDI+ 绘图编程入门

官网提供相关API GDI 基本图形功能_drawing 高级二维和矢量图形功能_drawing2D GDI 图像处理功能_Imaging GDI 排版功能_text Windows 窗体应用程序提供打印功能_Printing 像素 构成图像的最小单位就是像素&#xff1b;屏幕上显示不管是位图或者矢量图&#xff0c;当描述…

I2C通信协议

I2C总线接口 I2C(IIC,Inter一Integrated Circuit)总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。 主器件用于启动总线传送数据&#xff0c;并产生时钟以开放传送的器件&#xff0c;此时任何被寻址…

1448. 统计二叉树中好节点的数目(C++题解)

1448. 统计二叉树中好节点的数目 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,3,nu…

门店数字化系统怎么做?

​如果门店只做线下生意&#xff0c;相信前几年的经历已经充分说明一旦客户不上门、生意就玩完&#xff1b;如果门店只做线上生意&#xff0c;无数平台的血泪教训也表明哪怕砸钱也无法跟大平台抗衡&#xff1b;因此&#xff0c;线上线下深度融合已经成为实体行业的必然趋势&…

解决 ‘bee‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

最近在学习go 中的beego框架,在下载依赖 之后执行bee new projectname 后出现了一个问题: 网上教程说是缺少环境变量,又说什么需要自己收到beego的src文件夹下编译main.go 忙活了半天,最后都以失败告终; 解决方案是: go install github.com/beego/bee/v2master执行bee ve…