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