ibatis 是一個成熟的框架,如今已是更名字叫mybatis了,框架的配置比較煩,如xml,dao的書寫,還有每一個表還要對應於javabean,沒有的話,map 也成,一直在想怎麼能經過一些方式使其更好地接入, java
源代碼在新浪愛問人 資料庫中 搜 ibatis簡單使用的想法 spring
問題:ibatis 中的對應表的xml經常使用幾種定義, <resultMap>,<statement>(包括,insert,select等,即sql語句),其中的主體是 sql語句,如
<statement id="selectBeanByColumn" resultMap="channel.map" sql
parameterClass="java.util.HashMap"> 數據庫
select * from T_EZF_CHANNEL mybatis
<dynamic prepend="WHERE"> oracle
<isNotEmpty prepend='AND' property='channel_name'> 框架
(T_EZF_CHANNEL_NAME like '%$channel_name$%') ide
</isNotEmpty> 函數
</dynamic> 工具
order by T_EZF_CHANNEL_ID ASC
</statement>
在N個表,即N個xml中,這部分若能公用,會是比較不錯的選擇
方案:但考慮到這裏寫的sql,對於表中,字段的個數,字段的名字,字段的類型均不同,所以,這裏要寫成一個xml給各表xml繼承,沒有什麼好的辦法。同時想一想hibernate的具體操做,其對於比較複雜的語句,也均是使用hql來執行,只有簡單的,纔會共用,所以,我認爲,這方面沒有可行的方案。
但聯想到一些生成工具,我認爲,能夠寫一個簡單的生成工具去依據表來生成簡單的對應sql,如queryCountByColumn queryPage deleteBean updateBean saveBean 等
上面提到的xml的簡化不太可行,但java的簡化確是可行的,寫一個抽象類BaseDao,把邏輯所有寫完,對於user表,寫一個tbuserdaoimlp.java對其繼承,爲了區分,這是user表,和它主鍵,此類實現basedao中的 兩個方法,如:
@Override
protected String getTableMapStr() {
return IUserDao.table_map_str;
}
protected String getTableId(){
return IUserDao.user_id;
}
ibatis中有bean,map的方式來實現入參和出參的格式,
a) 入參
一直以爲對於一個表寫一個bean是比較煩躁,入參感受用map會更靈活一點,通常來講,key和column應該是一一對應,這個key能夠在idao裏面用string statis寫,不少時候,數據是從接口中來,接口中來,通常都要map
b) 出參
系統中查詢功能用得很是多,對於單表查詢,建議用resultMap來使用,在代碼裏爲了讓其key規範,能夠在dao中加string 的靜態final變量做常量,map這個和接口接也好一些
ibatis的批量 操做可能經過數據庫的批量操做來實現, 即這邊把數據拼好後扔過去,其中用到了ibatis的<iterater>標籤,
如:oracle的
<update id="batchUpdate" parameterClass="map"> begin <iterate conjunction="" prepend="" property="targetList"> update XXX set <isNotEmpty prepend="" property="targetList[].flow_acheckstatus"> XXX_ACHECKSTATUS = '$targetList[].flow_acheckstatus$' </isNotEmpty> <isNotEmpty prepend=',' property='targetList[].flow_reserved1'> XXX_RESERVED1= '$targetList[].flow_reserved1$' </isNotEmpty> where XXX_INTERID = '$targetList[].flow_innerId$'; </iterate> end; </update>
注:這個map裏面要有 targetList這個屬性
若是用spring集成的話 ,
(String) getSqlMapClientTemplate().insert(getTableMapStr()+".batchInsert", paramMap);
insert的地址 :
<insert id="batchInsert" parameterClass="map"> insert all <iterate conjunction=" " property="targetList"> into XXX_TMPCOUNT (XXX_FLOW_ID, XXX_TMPCOUNT_MERCHANT) values ( '$targetList[].flow_id$','$targetList[].tmpcount_merchant$') </iterate> select * from dual </insert>
在和頁面或者是接口交互時,時間信息通常爲yyyyMMddHHmmss的格式,這個和數據庫的保存就有一些衝突,到底應該是java和數據庫的數據類型轉換,以java的string ->to_date,用sql的函數便可
<insert id="saveBean" parameterClass="java.util.HashMap"> <![CDATA[ INSERT INTO XXX_TMPCOUNT (XXX_TMPCOUNT_PROCTIME) VALUES(to_date('$tmpcount_protime$','yyyymmddhh24miss')) ]]> </insert>to_date函數 ,
在select的時候,date類型應轉爲string
select to_char(FF.T_EZF_TMPCOUNT_TIME,'yyyymmddhh24miss') ,便可
.