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

网友投稿 397 2022-11-30


详解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 * FROM   t_user  WHERE uuid = #{uuid}

(2)多参数

public User getUserByNameAndPass(String name,String pass);

SELECT * FROM t_user  WHERE t_name = #{0} and t_pass = #{1}

(3)Map参数

public User getUserByMap(Map map);

SELECT * FROM t_user  WHERE t_name = #{name} and t_pass = #{pass}

(4)实体对象参数

public int updateUser(User user);

update t_user set t_name = #{name}, t_pass = #{pass} where uuid=#{uuid}

(4)List集合参数

public int batchDelUser(List uuidList);

DELETE FROM t_user WHERE uuid IN

      #{uuid}

 

注解:

public List getUserByTime(@Param("startTime")String startTime, @Param("endTime")String endTime);

SELECT * from t_user where createTime >= #{startTime} and createTime <= #{endTime}

2 choose when otherwise

//JAVA 代码

public List getUserRoleRelByUserUuid(@Param("groupUuid") String userUuid,@Param("roleList")List roleUuidList);

//SQL

SELECT * from user_role where groupUuid=#{groupUuid}

 

AND roleUuid IN

#{roleUuid}

AND roleUuid IN ('')

 

3 判断字符串相等

//JAVA 代码

public int getOrderCountByParams(Map params);

//SQL

SELECT count(*) FROM itil_publish_order where 1=1

 

           AND create_time >= #{timeStr}

     

     

           AND end_time <= #{timeStr}

     

或者

4 CONCAT函数实现 模糊匹配

       SELECT count(*) FROM

      itil_publish_order

       WHERE serial_code LIKE CONCAT('%',#{codeStr},'%')

       ORDER BY serial_code DESC LIMIT 1

5 大于等于、小于等于

//JAVA代码

public List getOrderCount(@Param("startTime") String startTime,@Param("startTime")List startTime);

//SQL

       SELECT * FROM itil_publish_order

       WHERE createTime >= #{startTime} and <= #{startTime}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)
下一篇:深入理解Java 线程池
相关文章

 发表评论

暂时没有评论,来抢沙发吧~