mybatis中的${} 和#{} 的作用和区别
当使用parameterType向SQL传递参数的时候,可以使用基本数据类型int,String,Map和自定义的Model类,在SQL中引用这些参数的时候两种方式都可以使用。
示例1: 执行SQL:Select * from emp where name = #{employeeName} 参数:employeeName=>Smith 解析后执行的SQL:Select * from emp where name = ? ==》Select * from emp where name = ‘Simith’ 执行SQL:Select * from emp where name = ${employeeName} 参数:employeeName传入值为:Smith 解析后执行的SQL:Select * from emp where name =Smith
#{} 会生成preparedStatement .预编译SQL语句,这样比较安全,防止SQL注入,而且传入的值是字符串类型
${} : 相当于直接赋值,不能防止SQL注入和预编译
总结,建议使用#{}方式,但是在order by ${name} 这些固定不变的情况下,也可以使用${} 方式。
参考:http://blog.csdn.net/szwangdf/article/details/26714603
http://blog.csdn.net/kobi521/article/details/16941403
http://blog.csdn.net/shaozengwei/article/details/17446247
二.mybatis 中使用模糊语句查询
模糊查询:
工作中用到,写三种用法吧,第四种为大小写匹配查询
1. sql中字符串拼接
SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('%', #{text}), '%');
2. 使用 ${...} 代替 #{...}
SELECT * FROM tableName WHERE name LIKE '%${text}%';
3. 程序中拼接
Java
// or String searchText = "%" + text + "%";
String searchText = new StringBuilder("%").append(text).append("%").toString();
parameterMap.put("text", searchText);
SqlMap.xml
SELECT * FROM tableName WHERE name LIKE #{text};
4. 大小写匹配查询
[sql] view plaincopy
SELECT * FROM TABLENAME WHERE UPPER(SUBSYSTEM) LIKE '%' || UPPER('jz') || '%'
--或者是
SELECT * FROM TABLENAME WHERE LOWER(SUBSYSTEM) LIKE '%' || LOWER('jz') || '%'
参考:http://blog.csdn.net/luqin1988/article/details/7865643
三 ,mybatis中resultMap 和resultType 的区别
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key-->value关系),但是resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
参考:http://www.tuicool.com/articles/ju2Y7n