当前位置: 首页 > 编程笔记 >

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

宦源
2023-03-14
本文向大家介绍详解mybatis #{}和${}的区别、传参、基本语法,包括了详解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中${}和#{}传参的区别内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍Mybatis-Plus和Mybatis的区别详解,包括了Mybatis-Plus和Mybatis的区别详解的使用技巧和注意事项,需要的朋友参考一下 原文:https://blog.csdn.net/qq_34508530/article/details/88943858 . 区别一 如果Mybatis Plus是扳手,那Mybatis Generator就是生产扳手的工厂。 通俗来

  • 本文向大家介绍详解Mybatis中的 ${} 和 #{}区别与用法,包括了详解Mybatis中的 ${} 和 #{}区别与用法的使用技巧和注意事项,需要的朋友参考一下 Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和${} 我们经常使用的是#{},一般解说是因为这种方式可以防止SQL注入,简单的说#{}这种方式SQL语句是经过预编译的,它是

  • 本文向大家介绍详解JSONObject和JSONArray区别及基本用法,包括了详解JSONObject和JSONArray区别及基本用法的使用技巧和注意事项,需要的朋友参考一下  一、JSONObject和JSONArray的数据表示形式 JSONObject的数据是用 {  } 来表示的,         例如:   { "id" : "123", "courseID" : "huangt-t

  • 本文向大家介绍C#基础语法:结构和类区别详解,包括了C#基础语法:结构和类区别详解的使用技巧和注意事项,需要的朋友参考一下 结构和类很相似,也可以包含数据成员和函数成员,但是与类不同,结构是一种值类型,(我们可以理解为一种特殊的值类型所以不存在继承的问题)为其分配数据不需要从托管堆中分配存储器。结构类型的变量直接包含了该结构的数据,而类类型的变量所包含的只是对相应对象的一个引用。  下面总结一下结

  • 本文向大家介绍Mybatis的几种传参方式详解,包括了Mybatis的几种传参方式详解的使用技巧和注意事项,需要的朋友参考一下 前言 前几天恰好面试一个应届生,问了一个很简单的问题:你了解过Mybatis中有几种传参方式吗? 没想到其他问题回答的很好,唯独这个问题一知半解,勉强回答了其中两种方式。 于是这篇文章就来说一说Mybatis传参的几种常见方式,给正在面试或者准备面试的朋友巩固一下。 单个

  • Hibernate 和 MyBatis 都是目前业界中主流的对象关系映射(ORM)框架,它们的主要区别如下。 1)sql 优化方面 Hibernate 使用 HQL(Hibernate Query Language)语句,独立于数据库。不需要编写大量的 SQL,就可以完全映射,但会多消耗性能,且开发人员不能自主的进行 SQL 性能优化。提供了日志、缓存、级联(级联比 MyBatis 强大)等特性。