首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

ibatis中输入/输出各种类型的参数分析及#与$差别 (转)

2012-08-28 
ibatis中输入/输出各种类型的参数分析及#与$区别 (转)(1)在数据库持久层的框架中,大家一定听过Hibernate的

ibatis中输入/输出各种类型的参数分析及#与$区别 (转)
(1)
在数据库持久层的框架中,大家一定听过Hibernate的大名了吧,经典的SSH框架就有它的一份哦!可是我今天要说的却是另外一个持久层的框架,它就是iBatis。与Hibrenate相比,它的主要优势就是简单、小巧、轻量级,但是它的功能却丝毫不亚于 Hibernate,下面让我们来看看iBatis在项目中的应用吧!iBatis确实很简单,它的工作原理就是通过SQL Map映射文件将sql语句和java对象对应起来(如:在利用对象属性的getter从属性中获取值,查询结果后,将各值用setter方法放到对象中).在iBatis中,sql语句是我们手工编写好的,这一点与Hibernate不同,Hibernate是通过映射java对象和数据库表字段来自动生成的sql语句。?(2)ibatis中的namespace与resultMap
<sqlMap namespace="admin">在运用时如下:
this.getSqlMapClient().update(“admin.update”, entity);
?
分析:
ibatis 配置文件中的useStatementNamespaces:是否使用Statement命名空间。这里的命名空间指的是映射文件中,sqlMap节点的 namespace属性,如:<sqlMap namespace="User">。这里,指定了此sqlMap节点下定义的操作均从属于"User"命名空间。
在 useStatementNamespaces="true"的情况下,Statement调用需追加命名空间,如:sqlMap.update("User.updateUser",user);否则直接通过Statement名称调用即可,如:sqlMap.update("updateUser",user);
好处:
在实际应用中,利用namespace可以防止两个同名的方法而引起冲突。如有两个updateUser,可以通过A updateUser/B. updateUser来区分。
另一种方法:
但有一种更方便的方法,可以在不采用namspace的情况下,解决上面的问题:即直接在方法的前面直接命名为A updateUser/B. updateUser。调用时,直接调用A updateUser/B. updateUser即可。如下:
<sqlMap>
?????? <typeAlias type="com.admin.entity.Admin" alias="Admin" />
?
?????? <select id="Admin.findUserByLoginName" parameteralias="Admin" />
?????? <resultMap id="AdminResult" property="id" />
????????????? <result column="loginName" property="loginName" />
????????????? <result column="password" property="password" />
????????????? <result column="staff_name" property="username" />
????????????? <result column="status" property="status" />
????????????? <result column="phone" property="phone" />
????????????? <result column="email" property="email" />
?????? </resultMap>
?
?????? <select id="Admin.findUserByLoginName" parameterparameterresultparameterresultparameterresultresultparameterremapResults="true">
??? select $fieldList$?????
??? from $table$
??? where ID = #id#
?</select>
Map p = new HashMap();
p.put("id", id);
p.put("table","APP_LOG");
p.put("fieldList", "ID,TYPE,DESCR");
Map map = (Map) sqlMapper.queryForObject("selectd", p);
String id1 = (String) map.get("ID");
String type = (String) map.get("TYPE");
String descr = (String) map.get("DESCR"); 注意:#与$区别:
1.#是把传入的数据当作字符串,如#field#传入的是id,则sql语句生成是这样,order by "id",这当然会报错..
2.$传入的数据直接生成在sql里,如#field#传入的是id,则sql语句生成是这样,order by id, 这就对了.?
?$方式一般用于传入数据库对象.例如传入表名. #方式一般用于传入插入/更新的值或查询/删除的where条件?ibatis各种返回数据集
别名映射->实体类 + resultClass
?<select id=" selectAll" resultselectAll" resultresultcolumn="ID"/>
??? <result property="type" column="Type"/>
??? <result property="descr" column="DESCR"/>???
?</resultMap>
?
<select id="selectAll" resultMap="AppLogResult">
??? select * from APP_LOG
?</select>
List list = sqlMapper.queryForList("selectAll");
for (int i = 0; i < list.size(); i ) {
??? AppLog log = (AppLog) list.get(i);
?? //add your code here;
}
显式映射->Map类:resultMap? --》把每条记录放于map中,字段名为key,值为value.
??? <resultMap id="map-result" column="ID"/>
??? <result property="type" column="Type"/>
??? <result property="descr" column="DESCR"/>
??? </resultMap>
?
<select id="selectAll2" resultMap="map-result">
??? select * from APP_LOG
?</select>
List list = sqlMapper.queryForList("selectAll2");
?????? for (int i = 0; i < list.size(); i ) {
?????????? Map map = (Map) list.get(i);
?????????? String id = (String) map.get("id");
?????????? String type = (String) map.get("type");
?????????? String descr = (String) map.get("descr");???????
?????? } ?又如:
map.put("appIds", Ids);
executor.update("Device.OpenClientApp", map);
下面的property属性及循环变量,都是对应map的key名。
???????????????? -----证明,ibatis对于hashmap,都是通过key来获取值的。所以,所有参数须用key来表示!!!
如下:
?<update id="Device.OpenClientApp" parameteropen="(" close=")" property="appIds">
??????????? #appIds[]#
??????? </iterate>
?</update>
例子:
<statement id=”statementName” parameterClass=” examples.domain.Product”>
insert into PRODUCT values (#id#, #description#, #price#, #classify.id#)
</statement> 蓝色部分#classify.id#翻译过来实际是product.getClassify().getId(),classify是Product对象的一个子对象。(4)关于参数的三种设置方法?及 ParameterMap用法前提:有一个user的javabean.一,自动参数映射:
<insert id="insertUser7" parameterparameterjdbcType="INTEGER" />
?? <parameter property="name" jdbcType="VARCHAR" />
?? <parameter property="pass" jdbcType="VARCHAR" />
</parameterMap>
<insert id="insertUser9" parameterMap="parameterMap">
?? <![CDATA[
??? INSERT INTO t_user ( ID, NAME, PASS )VALUES( ?,?,? )
?? ]]>
</insert>若此处的对象不是javabean,而是一个hashMap.用法也一样,只是id,name,pass不是javabean的属性,而是hashMap的key.

?四,利用parameterMap调用存储过程:
? 

热点排行