栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

详解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 = #{name} and t_pass = #{pass}

(4)实体对象参数
public int updateUser(User user);  

(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 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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/133055.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号