详解mybatis #{}和${}的区别、传参、基本语法
1#{}和${}的区别、及注入问题
(1)区别:
首先清楚一点,动态SQL是mybatis的强大特性之一,在mapper中定义的参数传到xml中之后,在查询之前mybatis会对其进行动态解析,#{}和${}在预编译中的处理是不一样的:
例如:select*fromt_userwhereuserName=#{name};
#{}预编译:用一个占位符?代替参数:select*fromt_userwhereuserName=?
#{}预编译:会将参数值一起进行编译:select*fromt_userwhereuserName='zhangsan'
(2)使用场景:
一般情况首选#{},因为这样能避免sql注入;如果需要传参动态表名、动态字段名时,需要使用${}
比如:select*from${tableName}whereid>#{id};
(3)SQL注入问题:
举个例子,如果使用${}出现的注入问题:
select*from${tableName};
如果传参t_user;deletefromt_user,则预编译后的sql如下,将会导致系统不可用:
select*fromt_user;deletefromt_user;
(4)like语句防注入:
使用concat函数:
select*fromt_userwherenamelikeconcat('%',#{name},'%')
2mybatis几种传参方式
非注解: (1)单参数: publicUsergetUserByUuid(Stringuuid);SELECT*FROM t_user WHEREuuid=#{uuid} (2)多参数 publicUsergetUserByNameAndPass(Stringname,Stringpass); SELECT*FROMt_user WHEREt_name=#{0}andt_pass=#{1} (3)Map参数 publicUsergetUserByMap(Map map); SELECT*FROMt_user WHEREt_name=#{name}andt_pass=#{pass} (4)实体对象参数 publicintupdateUser(Useruser); updatet_usersett_name=#{name},t_pass=#{pass}whereuuid=#{uuid} (4)List集合参数 publicintbatchDelUser(List uuidList); DELETEFROMt_userWHEREuuidIN #{uuid} 注解: publicList getUserByTime(@Param("startTime")StringstartTime,@Param("endTime")StringendTime); SELECT*fromt_userwherecreateTime>=#{startTime}andcreateTime<=#{endTime}
2choosewhenotherwise
//JAVA代码 publicListgetUserRoleRelByUserUuid(@Param("groupUuid")StringuserUuid,@Param("roleList")List roleUuidList); //SQL SELECT*fromuser_rolewheregroupUuid=#{groupUuid} ANDroleUuidIN #{roleUuid} ANDroleUuidIN('')
3判断字符串相等
//JAVA代码 publicintgetOrderCountByParams(Mapparams); //SQL SELECTcount(*)FROMitil_publish_orderwhere1=1 ANDcreate_time>=#{timeStr} ANDend_time<=#{timeStr} 或者
4CONCAT函数实现模糊匹配
SELECTcount(*)FROM itil_publish_order WHEREserial_codeLIKECONCAT('%',#{codeStr},'%') ORDERBYserial_codeDESCLIMIT1
5大于等于、小于等于
//JAVA代码 publicListgetOrderCount(@Param("startTime")StringstartTime,@Param("startTime")List startTime); //SQL SELECT*FROMitil_publish_order WHEREcreateTime>=#{startTime}and<=#{startTime}
到此这篇关于mybatis#{}和${}的区别、传参、基本语法的文章就介绍到这了,更多相关MyBatis中${}和#{}传参的区别内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!