关于ibatis简单使用的想法

   ibatis 是一个成熟的框架,现在已经是改名字叫mybatis了,框架的配置比较烦,xml,dao的书写,还有每个表还要对应于javabean,没有的话,map 也成,一直在想怎么能通过一些方式使其更好地接入,

源代码在新浪爱问人 资料库中 搜 ibatis简单使用的想法

1.   xml的简化?

问题:ibatis 中的对应表的xml常用几种定义, <resultMap>,<statement>(包括,insert,select等,即sql语句),其中的主体是 sql语句,如
<statement id="selectBeanByColumn" resultMap="channel.map"

parameterClass="java.util.HashMap">

                   select * from T_EZF_CHANNEL

                   <dynamic prepend="WHERE">

                            <isNotEmpty prepend='AND' property='channel_name'>

                                     (T_EZF_CHANNEL_NAME like '%$channel_name$%')

                            </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这个和接口接也好一些

 4、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>

5、数据类型为时间

在和页面或者是接口交互时,时间信息一般为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') ,即可

.



你可能感兴趣的:(ibatis)