Dashboard > SpringSide Wiki > ... > DAO > iBatis
  SpringSide Wiki Log In | Sign Up   View a printable version of the current page.  
  iBatis
Added by SpringSideTeam, last edited by Calvin on 2007-08-21  (view change)
Labels: 
(None)

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>

Site powered by a free Open Source Project / Non-profit License (more) of Confluence - the Enterprise wiki.
Learn more or evaluate Confluence for your organisation.
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.2.9 Build:#527 2006-09-07) - Bug/feature request - Contact Administrators