读书人

ibatis高级施用

发布时间: 2012-08-26 16:48:06 作者: rapoo

ibatis高级应用
在iBatis的快速入门文章里已经有了简单例子,在这里,只对高级应用说明!
iBatis官方站点:http://ibatis.apache.org/
小技巧:提示自动补全问题
在写配置文件的时候,我们希望文件会带有提示功能,所以在配置文件上都会引用此文件的定义DTD,例:
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"

"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"

"http://ibatis.apache.org/dtd/sql-map-2.dtd">

可是,在没有上网的情况下,无法得到提示,因为找不到DTD文件,我们可以有两种方式解决这个问题:
a:直接把上面两个地址复制到浏览器上,可以下载这两个DTD文件。

b:在iBatis.jar的com.ibatis.sqlmap.engine.builder.xml这个包里面找到DTD文件。

然后,我们只需要把DTD文件的路径指定上即可:

我把他放到了与类文件同一目录下,所以路径为

<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"

"./sql-map-config-2.dtd">
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"

"./sql-map-2.dtd">

创建例子数据库:
create table user_account
(
userid int,
username varchar2(10),
userpwd varchar2(10),
groupname varchar2(10)
);
insert into user_account values(1,'JACK','BEIJING','NBA');
insert into user_account values(2,'TOM','SHANGHAI','NBA');
insert into user_account values(3,'MARY','SHANGHAI','IBM');
返回是POJO类或hashmap是类似的!

一:#与$的区别
我们在用到模糊查询的时候,如果写成
<select id="select1" parameterresultparameterresultcolumn="USERID" />
<result property="username" column="USERNAME" />
<result property="userpwd" column="USERPWD" />
<result property="groupname" column="GROUPNAME" />
</resultMap>
<select id="getAllUsers4" resultMap="accoutResult"
parameterparameterresultjdbcType="VARCHAR"/>
<parameter property="password" jdbcType="VARCHAR"/>
<parameter property="groupname" jdbcType="VARCHAR"/>
</parameterMap>
<insert id="insertOneUser3" parameterMap="parameterMapEx">
INSERT INTO USER_ACCOUNT
(
USERNAME, PASSWORD, GROUPNAME
)VALUES(
?,?,?
)
</insert>
五:自动生成主键
<insert id="insertOneUser4" parameter>
<selectKey resultkeyProperty="id" >
SELECT Sys_Public_Sequence.NEXTVAL AS id FROM DUAL
</selectKey>
INSERT INTO USER_ACCOUNT
(
USERID, USERNAME, PASSWORD, GROUPNAME
)VALUES(
#id#,#username#,#userpwd#,#groupname#
)
</insert>
六:调用存储过程
Map m=new HashMap();
m.put("name", new String("LISI"));
sqlMapClient.update("pro_insert",m);
System.out.println("call procedure ok!");
<!-- 存储过程 -->
<parameterMap id="pro" jdbcType="VARCHAR"
javaType="string" mode="IN"/>
</parameterMap>
<procedure id="pro_insert" parameterMap="pro">
{call new_proc(?)}
</procedure>
七:批处理
//批处理
Account c1=new Account();
c1.setUsername("ZHOUQI");
c1.setUserpwd("QINGDAO");
c1.setGroupname("CN");
Account c2=new Account();
c2.setUsername("WANGWU");
c2.setUserpwd("NANJING");
c2.setGroupname("CN");
sqlMapClient.startBatch();
sqlMapClient.insert("insertOneUser3",c1);
sqlMapClient.insert("insertOneUser3",c2);
sqlMapClient.executeBatch();
八:RowHandler
当我们需要对查询后的结果进行加工的时候,我们可以在用到这个RowHandler。它类似一个过滤器,在结果返回前进行加工。
比如说,我们想把查询结果组成一整个XML文件,这里为什么要说“一整个”呢?因为如果把resultClass指定为xml的时候,也可以返回XML文件,只不过这个时候是把每一条记录转换成了一个XML文件,这样就产生了多个XML文件,而在这个例子中,我们得到的XML文件是唯一的:
1:先定义一个实现了RowHandler接口的类XmlRowHandler
public class XmlRowHandler implements RowHandler {
public StringBuffer xmlDocument=new StringBuffer("<AccountList>");
public void handleRow(Object o) {
// TODO Auto-generated method stub
Account acc=(Account)o;
xmlDocument.append("<account>");
xmlDocument.append("<accountID>");
xmlDocument.append(acc.getUserid());
xmlDocument.append("</accountID>");
xmlDocument.append("<username>");
xmlDocument.append(acc.getUsername());
xmlDocument.append("</username>");
xmlDocument.append("<password>");
xmlDocument.append(acc.getPassword());
xmlDocument.append("</password>");
xmlDocument.append("<groupname>");
xmlDocument.append(acc.getGroupname());
xmlDocument.append("</groupname>");
xmlDocument.append("</account>");
}
public String getXmlDocument() {
xmlDocument.append("</AccountList>");
return xmlDocument.toString();
}}
2:用queryWithRowHandler调用查询语句,把XmlRowHandler类的一个实例做为参数传过去,这样,查询的结果就会到XmlRowHandler中去处理!
//RowHandle生产XML
XmlRowHandler rh=new XmlRowHandler();
sqlMap.queryWithRowHandler("getAllUsers1", "CN", rh);
String xmlDoc=rh.getXmlDocument();
System.out.println(xmlDoc);

读书人网 >软件架构设计

热点推荐