ibatis 是一个成熟的框架,现在已经是改名字叫mybatis了,框架的配置比较烦,如xml,dao的书写,还有每个表还要对应于javabean,没有的话,map 也成,一直在想怎么能通过一些方式使其更好地接入,
源代码在新浪爱问人 资料库中 搜 ibatis简单使用的想法
问题: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个表,即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') ,即可
.