MyBatis映射文件深入--动态sql

简介: MyBatis映射文件深入--动态sql

前言


前面我们学习了MaBatis的入门使用,可以知道,MaBatis能够减少我们的后端代码的重复性,并且我们可以通过插件直接生成简单的MaBatis映射文件,如果没有看过上一篇的小伙伴可以在我的专栏看看,但是我们也发现了一个问题,这样的sql太简单了,无法满足我们日常企业的开发要求,所以今天就来讲一下使用动态sql来玩完成我们的进阶数据操作


动态sql概述


动态SQL的概念是基于条件判断和循环来动态生成SQL语句。通过使用MyBatis的动态SQL功能,你可以根据不同的条件来拼接SQL语句,从而实现灵活的查询。


动态sql的使用


if

类似于java种的if语句

  <sql id="Base_Column_List" >
    id, name
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select
    <include refid="Base_Column_List" />
    from dept
    where id = #{id,jdbcType=INTEGER}
  </select>

其中sql元素类似于封装好的语句,通过include元素进行引入,减少了代码的重复性


foreach

循环执行sql的拼接操作,例如:SELECT * FROM USER WHERE id IN (1,2,5)。

<select id="findByIds" parameterType="list" resultType="user">
select * from User
<where>
<foreach collection="array" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>

这样的操作往往执行在购物车的批量删除功能,需要从前台通过多个参数进行操作


foreach标签的属性含义如下:


  • collection:代表要遍历的集合元素,注意编写时不要写#{}
  • open:代表语句的开始部分
  • close:代表结束部分
  • item:代表遍历集合的每个元素,生成的变量名
  • sperator:代表分隔符


<choose><when><otherwise>

<select id="selectBooks" resultMap="BaseResultMap" parameterType="com.ycxw.model.Book">
  SELECT * FROM t_mvc_book
  WHERE 1=1
  <choose>
    <when test="bid != null">
      AND bid= #{bid}
    </when>
    <when test="bname!= null">
      AND bname = #{bname}
    </when>
    <when test="price != null">
      AND price = #{price}
    </when>
    <otherwise>
      AND info= '哈哈哈'
    </otherwise>
  </choose>
</select>


在这个示例中,根据不同条件生成不同的SQL语句。如果第一个条件不成立就继续往下执行,直到when条件成立后就不会执行下面的判断了。如果没有传入任何参数,则默认生成 AND info= ' 哈哈哈' 条件


面试题


#和$的区别(面试题-重点)

在MyBatis的映射文件中,#$是两种不同的参数占位符,它们在使用方式和处理方式上有所区别。

  • #占位符:
  • 使用方式:#占位符用于替换参数值,通常在SQL语句中使用。例如:SELECT * FROM table WHERE id = #{id}。
  • 处理方式:#占位符会将参数值以安全的方式进行预编译,防止SQL注入攻击。MyBatis会将参数值转义并将其作为预编译参数传递给数据库。
  • $占位符:
  • 使用方式:$占位符用于替换参数值,通常在SQL语句中使用。例如:SELECT * FROM table WHERE id = ${id}。
  • 处理方式:$占位符会直接将参数值替换到SQL语句中,不进行预编译处理。这意味着参数值直接拼接到SQL语句中,可能存在安全风险,因此需要谨慎使用。


区别总结:

  • #占位符会将参数值进行预编译处理,安全性较高,适合用于传递参数值。
  • $占位符直接将参数值拼接到SQL语句中,不进行预编译处理,潜在安全风险较高,适合用于拼接动态的SQL片段


resulttype和resultmap的区别(面试题--重点)

在MyBatis映射文件中,resultTyperesultMap都是用于指定查询结果的映射方式,但它们有一些区别。


resultType

resultTyperesultType用于指定单个结果对象的类型。你可以直接指定一个Java类的全限定名作为resultType的值,MyBatis会自动创建该类型的对象,并将查询结果映射到该对象的属性上。例如:

<select id="getUser" resultType="com.example.User">
  SELECT * FROM user WHERE id = #{id}
</select>

上述示例中,查询结果将会映射到com.example.User类的对象上。


resultMap

resultMapresultMap用于自定义结果映射规则。你可以在映射文件中定义一个<resultMap>元素,指定查询结果与Java对象之间的映射关系。在<resultMap>中,你可以使用<result>元素来定义每个属性的映射规则。例如:

