MyBatis进阶:掌握MyBatis动态SQL与模糊查询、结果映射

简介: MyBatis进阶:掌握MyBatis动态SQL与模糊查询、结果映射

一、引言

在实际开发中,数据库操作是非常常见且重要的任务。而MyBatis作为一款优秀的持久层框架,提供了许多强大的功能来简化我们对数据库的操作。本文将介绍MyBatis中的动态SQL、模糊查询和结果映射等特性,帮助大家更好地使用MyBatis进行数据库操作。

二、MyBatis动态SQL

动态SQL是指根据不同的条件生成不同的SQL语句,以适应不同的查询需求。MyBatis提供了多种方式来实现动态SQL,其中最常用的有if元素和foreach元素。

2.1 if元素使用

if元素可用于根据条件包含或排除一部分SQL语句。它可以嵌套在其他元素内部,如where、set等。

xml
<select id="getUserList" resultType="User">
  SELECT * FROM user
  WHERE 1=1
    <if test="username != null and username != ''">
      AND username = #{username}
    </if>
    <if test="email != null and email != ''">
      AND email = #{email}
    </if>
</select>

2.2 foreach元素使用

foreach元素用于遍历集合或数组,并将每个元素应用到SQL语句中。

xml
<select id="getUserList" resultType="User">
  SELECT * FROM user
  WHERE id IN
    <foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
      #{item}
    </foreach>
</select>

三、MyBatis模糊查询

模糊查询是在数据库查询中常见的需求之一。MyBatis提供了多种方式来实现模糊查询,其中包括使用#{字段名}、使用${字段名}和使用concat函数进行字符串拼接。

① 使用#{字段名}
xml
<select id="like1" resultType="com.niyin.model.Book" parameterType="java.lang.String">
    select
    <include refid="Base_Column_List" />
    from t_mvc_book
    where bname like #{bname}
  </select>

① 使用#{字段名}:

这种方式是最常见且推荐的方式。

在SQL语句中使用#{字段名}会将字段值作为预编译参数进行处理,可以有效防止SQL注入攻击。

MyBatis会自动为参数添加引号和转义特殊字符,确保查询的准确性和安全性。

② 使用${字段名}

<select id="like2" resultType="com.niyin.model.Book" parameterType="java.lang.String">
    select
    <include refid="Base_Column_List" />
    from t_mvc_book
    where bname like '${bname}'
  </select>

② 使用${字段名}:

这种方式是直接将字段值替换到SQL语句中。

在SQL语句中使用${字段名}会将字段值直接拼接到SQL语句中,没有经过预编译处理。

使用这种方式更加灵活,可以完成一些复杂的字符串拼接操作,但也增加了潜在的安全风险

③ 使用concat{‘%’, #{字段名}, ‘%’}

<select id="like3" resultType="com.niyin.model.Book" parameterType="java.lang.String">
    select
    <include refid="Base_Column_List" />
    from t_mvc_book
    where bname like concat('%',#{bname},'%');
  </select>

③ 使用concat{‘%’,#{字段名},‘%’}:

这种方式使用concat函数将字段值与通配符’%'进行拼接。

类似于第一种方式,使用了预编译参数的方式,相对安全且可读性较好。

这种方式适用于需要在查询条件中同时使用通配符前后匹配的情况。

四、MyBatis结果映射

结果映射是指将查询结果映射到Java对象中的过程。MyBatis通过resultMap来定义结果映射关系。

在使用MyBatis中拥有多个场景,返回的结果是多样的,resultType/resultMap

①返回单表的对应的实体类,仅有一个查询结果,可以用resultType/resultMap。

②返回单表的对应的实体类,有多个查询结果,可以用resultType/resultMap。

③返回多表对应结果,仅有一个查询结果,通常用resultType也可以用resultMap。

④返回多表对应结果,有多个查询结果,通常用resultType也可以用resultMap。

⑤返回单个列段,仅有一个查询结果,就用resultType。

⑥返回单个列段,有多个查询结果,就用resultType。

如果是单表的情况下,resultType与resultMap都可以使用。

1 使用resultMap返回映射关系,指的是实体类与数据库字段的关系

2 使用resultType返回List

3 使用resultType返回单个对象

4 使用resultType返回List【适用于多表查询返回结果集】

5 使用resultType返回Map<String,Object>【适用于多表查询返回单个结果集】

总结

本文介绍了MyBatis中的动态SQL、模糊查询和结果映射等特性。通过灵活运用这些功能,我们可以更好地编写适应不同场景需求的数据库操作语句,并将查询结果映射到Java对象中。希望本文能够对大家的MyBatis开发有所帮助!如果有任何疑问或需要进一步了解的地方,请随时提问。谢谢阅读!

目录
相关文章
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
8月前
|
SQL Java 数据库连接
MyBatis 的映射关系
MyBatis 核心功能之一是映射关系,支持一对一、一对多和多对多三种 ORM 映射。通过实体类与配置文件结合,开发者可灵活实现数据关联,提升数据库操作效率。
413 4
|
12月前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
1093 5
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
SQL XML Java
七、MyBatis自定义映射resultMap
七、MyBatis自定义映射resultMap
408 6
|
XML Java 数据库连接
Mybatis映射关系
简介:本文介绍了MyBatis框架中四种常见的关系映射方式,包括一对一、一对多、多对一及多对多。一对一通过简单属性映射实现;一对多通过在主对象中添加集合属性并使用`&lt;collection&gt;`标签映射子对象集合;多对一则利用`&lt;association&gt;`标签在主对象中映射单个子对象;多对多需引入第三方类,分别在两个主对象中添加对方的集合属性,并通过`&lt;collection&gt;`标签实现映射。
282 32
|
Java 数据库连接 mybatis
MyBatis篇-映射关系(1-1 1-n n-n)
本文介绍了MyBatis中四种常见关系映射的配置方法,包括一对一、一对多、多对一和多对多。**一对一**通过`resultMap`实现属性与字段的映射;**一对多**以用户-角色为例,使用`&lt;collection&gt;`标签关联集合数据;**多对一**以作者-博客为例,利用`&lt;association&gt;`实现关联;**多对多**则通过引入第三方类(如UserForDept)分别在User和Dept类中添加集合属性,并配置对应的`&lt;collection&gt;`标签完成映射。这些方法解决了复杂数据关系的处理问题,提升了开发效率。
|
SQL XML Java
六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
467 0
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象