Mybatis中处理特殊SQL处理逻辑解析

 更新时间:2023年06月12日 09:14:54   作者:fckey  
这篇文章主要介绍了Mybatis中处理特殊SQL处理逻辑,在MyBatis中可能会有一些特殊的SQL需要去执行,一般就是模糊查询、批量删除、动态设置表名、添加功能获取自增的主键这几种,现在分别来进行说明,需要的朋友可以参考下

0、前言

在MyBatis中可能会有一些特殊的SQL需要去执行,一般就是模糊查询、批量删除、动态设置表名、添加功能获取自增的主键这几种,现在分别来进行说明。
为了方便演示 ,定义了访问的接口

public interface SQLMapper {
    /**
     * 根据用户名模糊查询用户信息
     */
    List<User> getUserByLike(@Param("username") String username);
    /**
     * 批量删除
     */
    int deleteMore(String ids);
    /**
     * 查询指定表中的数据
     */
    List<User> getUserByTableName(String tableName);
    /**
     * 添加用户
     */
    void insetUser(User user);
}

1、模糊查询

模糊查询非常的有用,对于一些访问量不是很大的搜索都是直接使用模糊查询的方式来做的。
SQLMapper类:

public interface SQLMapper {
    /**
     * 根据用户名模糊查询用户信息
     */
    List<User> getUserByLike(@Param("username") String username);
}

对于SQLXml的编写;

