這一章節是本系列文章最后一篇。經歷過前三篇文章的洗禮,相信你對 iBATIS SQL Maps 有比較詳細的認識了吧?
來看看新需求:
張三后來做生意,自己經營得很好,打算再買輛車跑運輸。對于第二次買車,車輛管理系統的 PEOPLE 表原本已經記錄了他的基本信息,遂不對 PEOPLE 表操作。只向 AUTO_INFO 表 insert 一條車輛記錄即可。
新需求所用到的技術要點都在《 iBATIS SQL Maps(二) 》和《 iBATIS SQL Maps(三) 》中出現過了。請看映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
<sqlMap>
? <insert id="insertAutoInfo" parameterClass="bo.AutoInfo">
??? <resultMap id="get-autoInfo-result" class="bo.AutoInfo">
??? <resultMap id="get-people-result" class="bo.People">
? <select id="getPeople" resultMap="get-people-result" parameterClass="bo.People">
? <select id="getAutoInfo" resultMap="get-autoInfo-result" parameterClass="int">
??
??? PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
??? "
http://www.ibatis.com/dtd/sql-map-2.dtd
">
??? <![CDATA[
????? insert into auto_info (license_plate, owner_no) values (#licensePlate#, #ownerNo.id#)
??? ]]>
? </insert>
??????? <result property="id" column="auto_id"/>
??????? <result property="licensePlate" column="license_plate"/>
??? </resultMap>
??????? <result property="id" column="owner_id"/>
??????? <result property="name" column="name"/>
??????? <result property="address" column="address"/>
??????? <result property="autoInfoList" column="owner_id" select="getAutoInfo"/>
??? </resultMap>
?????? <![CDATA[
?????? select * from people
?????? ]]>
?????? <dynamic prepend="where">
???????? <isNotNull property="id">
?????????? <![CDATA[
?????????? owner_id=#id#
?????????? ]]>
???????? </isNotNull>
?????? </dynamic>
? </select>
?????? <![CDATA[
?????? select * from auto_info where owner_no=#id#
??????? ]]>
? </select>
?
</sqlMap>
簡單地組合一下以前出現過的映射文件,就能滿足新需求。相應程序代碼如下:
package test;
import java.io.Reader;
import com.ibatis.sqlmap.client.*;
import bo.*;
public class AutoMag {
?private Reader reader;
???????AutoInfo autoInfo=new AutoInfo();
??
import com.ibatis.common.resources.*;
?private SqlMapClient sqlMap;
?private String resource = "SqlMapConfig.xml";
?
?public void insertPeople() throws Exception{
??try{
?????? reader = Resources.getResourceAsReader(resource);
?????? sqlMap=SqlMapClientBuilder.buildSqlMapClient(reader);
?????? sqlMap.startTransaction();
?????
?????? People people=new People();
?????? people.setId(new Integer("1"));
?????? people=(People)sqlMap.queryForObject("getPeople",people);
???????autoInfo.setLicensePlate("A00002");
???????autoInfo.setOwnerNo(people);
?????? sqlMap.insert("insertAutoInfo",autoInfo);
?????
?????? sqlMap.commitTransaction();
??}finally{
?????? sqlMap.endTransaction();
??}
?}
}
程序代碼也是簡單組合一下而已,想想 Hibernate 又是怎么寫的呢?相信有 JDBC 經驗的程序員應該更喜歡 iBATIS SQL Maps !
斗轉星移、峰回路轉, 張三在經歷過生意紅火之后,接下來的一年內生意場上連連告負,不得不把自己的攤子收縮一下。這第一件事要把跑運輸的車賣掉,就是 那輛牌照為 “ A00002” 的 。
相應映射文件只需小小修改:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
<sqlMap>
??? <resultMap id="get-autoInfo-result" class="bo.AutoInfo">
??? <resultMap id="get-people-result" class="bo.People">
? <select id="getPeople" resultMap="get-people-result" parameterClass="bo.People">
? <select id="getAutoInfo" resultMap="get-autoInfo-result" parameterClass="int">
?
??? PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
??? "
http://www.ibatis.com/dtd/sql-map-2.dtd
">
?
? <delete id="deleteAutoInfo" parameterClass="bo.AutoInfo">
??? <![CDATA[
??? delete from auto_info where license_plate=#licensePlate# and owner_no=#ownerNo.id#
??? ]]>
? </delete>
??????? <result property="id" column="auto_id"/>
??????? <result property="licensePlate" column="license_plate"/>
??? </resultMap>
??????? <result property="id" column="owner_id"/>
??????? <result property="name" column="name"/>
??????? <result property="address" column="address"/>
??????? <result property="autoInfoList" column="owner_id" select="getAutoInfo"/>
??? </resultMap>
?????? <![CDATA[
?????? select * from people
?????? ]]>
?????? <dynamic prepend="where">
???????? <isNotNull property="id">
?????????? <![CDATA[
?????????? owner_id=#id#
?????????? ]]>
???????? </isNotNull>
?????? </dynamic>
? </select>
?????? <![CDATA[
?????? select * from auto_info where owner_no=#id#
??????? ]]>
? </select>
?
</sqlMap>
添加了一個 delete 類型的 Mapped Statement 。同樣,也無需再解釋了。相應程序代碼:
package test;
import java.io.Reader;
import com.ibatis.sqlmap.client.*;
import bo.*;
public class AutoMag {
?private Reader reader;
??????? AutoInfo autoInfo=new AutoInfo();
import com.ibatis.common.resources.*;
?private SqlMapClient sqlMap;
?private String resource = "SqlMapConfig.xml";
?
?public void delPeople() throws Exception{
??try{
????? reader = Resources.getResourceAsReader(resource);
????? sqlMap=SqlMapClientBuilder.buildSqlMapClient(reader);
????? sqlMap.startTransaction();
?????
????? People people=new People();
????? people.setId(new Integer("1"));
????? people=(People)sqlMap.queryForObject("getPeople",people);
??????? autoInfo.setLicensePlate("A00002");
??????? autoInfo.setOwnerNo(people);???????????
????? sqlMap.delete("deleteAutoInfo",autoInfo);
?????
????? sqlMap.commitTransaction();
??}finally{
????? sqlMap.endTransaction();
??}
?}
}
到這里,
iBATIS SQL Maps
之旅也就結束了。是的,很有意猶未盡的感覺,還沒按照
one-to-many
方式刪除張三和他所有的車輛呢。
這個工作就留給你來完成吧!
???
我不想比較
Hibernate
和
iBATIS SQL Maps
孰優孰劣,因為這種比較實在無聊!從我開始寫第一行
Delphi
代碼開始,就充斥著“
VC
好?還是
Delphi
好?”這樣的比較!如果你尚未涉足過
JDBC
,我想
Hibernate
會更適合你
… …
請注意!引用、轉貼本文應注明原作者:Rosen Jiang 以及出處:http://www.aygfsteel.com/rosen