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