<!--    List<User> getUserByLike(@Param("username") String username);-->
<!--    使用#{},因为包括在单引号里,会被认为是字符串的一部分:select * from t_user where username like '%#{username}%'-->
<!--    三种方式-->
    <select id="getUserByLike" resultType="User">
     <!--  第一种 select * from t_user where username like '%${username}%'
       第二种 select * from t_user where username like concat('%', #{username}, '%')-->
       <!--第三种 推荐使用-->
        select * from t_user where username like "%"#{username}"%"
    </select>

需要注意的是MybatisJDBC进行了进一步封装,使得我们可以更加便捷的使用Java操作数据库。Mybatis获取参数值有两种方式:#{}${}

在大部分情况下,#{}${}都能相互替代,使用两者之一即可,更加推荐使用#{},因为可以防止SQL注入问题,但是由于#{}${}本质上的不同,部分SQL语句使用#{}${}需要格外注意

#{}${}本质区别

  • #{}本质上是占位符赋值,为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
  • ${}本质上是字符串拼接,为字符串类型或日期类型的字段进行赋值时,需要手动加单引号

这个场景下,使用#{}${}都能达到目的,但是用法稍有不同
如果是直接使用

<select id="selectLike" resultType="pojo.User">
	select * from user where user_name like '%#{username}%'
</select>

这种方式,?被作为是字符串来处理了。

#{}换成${}

<select id="selectLike" resultType="pojo.User">
    select * from user where user_name like '%${username}%'
</select>

成功执行
如果非要使用#{},也不是没有解决办法
使用""拼接

<select id="selectLike" resultType="pojo.User">
    select * from user where user_name like "%"#{username}"%"
</select>

执行结果

或者是使用concat()函数来拼接

<select id="selectLike" resultType="pojo.User">
    select * from user where user_name like concat('%',#{likeString},'%')
</select>

结果是;

2、动态表名

在某些场景下,我们需要来回操作各种表,但SQL语句功能一致,这时我们可以使用动态表名,即传参为表名类型,这时就要从#{}${}中进行选择了
Mapper接口

List<User> selectAllFromTable(@Param("tableName") String tableName);

如果是直接使用#{}的方式

<select id="selectAllFromTable" resultType="pojo.User">
    select * from #{tableName}
</select>

结果报错,原因在于#{}为占位符赋值,传参为String的话就会自动补上单引号'',而表名不允许添加单引号,所以导致出错。

直接使用${}的方式

<select id="selectAllFromTable" resultType="pojo.User">
    select * from ${tableName}
</select>

结果成功了,所以在动态表名的情况下,我们只能使用${}

3、获取自增的组件

需要在xml中配置 useGeneratedKeys , keyProperty 两个属性的值.

<!--    void insetUser(User user);-->
<!--    方法的返回值是固定的
        useGeneratedKeys    设置当前标签中的sql使用了自增的主键 (id)
        keyProperty         将自增的主键的值 赋值给 传输到映射文件中的参数的某个属性(user.id)
-->
    <insert id="insetUser" useGeneratedKeys="true" keyProperty="id">
        insert into t_user values(null, #{username}, #{password},#{age},#{gender},#{email})
    </insert>

4、批量删除

有些场景,需要我们根据id数组批量删除记录,这个时候也有一些坑
由于id数组的长度是不确定的,所以我们不能确定参数的个数,但是我们可以使用in关键字,这个时候我们将id数组转为字符串进行传参就好了。
[1,2,3] => 1,2,3
Mapper接口

Integer deleteByIds(String Ids);

使用#{}

<delete id="deleteByIds">
    delete from user where id in (#{ids})
</delete>

结果报错,原因在于in后面的小括号里面的'1,2,3'为字符串类型且为一个整体,与整数类型不符,因此不能使用#{}

使用${}

<delete id="deleteByIds">
    delete from user where id in (${ids})
</delete>

结果成功了,看来有些场景不得不使用${}

到此这篇关于Mybatis中处理特殊SQL处理逻辑的文章就介绍到这了,更多相关Mybatis特殊SQL处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文搞懂SQL注入攻击

    一文搞懂SQL注入攻击

    SQL注入(SQL Injection)攻击是其中最普遍的安全隐患之一,因此,如何防范SQL注入攻击成为了网络安全领域的一个重要议题。本文通过代码示例详细介绍了SQL注入攻击,需要的朋友可以参考一下
    2023-04-04
  • Sql Server中Substring函数的用法实例解析

    Sql Server中Substring函数的用法实例解析

    在sqlserver中substring函数是用来处理字符串的,常用于字符串截取了,下面我来给大家介绍下Sql Server中Substring函数的用法实例解析,需要的朋友参考下吧
    2016-12-12
  • SQL Server的Descending Indexes降序索引实例展示

    SQL Server的Descending Indexes降序索引实例展示

    在涉及多字段排序的复杂查询中,合理使用降序索引可以显著提升SQLServer的查询效率,本文通过构建实际的查询案例,展示了如何在SQLServer中建立并利用降序索引优化查询性能,感兴趣的朋友一起看看吧
    2024-09-09
  • SQLServer2008R2版安装和测试的实现

    SQLServer2008R2版安装和测试的实现

    本文主要介绍了在Windows10上安装和配置SQL Server 2008R2,内容涵盖了安装过程中的注意事项,如安装.NET Framework 3.5、处理远程过程调用失败等常见问题,感兴趣的可以了解一下
    2024-12-12
  • Sql server中内部函数fn_PhysLocFormatter存在解析错误详解

    Sql server中内部函数fn_PhysLocFormatter存在解析错误详解

    这篇文章主要给大家介绍了关于Sql server中内部函数fn_PhysLocFormatter存在解析错误的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-09-09
  • SQL Server 2000/2005/2008删除或压缩数据库日志的方法

    SQL Server 2000/2005/2008删除或压缩数据库日志的方法

    最近win2008 r2的服务器比较卡,打开服务器显示也特别慢,sqlserver业务费正常执行,服务器桌面操作也比较卡,经过多方研究发现原来是sqlserver日志文件已经达到了84G导致,这里就为大家分享一下解决方法,需要的朋友可以参考一下
    2019-09-09
  • ACCESS数据库的压缩,备份,还原,下载,删除的实现

    ACCESS数据库的压缩,备份,还原,下载,删除的实现

    ACCESS数据库的压缩,备份,还原,下载,删除的实现...
    2006-08-08
  • SQL Server中使用表变量和临时表

    SQL Server中使用表变量和临时表

    这篇文章介绍了SQL Server中使用表变量和临时表的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • SQL中遇到多条相同内容只取一条的最简单实现方法

    SQL中遇到多条相同内容只取一条的最简单实现方法

    本文主要介绍SQL中遇到多条相同内容只取一条的最简单实现方法,比较实用,希望能给大家做一个参考。
    2016-06-06
  • SQL Server 触发器实例详解

    SQL Server 触发器实例详解

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的,接下来本文通过实例详解sqlserver触发器,对sqlserver触发器相关知识感兴趣的朋友一起学习吧
    2016-01-01

最新评论