iBatis总述
版权声明:本文作者cctvx1
(springside保留版权,转载请注明出处:http://wiki.springside.org.cn/display/springside/iBatis
)
1.资料
2. SpringSide的封装
2.1 IBatisGenericDao
SpringSide 在Spring SqlMapClientDaoSupport基础上封装的DAO,功能如下:
1.应用范型,使得find(), get() 这些函数不再返回Object,不再需要强制类型转换。
2.提供各种finder的简便函数
应用了JDK5可变参数的hsql查询函数:List find(String hql, Object... values)
简单查询的简化函数:findBy(Class entityClass,String name,Object value) ,findUniqueBy(Class entityClass,String name, Object value),findByLike(Class entityClass,String name,Object value)
3.分页函数:Page pagedQuery(Criteria criteria, int pageNo, int pageSize) /Page pagedQuery(String hql, int pageNo, int pageSize, Object... args) 。
4.由于IBatis本身的特性,因此有少数方法的使用和HiberGenericDAO不太一样,如save传入的必须是一个指定操作方式的map(参看helloworld下面的UserManagerIBatisTest)
2.2 IBatisEntityDao
所有UserManager, ProductManager之类只管理一类对象的Manager类的基类,只需要在类定义处声明Entity类型即可。
3. iBatis配置Tips
在IBatis的xml映射里面有不少小窍门可以值得使用:
3.1 使用namespace规划自己的xml映射文件
<sqMap namespace="cn.uisoft.dao">
<insert id="insertUserAccount" parmeterClass="cn.uisoft.bean.UserAccount">
.......
</insert>
</sqlMap>
3.2 使用typeAlias
上面的那个cn.uisoft.bean.UserAccount是不是太长?加上一个alias就可以在后面直接使用这个parmeterClass="cn.uisoft.bean.UserAccount了
<typeAlias alias="UserAccount" type="cn.uisoft.bean.UserAccount">
3.3 使用默认几种map映射,比如map,int,string,让程序更加灵活
<select id="countUser" parameterClass="map" resultClass="int" >
SELECT
count(user_id)
From
game_users where user_type=#userType# and game_id=#gameId#
</select>
3.4 $与#
上面都是使用#的,这个的特点是ibatis会根据反射自动加上一些sql符号,比如字符串的'',但是$就是不加任何符号,直接嵌入sql比如 String a="Jack";
SELECT
count(user_id)
From
game_users where user_type=#userType# and game_id=#gameId#
就ok,但是如果
SELECT
count(user_id)
From
game_users where user_type=#userType# and game_id=$gameId$
就会因为sql语句是......game_id=Jack 报错 因为sql语法 要求game_id='Jack' 表示字符串
当然$因此可以直接参与sql逻辑,但是往往直接使用更容易出错误或者导致隐藏的类似于sql注入的漏洞
个人建议 自己做一个辅助类可以类似于Criteria 这种,自己包装生成用于$的sql(不过那样的话可能要考虑各种数据的不同)
以下是一个简单的$使用 根据不同的字段取去topten的数据、
<select id="getTopDB" parameterClass="map" resultClass="dbtopuser" >
Use $dbName$
SELECT
username,nickname,$filedName$ as queryValue
From
game_users order by $filedName$ DESC
</select>
3.5 关于动态remapResults="true"的说明
如果你使用下面这种动态语句的时候,在第二次传入参数tableName或者resultMap参数不同的时候会
SQLException:Invaild column name 错误,因为IBatis有自己的AutoReusltMap的cache,他总是用上次的column去匹配表,
解决的方法就是使用多个statement或者设置remapResults="true" 就是每次会自动重新映射
<select id="selectTable" parameterClass="map" resultMap="$resultMap$" >
Use $dbName$
SELECT
*
From
$tabileName$
</select>