這一章節(jié)是本系列文章最后一篇。經(jīng)歷過(guò)前三篇文章的洗禮,相信你對(duì) iBATIS SQL Maps 有比較詳細(xì)的認(rèn)識(shí)了吧?
來(lái)看看新需求:
張三后來(lái)做生意,自己經(jīng)營(yíng)得很好,打算再買(mǎi)輛車(chē)跑運(yùn)輸。對(duì)于第二次買(mǎi)車(chē),車(chē)輛管理系統(tǒng)的 PEOPLE 表原本已經(jīng)記錄了他的基本信息,遂不對(duì) PEOPLE 表操作。只向 AUTO_INFO 表 insert 一條車(chē)輛記錄即可。
新需求所用到的技術(shù)要點(diǎn)都在《 iBATIS SQL Maps(二) 》和《 iBATIS SQL Maps(三) 》中出現(xiàn)過(guò)了。請(qǐng)看映射文件:
<?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>
簡(jiǎn)單地組合一下以前出現(xiàn)過(guò)的映射文件,就能滿(mǎn)足新需求。相應(yīng)程序代碼如下:
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();
??}
?}
}
程序代碼也是簡(jiǎn)單組合一下而已,想想 Hibernate 又是怎么寫(xiě)的呢?相信有 JDBC 經(jīng)驗(yàn)的程序員應(yīng)該更喜歡 iBATIS SQL Maps !
斗轉(zhuǎn)星移、峰回路轉(zhuǎn), 張三在經(jīng)歷過(guò)生意紅火之后,接下來(lái)的一年內(nèi)生意場(chǎng)上連連告負(fù),不得不把自己的攤子收縮一下。這第一件事要把跑運(yùn)輸?shù)能?chē)賣(mài)掉,就是 那輛牌照為 “ A00002” 的 。
相應(yīng)映射文件只需小小修改:
<?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>
添加了一個(gè) delete 類(lèi)型的 Mapped Statement 。同樣,也無(wú)需再解釋了。相應(yīng)程序代碼:
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
之旅也就結(jié)束了。是的,很有意猶未盡的感覺(jué),還沒(méi)按照
one-to-many
方式刪除張三和他所有的車(chē)輛呢。
這個(gè)工作就留給你來(lái)完成吧!
???
我不想比較
Hibernate
和
iBATIS SQL Maps
孰優(yōu)孰劣,因?yàn)檫@種比較實(shí)在無(wú)聊!從我開(kāi)始寫(xiě)第一行
Delphi
代碼開(kāi)始,就充斥著“
VC
好?還是
Delphi
好?”這樣的比較!如果你尚未涉足過(guò)
JDBC
,我想
Hibernate
會(huì)更適合你
… …
請(qǐng)注意!引用、轉(zhuǎn)貼本文應(yīng)注明原作者:Rosen Jiang 以及出處:http://www.aygfsteel.com/rosen