ibatis学习注意事项

1.对于多参数的问题:

在ibatis中,会发现其输入参数只能有一个,于是当出现需要进行多个输入参数的时候,就要想点办法了,我看到的有以下两种比较好的方法能够解决这个问题
用String代替
<select id="checkLogin" parameterClass="java.lang.String" resultClass="java.lang.Integer">
SELECT count(*) AS value FROM userinfo WHERE $sql$
</select>
比如如上的map statement代码中,将输入的参数设置为String类型,而在select语句中直接使用该String,于是用户可以在Java程序代码中手工植入需要匹配的参数。
String sql = "uid = '" + username + "' and pwd='" + password + "'";
Integer r = (Integer) sqlMap.queryForObject("checkLogin", sql);
这个方法很简单,但是弊端也很多。首先得需要用户自己手动写sql语句代码在java中,这与ibatis的本质要将数据层的操作和业务逻辑操作分隔开来是违背的。其次,这个办法可能会被利用造成sql injection的问题。比如在sql语句的最后加上一句;drop some table。这样的结果显而易见,就是灾难性的。

Map

情形一:
<select id="checkLogin2" parameterClass="java.util.Map" resultClass="java.lang.Integer">
SELECT count(*) AS value FROM userinfo WHERE uid=#uid# and pwd=#pwd#
</select>
这种办法显得要清楚的很多,也不需要自己手动编写sql到java之中。
Map map=new HashMap();
map.put("uid", username);
map.put("pwd", password);
Integer r = (Integer) sqlMap.queryForObject("checkLogin2", map);
在java中首先生成需要的map,然后作为输入参数传入即可。这个方法应该是比较好的,值得推荐。

情形二:

在方法体里:我们把多个参数存放在map里,然后在前面获得它:

Map map = new HashMap();
map.put("userid", userid);
map.put("name", name);

cardList = (List)sqlMapClient.queryForList("findByName", map);

在SQL语句中:

<select id="findByName" parameterClass="java.util.Map" resultClass="Card">
select * from cardinfo where userid=#userid# and name like '$name$'
</select>

这样就可以将多个参数传过去了。

2.ibatis动态update

情形一

<update id="updateUser" parameterClass="user">    
      update user  
       <dynamic prepend="set">  
           <isNotNull prepend="," property="username">            
                username=#username#  
            </isNotNull>  
           <isNotNull prepend="," property="password">            
                password=#password#  
            </isNotNull>  
       </dynamic>  
      where id=#id#    
</update> 

 情形二

<update id="updateUser" parameterClass="user">      
     update table      
      set ID=#ID#     
     <isNotEmpty prepend="," property="name">    
         NAME=#name#     
     </isNotEmpty>    
     <isNotEmpty prepend="," property="pwd">    
         PWD=#pwd#     
     </isNotEmpty>    
     <isNotEmpty prepend="," property="add">     
         ADD=#add#      
     </isNotEmpty>    
      where ID=#ID#     
</update> 

3.ibatis中的#和$的使用区别:

在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行编译,进行类型匹配,而$不进行数据类型匹配,例如:
select * from table where id = #id# ,其中如果字段id为字符型,那么#id#表示的就是'id'类型,如果id为整型,那么#id#就是id类型。
select * from table where id = $id$ ,如果字段id为整型,Sql语句就不会出错,但是如果字段id为字符型,那么Sql语句应该写成 select * from table where id = '$id$'

说通俗一点就是:
  $中间的变量就是直接替换成值的
  #会根据变量的类型来进行替换
  比如articleTitle的类型是string, 值是"标题"的时候
  $articleTitle$ = 标题
  #articleTitle# = '标题'

猜你喜欢

转载自chenzheng8975.iteye.com/blog/1726275