MyBatis的场景应用(动态SQL、模糊查询及映射结果)附(Mybatis中#和$的区别)1

简介: MyBatis的场景应用(动态SQL、模糊查询及映射结果)附(Mybatis中#和$的区别)1

一.Mybatis简介

MyBatis(之前被称为iBatis)是一种开源的持久化框架,它将面向关系数据库的持久层操作封装起来,使得开发人员可以通过简单的配置来实现对数据库的操作。MyBatis提供了灵活且强大的SQL映射功能,能够将数据库表的记录映射到Java对象上,从而简化了数据库操作和数据持久化的过程。

以下是MyBatis的一些主要特点和功能:

1.简单易用:MyBatis采用了简单的XML或注解配置方式,使得开发人员可以快速上手并且容易理解。

2.灵活性:MyBatis不强制开发者遵循特定的编程模型,开发人员可以使用自己习惯的编码风格进行开发。同时,MyBatis支持动态SQL,可以根据不同的条件生成不同的SQL语句,增加了灵活性和可扩展性。

3.SQL映射:MyBatis提供了强大的SQL映射功能,通过配置SQL语句和结果映射规则,将数据的提取、转换和映射工作交给MyBatis框架完成,减少了手动编写JDBC代码的工作量。

4.执行器和事务:MyBatis提供了多种执行器(Simple、Reuse、Batch)和事务管理方式,开发人员可以根据需要选择适合的执行器和事务管理方式,以提高数据库操作的性能和可靠性。

5.插件机制:MyBatis支持自定义插件,开发人员可以通过插件机制来扩展或修改MyBatis的行为,例如增加缓存支持、打印SQL日志等。

总的来说,MyBatis是一个轻量级且灵活的持久化框架,它通过将数据库操作和Java对象之间的映射工作进行封装,简化了数据持久化的过程。它的目标是提供开发人员更直观、高效的数据库访问方式,并且与各种Java框架(如Spring、Spring Boot)和持久化标准(如JPA)可以良好集成。

二.场景应用

1.动态SQL

1.1 介绍

MyBatis中的动态SQL是指在SQL语句中根据不同的条件动态生成不同的SQL片段,从而实现灵活的查询和更新操作。动态SQL使得我们能够根据不同的情况生成不同的SQL语句,避免了编写大量重复的SQL语句,提高了代码的可维护性和可读性

1.2 案例演示

(1).foreach元素的使用

当我们的SQL语句的查询条件的数量存在多个时,可以使用foreach元素进行遍历条件结果,最后进行SQL查询,在我们Mybatis生成的xml中进行配置

<select id="selectById" resultType="com.YU.model.Book" parameterType="java.lang.List" >
    select 
    <include refid="Base_Column_List" />
    from t_mvc_book
    where bid in
    <foreach collection="bids" item="bid" open="(" close=")" separator=",">
       #{bid}
    </foreach>
  </select>

在BookMapper接口中定义方法

List<Book> selectById(@Param("bids") List bids);

在业务逻辑层中编写接口类及它的实现类

List<Book> selectById(List bids);
 @Override
    public List<Book> selectById(List bids) {
        return BookMapper.selectById(bids);
    }

开始测试

在测试类中编写Junit测试方法

@Test
    public void selectById(){
        //创造一个集合
        List<Integer> bids = Arrays.asList(new Integer[]{58, 89, 61});
        bookBiz.selectById(bids).forEach(System.out::println);
    }

运行结果:

小结:我们在不确定使用SQL语句时可以使用动态SQL ,大大得增加了SQL语句的灵活性,我们可以通过Mybatis中封装好的foreach元素配合动态SQL遍历出不确定的条件元素,总而言之:动态SQL为我们的开发增加了可扩展性,提高了我们的开发效率,降低了开发难度

当然在Mybatis中不止有foreach一个元素可供动态SQL使用,还有if、choose、when、otherwise、bind元素等等,下面介绍它们的用法,就不进行测试了

(2) if元素:

if元素用于在SQL语句中添加条件判断。可以根据某个条件的值来选择是否包含特定的SQL片段。示例:

<select id="getUserList" parameterType="User" resultType="User">
  SELECT * FROM users
  WHERE 1=1
  <if test="name != null">
    AND name = #{name}
  </if>
  <if test="age != null">
    AND age = #{age}
  </if>
</select>

上述示例中,根据传入的User对象的name和age属性是否为空,决定是否在SQL语句中添加对应的查询条件。

(3) choose、when、otherwise元素:

choose元素用于实现类似于Java的switch语句的功能。当某个条件满足时,执行对应的SQL片段。示例:

<select id="getUserList" parameterType="User" resultType="User">
  SELECT * FROM users
  WHERE 1=1
  <choose>
    <when test="name != null">
      AND name = #{name}
    </when>
    <when test="age != null">
      AND age = #{age}
    </when>
    <otherwise>
      AND status = 'ACTIVE'
    </otherwise>
  </choose>
</select>

上述示例中,当name和age都为空时,查询条件为status=‘ACTIVE’;当name不为空时,查询条件为name=#{name};当age不为空时,查询条件为age=#{age}。

(4) bind元素:

"bind"元素是一种用于定义和绑定变量的XML元素。该元素可以在MyBatis的XML映射文件中使用,用于在SQL语句中定义和使用临时变量。示例:

<select id="getUserById" resultType="User">
  <bind name="userId" value="1"/>
  SELECT * FROM users WHERE id = #{userId}
</select>

在上面的示例中,“bind"元素用于定义一个名为"userId"的变量,并将其值设置为"1”。然后,该变量可以在后续的SQL语句中使用,通过"#{userId}"的方式引用变量的值。

"bind"元素有两个属性:

“name”:指定变量的名称。

“value”:指定变量的值。

2.Mybatis中的模糊查询

三种写法

(1).#

<select id="like1" resultType="com.YU.model.Book" parameterType="java.util.List" >
    select
    <include refid="Base_Column_List" />
    from t_mvc_book
    where bname like #{bname}
  </select>

测试结果

(2). $

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

(3).concat

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

总结:由测试结果可以得出Mybatis中 '#' 和 '$' 的区别

1.内在形式:$是占位符传参,#是预处理SQL

2.外在形式:$传参时不带引号,需要自行添加,#传参自带引号

3.$传参存在sql注入的危险,#不存在

4.$可以用作动态列,完成动态SQL的开发

在实际开发过程中,尽量不使用$··,#能很大程度防止SQL注入

目录
相关文章
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
11月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
661 1
|
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;`实现代码复用,优化维护效率。
1173 5
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
11月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1619 1
Spring boot 使用mybatis generator 自动生成代码插件
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
1126 0
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
801 2
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
808 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
917 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块