详解mybatis #{}和${}的区别、传参、基本语法

 更新时间:2020年07月22日 10:09:12   作者:wutongyuWxc  
这篇文章主要介绍了mybatis #{}和${}的区别、传参、基本语法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1 #{}和${}的区别、及注入问题

(1) 区别:
  首先清楚一点,动态 SQL 是 mybatis 的强大特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析,#{} 和 ${} 在预编译中的处理是不一样的:
  例如:select * from t_user where userName = #{name};
  #{}预编译:用一个占位符 ? 代替参数:select * from t_user where userName = ?
  #{}预编译:会将参数值一起进行编译:select * from t_user where userName = 'zhangsan'
(2) 使用场景:
  一般情况首选#{},因为这样能避免sql注入;如果需要传参 动态表名、动态字段名时,需要使用${}
  比如:select * from ${tableName} where id > #{id};
(3) SQL注入问题:
  举个例子,如果使用${}出现的注入问题:
  select * from ${tableName};
  如果传参 t_user;delete from t_user,则预编译后的sql如下,将会导致系统不可用:
  select * from t_user;delete from t_user;
(4) like 语句防注入:
  使用concat函数:
  select * from t_user where name like concat('%', #{name}, '%')

2 mybatis几种传参方式

非注解:
(1)单参数:
public User getUserByUuid(String uuid); 
<select id="getUserByUuid" resultMap="BaseResultMap" parameterType="Object">
  SELECT * FROM   t_user  WHERE uuid = #{uuid}
</select>
(2)多参数
public User getUserByNameAndPass(String name,String pass); 
<select id="getUserByNameAndPass" resultMap="BaseResultMap" parameterType="Object">
  SELECT * FROM t_user  WHERE t_name = #{0} and t_pass = #{1}
</select>
(3)Map参数
public User getUserByMap(Map<String,Object> map);
<select id="getUserByMap" resultMap="BaseResultMap" parameterType="java.util.Map">
  SELECT * FROM t_user  WHERE t_name = #{name} and t_pass = #{pass}
</select>
(4)实体对象参数
public int updateUser(User user);  
<select id="updateUser" resultMap="BaseResultMap" parameterType="Object">
  update t_user set t_name = #{name}, t_pass = #{pass} where uuid=#{uuid}
</select>
(4)List集合参数
public int batchDelUser(List<String> uuidList);
<delete id="batchDelUser" parameterType="java.util.List">
  DELETE FROM t_user WHERE uuid IN
  <foreach collection="list" index="index" item="uuid" open="(" separator="," close=")">
       #{uuid}
   </foreach>
</delete>
注解:
public List<User> getUserByTime(@Param("startTime")String startTime, @Param("endTime")String endTime);
<select id="getUserByTime" resultMap="BaseResultMap" parameterType="Object">
  SELECT * from t_user where createTime &gt;= #{startTime} and createTime &lt;= #{endTime}
</select>

2 choose when otherwise

//JAVA 代码
public List<Group> getUserRoleRelByUserUuid(@Param("groupUuid") String userUuid,@Param("roleList")List<String> roleUuidList);
//SQL
SELECT * from user_role where groupUuid=#{groupUuid}
   <choose>
    <when test="roleList!=null&amp;&amp;roleList.size()&gt;0">
      AND roleUuid IN
      <foreach collection="roleList" index="index" item="roleUuid" open="(" separator="," close=")">
        #{roleUuid}
      </foreach>
    </when>
    <otherwise>
      AND roleUuid IN ('')
    </otherwise>
   </choose>

3 判断字符串相等

//JAVA 代码
public int getOrderCountByParams(Map<String, Object> params);
//SQL
<select id="getOrderCountByParams" resultType="java.lang.Integer" parameterType="Object">
  SELECT count(*) FROM itil_publish_order where 1=1
     <if test="timeType == '1'.toString()" >
            AND create_time &gt;= #{timeStr}
       </if>
       <if test="timeType == '2'.toString()" >
            AND end_time &lt;= #{timeStr}
       </if>
 </select>
或者
<if test = 'timeType== "1"'> </if>

4 CONCAT函数实现 模糊匹配

<select id="getMaxSerialCode" resultType="java.lang.String" parameterType="Object">
        SELECT count(*) FROM
       itil_publish_order
        WHERE serial_code LIKE CONCAT('%',#{codeStr},'%')
        ORDER BY serial_code DESC LIMIT 1
</select>

5 大于等于、小于等于

//JAVA代码
public List<PublishOrder> getOrderCount(@Param("startTime") String startTime,@Param("startTime")List<String> startTime);
//SQL
<select id="getOrderCount" resultType="java.lang.String" parameterType="Object">
        SELECT * FROM itil_publish_order
        WHERE createTime &gt;= #{startTime} and &lt;= #{startTime}
</select>

到此这篇关于mybatis #{}和${}的区别、传参、基本语法的文章就介绍到这了,更多相关MyBatis中${}和#{}传参的区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中读取文件转换为字符串的方法

    Java中读取文件转换为字符串的方法

    今天小编就为大家分享一篇Java中读取文件转换为字符串的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • java虚拟线程的超详细讲解

    java虚拟线程的超详细讲解

    虚拟线程是由Java运行时而不是操作系统实现的Java线程,和传统线程(或称之为平台线程)之间的主要区别在于,我们可以很容易地在同一个Java进程中运行大量活动的虚拟线程,甚至数百万个,这篇文章主要介绍了java虚拟线程的相关资料,需要的朋友可以参考下
    2025-10-10
  • SpringBoot中@Value注入失败问题解决步骤

    SpringBoot中@Value注入失败问题解决步骤

    本文给大家介绍SpringBoot中@Value注入失败问题解决步骤,本文分步骤结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-09-09
  • mybatis的增删改查运用方式

    mybatis的增删改查运用方式

    这篇文章主要介绍了mybatis的增删改查运用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • spring和Mybatis逆向工程的实现

    spring和Mybatis逆向工程的实现

    本文主要介绍了使用Spring和MyBatis进行逆向工程,帮助开发者自动生成数据库相关的代码,提高开发效率和代码质量,具有一定的参考价值,感兴趣的可以了解一下
    2025-07-07
  • Java的ConcurrentHashMap中不能存储null的原因解析

    Java的ConcurrentHashMap中不能存储null的原因解析

    众所周知,在Java中Map可以存储null,而ConcurrentHashMap不能存储null值,那么为什么呢?今天通过源码分析给大家详细解读,感兴趣的朋友一起看看吧
    2022-07-07
  • Java语言中cas指令的无锁编程实现实例

    Java语言中cas指令的无锁编程实现实例

    这篇文章主要介绍了Java语言中cas指令的无锁编程实现实例,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • Spring Cloud接口突然变慢的解决方案

    Spring Cloud接口突然变慢的解决方案

    在Spring Cloud项目中,接口突然变慢可能是由多种原因造成的,本文给大家介绍了一些可能的原因以及相应的解决方案,通过代码示例给大家讲解的非常详细,需要的朋友可以参考下
    2024-01-01
  • 深入理解java动态代理机制

    深入理解java动态代理机制

    本篇文章主要介绍了深入理解java动态代理机制,详细的介绍动态代理有哪些应用场景,什么是动态代理,怎样使用,它的局限性在什么地方?有兴趣的可以了解一下。
    2017-02-02
  • SpringBoot整合EasyExcel实现文件导入导出

    SpringBoot整合EasyExcel实现文件导入导出

    这篇文章主要介绍了SpringBoot整合EasyExcel实现文件导入导出的方法,帮助大家更好的理解和学习使用SpringBoot,感兴趣的朋友可以了解下
    2021-05-05

最新评论