mybatis学习笔记--常见的问题

来源:互联网 发布:淘宝上的学历是真的吗 编辑:程序博客网 时间:2024/06/12 15:26

1. #{...} 和 ${...} 有什么区别?

mybati  将#{...} 解释为jdbc prepared statement 中的参数, 而将$ {...}用作字符串的替换功能.知道其中的差别重要的是很重要,因为在某些地方,在SQL语句的某些地方不能使用参数创造器. 例如,您不能使用一个参数标记指定表名. 例如下面的代码:

[java] view plaincopyprint?
  1. Map<String, Object> parms = new HashMap<String, Object>();  
  2. parms.put("table""foo");  
  3. parms.put("criteria"37);  
  4. List<Object> rows = mapper.generalSelect(parms);  
[html] view plaincopyprint?
  1. <select id="generalSelect" parameterType="map">  
  2.   select * from ${table} where col1 = #{criteria}  
  3. </select>  

mybatis会生成如下的prepared statement

[html] view plaincopyprint?
  1. select * from foo where col1 = ?  

小提示: 使用${}(字符串替换)会有注入攻击的危险, 并且在多种类型(如时间类型)并存的情况下会产生较多的问题, 所以建议使用#{}, 而非${}.

2.如何编写模糊查询语句(like 语句)?

两种方法:
1,在java代码中用SQL通配符追加(推荐首选),如下例:
[java] view plaincopyprint?
  1. String wildcardName = "%Smi%";  
  2. List<Name> names = mapper.selectLike(wildcardName);  

[html] view plaincopyprint?
  1. <select id="selectLike">  
  2.   select * from foo where bar like #{value}  
  3. </select>  
2.在sql语句中拼接通配符, 由于可能的sql注入,所以此种方法的安全性低于方法①, 如下:
[java] view plaincopyprint?
  1. String wildcardName = "Smi";  
  2. List<Name> names = mapper.selectLike(wildcardName);  

[html] view plaincopyprint?
  1. <select id="selectLike">  
  2.   select * from foo where bar like '%' || '${value}' || '%'  
  3. </select>  
小提示:方法②中使用 ${} 喔 !

3. 我怎么编写一个批处理insert呢?

首先,写一个插入的声明语句,如下:
[html] view plaincopyprint?
  1. <insert id="insertName">  
  2.   insert into names (name) values (#{value})  
  3. </insert>  
然后,在java中执行如下的批处理程序:
[java] view plaincopyprint?
  1. List<String> names = new ArrayList<String>();  
  2. names.add("Fred");  
  3. names.add("Barney");  
  4. names.add("Betty");  
  5. names.add("Wilma");  
  6.             
  7. SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);  
  8. try {  
  9.   NameMapper mapper = sqlSession.getMapper(NameMapper.class);  
  10.   for (String name : names) {  
  11.     mapper.insertName(name);  
  12.   }  
  13.   sqlSession.commit();  
  14. finally {  
  15.   sqlSession.close();  
  16. }  
很简单!对吧.

4.怎么查询自增长的key值呢?(即怎么查刚刚插入的那条数据的id).

insert方法总是返回一个int类型的数字,这个数字就是刚刚插入数据的行号,也就是id. 自增长的key值先放入参数对象中,待插入操作完成后可见.如下例子:
[html] view plaincopyprint?
  1. <insert id="insertName" useGeneratedKeys="true" keyProperty="id">  
  2.   insert into names (name) values (#{name})  
  3. </insert>  
[java] view plaincopyprint?
  1. Name name = new Name();  
  2. name.setName("Fred");  
  3.             
  4. int rows = mapper.insertName(name);  
  5. System.out.println("rows inserted = " + rows);  
  6. System.out.println("generated key value = " + name.getId());  

5. 怎么在一个映射中使用多个参数?

java的反射并不知能知道方法的各参数名,mabatis中默认将他们命名为:param1,param2....如果你想重命名的话,使用@param 声明的方式.如下:
[java] view plaincopyprint?
  1. import org.apache.ibatis.annotations.Param;  
  2. public interface UserMapper {  
  3.    User selectUser(@Param("username") String username, @Param("hashedPassword") String hashedPassword);  
  4. }  
这样, 你就能在xml中使用啦,如下:
[html] view plaincopyprint?
  1. <select id=”selectUser” resultType=”User”>  
  2.   select id, username, hashedPassword  
  3.   from some_table  
  4.   where username = #{username}  
  5.   and hashedPassword = #{hashedPassword}  
  6. </select>  

the end !

转载自 :鼠口拔牙博客  http://blog.csdn.net/nich002/article/details/8930059

1 0
原创粉丝点击