關於ibatis簡單使用的想法

   ibatis 是一個成熟的框架,如今已是更名字叫mybatis了,框架的配置比較煩,xml,dao的書寫,還有每一個表還要對應於javabean,沒有的話,map 也成,一直在想怎麼能經過一些方式使其更好地接入, java

源代碼在新浪愛問人 資料庫中 搜 ibatis簡單使用的想法 spring

1.   xml的簡化?

問題: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個表,即Nxml中,這部分若能公用,會是比較不錯的選擇

方案:但考慮到這裏寫的sql,對於表中,字段的個數,字段的名字,字段的類型均不同,所以,這裏要寫成一個xml給各表xml繼承,沒有什麼好的辦法。同時想一想hibernate的具體操做,其對於比較複雜的語句,也均是使用hql來執行,只有簡單的,纔會共用,所以,我認爲,這方面沒有可行的方案。

              但聯想到一些生成工具,我認爲,能夠寫一個簡單的生成工具去依據表來生成簡單的對應sql,queryCountByColumn queryPage deleteBean updateBean saveBean

2.   Java的簡化?

         上面提到的xml的簡化不太可行,但java的簡化確是可行的,寫一個抽象類BaseDao,把邏輯所有寫完,對於user表,寫一個tbuserdaoimlp.java對其繼承,爲了區分,這是user表,和它主鍵,此類實現basedao中的 兩個方法,如:
    @Override

    protected String getTableMapStr() {

       return IUserDao.table_map_str;

    }

   

    protected String getTableId(){

       return IUserDao.user_id;

    }

3.   關於java bean map的想法

ibatis中有bean,map的方式來實現入參和出參的格式,

a)         入參
一直以爲對於一個表寫一個bean是比較煩躁,入參感受用map會更靈活一點,通常來講,keycolumn應該是一一對應,這個key能夠在idao裏面用string statis寫,不少時候,數據是從接口中來,接口中來,通常都要map

b)         出參
系統中查詢功能用得很是多,對於單表查詢,建議用resultMap來使用,在代碼裏爲了讓其key規範,能夠在dao中加string 的靜態final變量做常量,map這個和接口接也好一些

 四、ibatis對數據庫的批量操做

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') ,便可

.

相關文章
相關標籤/搜索