iBatis进阶(上)
小技巧:提示自动补全问题
在写配置文件的时候,我们希望文件会带有提示功能,所以在配置文件上都会引用此文件的定义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" parameterClass="java.lang.String" resultClass="a.Account"> select * from user_account where username like '%#username#%' </select>
这样是错误的,我们要写成
<select id="select1" parameterClass="java.lang.String" resultClass="a.Account"> select * from user_account where username like '%$username$%' </select>
二:resultMap
<!-- 显示映射->实体类 --> <resultMap id="accoutResult" class="com.air.Account"> <result property="userid" column="USERID" /> <result property="username" column="USERNAME" /> <result property="userpwd" column="USERPWD" /> <result property="groupname" column="GROUPNAME" /> </resultMap> <select id="getAllUsers4" resultMap="accoutResult" parameterClass="string"> SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName# </select>
三:返回XML
<!-- XML --> <select id="selectXML" parameterClass="string" resultClass="xml" xmlResultName="log"> SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName# </select>
四:paramterMap
<!-- 外联参数映射 --> <parameterMap id="parameterMapEx" class="com.air.Account"> <parameter property="username" jdbcType="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" parameterClass="a.Account" > <selectKey resultClass="int" keyProperty="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" class="java.util.Map"> <parameter property="name" 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);