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>

这种方式,?被作为是字符串来处理了。
Mybatis中处理特殊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>

执行结果
Mybatis中处理特殊SQL处理逻辑
或者是使用concat()函数来拼接

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

结果是;
Mybatis中处理特殊SQL处理逻辑

2、动态表名

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

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

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

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

结果报错,原因在于#{}为占位符赋值,传参为String的话就会自动补上单引号'',而表名不允许添加单引号,所以导致出错。
Mybatis中处理特殊SQL处理逻辑
直接使用${}的方式

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

结果成功了,所以在动态表名的情况下,我们只能使用${}
Mybatis中处理特殊SQL处理逻辑

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'为字符串类型且为一个整体,与整数类型不符,因此不能使用#{}
Mybatis中处理特殊SQL处理逻辑
使用${}

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

结果成功了,看来有些场景不得不使用${}
Mybatis中处理特殊SQL处理逻辑文章来源地址https://www.toymoban.com/news/detail-452576.html

到了这里,关于Mybatis中处理特殊SQL处理逻辑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入解析 MyBatis 中的 <;foreach>; 标签:优雅处理批量操作与动态 SQL

    在当今的Java应用程序开发中,数据库操作是一个不可或缺的部分。MyBatis作为一款颇受欢迎的持久层框架,为我们提供了一种优雅而高效的方式来管理数据库操作。在MyBatis的众多特性中, foreach 标签无疑是一个强大的工具,它使得在SQL语句中进行动态循环迭代变得轻而易举。

    2024年02月13日
    浏览(37)
  • mybatis(mybatis-plus)映射文件(XML文件)中特殊字符转义

    XML 文件在解析时会将五种特殊字符进行转义,当不希望语法被转义时,就需要进行特别处理,参考HTML字符转义规范Myabtis 中五个特殊字符 原始符号 符号含义 大于 小于 and \\\" 英文双引号 ’ 英文单引号 原始符号 转义字符 gt lt amp \\\" quot ’ apos

    2024年02月10日
    浏览(36)
  • MyBatis Plus 逻辑删除

    何为逻辑删除 删除数据,可以通过物理删除,也可以通过逻辑删除。 物理删除指的是直接将数据从数据库中删除,不保留。 逻辑删除指的是修改数据的某个字段,使其表示为已删除状态,而非删除数据,保留该数据在数据库中,但是查询时不显示该数据(查询时过滤掉该数

    2024年02月02日
    浏览(30)
  • Mybatis-Plus 逻辑删除的用法

    说明 本文介绍Mybatis-Plus的逻辑删除的用法。 删除功能是项目中经常见到的需求。比如:需要删除一个订单,一般不会把实际数据删除,而是逻辑删除。一般表中有一个is_deleted字段标识该用户是否被删除,0 表示未删除 1 表示已删除。 官网 逻辑删除 | MyBatis-Plus​ 配置删除未

    2024年02月12日
    浏览(26)
  • Mybatis plus中的逻辑删除源码跟踪

    网上搜了一堆文章,都没有贴出源码: 疑问: 逻辑删除,delete和select到底是在哪改变的sql??? 一、跟踪方法——DeleteById 说明: 逻辑删除,实质用的update语句; 组装逻辑删除字段: 逻辑删除的sql(实质都是update): 至此大改已经清楚了!~ 二、跟踪方法——selectList 类似

    2024年02月08日
    浏览(29)
  • Spring Boot入门(10):Mybatis之XML映射文件>、<=等特殊符号使用 | 保姆级教程

            在Mybatis的XML映射文件中,我们经常需要使用一些特殊符号来完成SQL语句的拼接,比如小于号“”、小于等于号“=”等。然而,由于这些符号在XML中有特殊的含义,因此直接在映射文件中使用可能会导致编译错误或者运行时异常。那么,如何才能正确地使用这些特殊

    2024年02月11日
    浏览(45)
  • 认识MyBatis 之 MyBatis的动态SQL

    本篇介绍MyBatis里如何使用动态SQL,了解如何去简单使用动态标签;如有错误,请在评论区指正,让我们一起交流,共同进步! 本文开始 使用动态SQL的好处:根据不同的条件拼接 SQL 语句,提高了SQL的灵活性; if标签:判断时使用,满足test中的判断,执行if条件 格式: if te

    2024年02月14日
    浏览(30)
  • 【MyBatis】四、MyBatis中的动态SQL标签

    动态SQL语句是动态的拼接Mybatis中SQL语句的情况,可以动态的在Mybatis中使用SQL if语句的xml文件: 传入对象来进行调用: where标签中的and会被自动去掉,并且若没有合适的内容,则不会添加where 注意:where标签只能去掉条件前的and、五福去掉条件后的and trim标签会在其内容

    2024年02月09日
    浏览(31)
  • MyBatis 03 -MyBatis动态SQL与分页插件

    MyBatis的映射文件中支持在基础SQL上添加一些逻辑操作,并动态拼接成完整的SQL之后再执行,以达到SQL复用、简化编程的效果。 动态查询 where标签和if标签组合使用 动态修改 1.1 sql sql标签的作用是提取公共的sql代码片段 sql id属性:唯一标识 include refid属性:参照id 动态查询

    2023年04月15日
    浏览(32)
  • Spring Boot入门(10):Mybatis之XML映射文件中如何使用特殊符号?揭秘<、<=等符号的正确使用方法!

            在Mybatis的XML映射文件中,我们经常需要使用一些特殊符号来完成SQL语句的拼接,比如小于号“”、小于等于号“=”等。然而,由于这些符号在XML中有特殊的含义,因此直接在映射文件中使用可能会导致编译错误或者运行时异常。那么,如何才能正确地使用这些特殊

    2024年02月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包