<resultMap id="userResultMap" type="com.example.User">
  <id property="id" column="id"/>
  <result property="name" column="name"/>
  <result property="age" column="age"/>
</resultMap>
<select id="getUser" resultMap="userResultMap">
  SELECT * FROM user WHERE id = #{id}
</select>


需要注意的是,其中的cloumn需要和数据库的字段名相同

  1. <id property="id" column="id"/>:这个<id>元素指定了主键的映射关系。property属性指定了映射到com.example.User类的哪个属性,column属性指定了查询结果中对应的列名。
  2. <result property="name" column="name"/>:这个<result>元素指定了普通属性的映射关系。property属性指定了映射到com.example.User类的哪个属性,column属性指定了查询结果中对应的列名。
  3. <result property="age" column="age"/>:这个<result>元素同样指定了普通属性的映射关系,映射到com.example.User类的age属性。

通过这样的映射配置,当执行查询操作时,MyBatis会将查询结果中的id列映射到com.example.User类的id属性,将name列映射到name属性,将age列映射到age属性。


我们还可以通过构造函数来进行映射

 <resultMap id="BaseResultMap" type="com.wenhao.oa.model.Dept" >
    <constructor >
      <idArg column="id" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="name" jdbcType="VARCHAR" javaType="java.lang.String" />
    </constructor>
  </resultMap>


  1. <resultMap id="BaseResultMap" type="com.wenhao.oa.model.Dept">:这个<resultMap>元素定义了一个名为BaseResultMap的结果映射,它将查询结果映射到com.wenhao.oa.model.Dept类。type属性指定了映射的目标类型。
  2. <constructor>:这是<resultMap>的子元素,用于指定构造函数映射。在这个例子中,它表示将使用构造函数来创建com.wenhao.oa.model.Dept对象。
  3. <idArg column="id" jdbcType="INTEGER" javaType="java.lang.Integer" />:这是构造函数映射的子元素,用于指定构造函数的参数映射。在这个例子中,它表示将查询结果中的id列映射到构造函数的第一个参数,类型为java.lang.Integer。
  4. <arg column="name" jdbcType="VARCHAR" javaType="java.lang.String" />:这是构造函数映射的子元素,用于指定构造函数的参数映射。在这个例子中,它表示将查询结果中的name列映射到构造函数的第二个参数,类型为java.lang.String。

通过这样的映射配置,当执行查询操作时,MyBatis会将查询结果中的id列和name列的值分别传递给com.wenhao.oa.model.Dept类的构造函数,创建相应的对象。


总结来说,resultType适用于简单的结果映射,而resultMap适用于复杂的结果映射,可以自定义映射规则。根据具体的需求,你可以选择使用其中的一种或结合使用。

目录
相关文章
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
44 10
|
3月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
3月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
4月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
58 1
|
4月前
|
SQL Java 数据库连接
Mybatis系列之 动态SQL
文章详细介绍了Mybatis中的动态SQL用法,包括`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<trim>`和`<foreach>`等元素的应用,并通过实际代码示例展示了如何根据不同条件动态生成SQL语句。
|
4月前
|
SQL Java 关系型数据库
SpringBoot 系列之 MyBatis输出SQL日志
这篇文章介绍了如何在SpringBoot项目中通过MyBatis配置输出SQL日志,具体方法是在`application.yml`或`application.properties`中设置MyBatis的日志实现为`org.apache.ibatis.logging.stdout.StdOutImpl`来直接在控制台打印SQL日志。
SpringBoot 系列之 MyBatis输出SQL日志
|
4月前
|
SQL JSON 关系型数据库
"SQL老司机大揭秘:如何在数据库中玩转数组、映射与JSON,解锁数据处理的无限可能,一场数据与技术的激情碰撞!"
【8月更文挑战第21天】SQL作为数据库语言,其能力不断进化,尤其是在处理复杂数据类型如数组、映射及JSON方面。例如,PostgreSQL自8.2版起支持数组类型,并提供`unnest()`和`array_agg()`等函数用于数组的操作。对于映射类型,虽然SQL标准未直接支持,但通过JSON数据类型间接实现了键值对的存储与查询。如在PostgreSQL中创建含JSONB类型的表,并使用`-&gt;&gt;`提取特定字段或`@&gt;`进行复杂条件筛选。掌握这些技巧对于高效管理现代数据至关重要,并预示着SQL在未来数据处理领域将持续扮演核心角色。
59 0