有关mybatis知识点解析 mybatis调用存储过程( 四 )


当然了,不光是Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的 。
映射器#{}和${}的区别
#{}是占位符,预编译处理;${}是拼接符,字符串替换,没有预编译处理 。Mybatis在处理#{}时,#{}传入参数是以字符串传入,会将SQL中的#{}替换为?号,调用PreparedStatement的set方法来赋值 。Mybatis在处理时 , 是 原 值 传 入 , 就 是 把 {}时,是原值传入,就是把时,是原值传入,就是把{}替换成变量的值,相当于JDBC中的Statement编译变量替换后,#{} 对应的变量自动加上单引号 ‘’;变量替换后,${} 对应的变量不会加上单引号 ‘’#{} 可以有效的防止SQL注入,提高系统安全性;${} 不能防止SQL 注入#{} 的变量替换是在DBMS 中;${} 的变量替换是在 DBMS 外模糊查询like语句该怎么写 (1) ’%${question}%’ 可能引起SQL注入,不推荐
(2)”%”#{question}”%” 注意:因为#{…}解析成sql语句时候,会在变量外侧自动加单引号’ ‘,所以这里 % 需要使用双引号” “,不能使用单引号 ’ ‘,不然会查不到任何结果 。
(3)CONCAT(’%’,#{question},’%’) 使用CONCAT()函数,推荐
(4)使用bind标签
<select id="listUserLikeUsername" resultType="com.jourwon.pojo.User"><bind name="pattern" value="'%' + username + '%'" />select id,sex,age,username,password from person where username LIKE #{pattern}</select>在mapper中如何传递多个参数方法1:顺序传参法
public User selectUser(String name, int deptId);<select id="selectUser" resultMap="UserResultMap">select * from userwhere user_name = #{0} and dept_id = #{1}</select>#{}里面的数字代表传入参数的顺序 。
这种方法不建议使用,sql层表达不直观,且一旦顺序调整容易出错 。
方法2:@Param注解传参法
public User selectUser(@Param("userName") String name, int @Param("deptId") deptId);<select id="selectUser" resultMap="UserResultMap">select * from userwhere user_name = #{userName} and dept_id = #{deptId}</select>#{}里面的名称对应的是注解@Param括号里面修饰的名称 。
这种方法在参数不多的情况还是比较直观的,推荐使用 。
方法3:Map传参法
public User selectUser(Map<String, Object> params);<select id="selectUser" parameterType="java.util.Map" resultMap="UserResultMap">select * from userwhere user_name = #{userName} and dept_id = #{deptId}</select>#{}里面的名称对应的是Map里面的key名称 。
这种方法适合传递多个参数,且参数易变能灵活传递的情况 。
方法4:Java Bean传参法
public User selectUser(User user);<select id="selectUser" parameterType="com.jourwon.pojo.User" resultMap="UserResultMap">select * from userwhere user_name = #{userName} and dept_id = #{deptId}</select> #{}里面的名称对应的是User类里面的成员属性 。
这种方法直观,需要建一个实体类,扩展不容易,需要加属性,但代码可读性强,业务逻辑处理方便,推荐使用 。
Mybatis如何执行批量操作使用foreach标签
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合 。foreach标签的属性主要有item,index,collection,open,separator,close 。
item表示集合中每一个元素进行迭代时的别名,随便起的变量名;index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,不常用;open表示该语句以什么开始,常用“(”;separator表示在每次进行迭代之间以什么符号作为分隔符,常用“,”;close表示以什么结束,常用“)” 。在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: