ibator是iBATIS的一个代码生成工具,关于它的定制,可以参考JavaEye上两篇博文:
但在决定对ibator定制前,有几个问题需要思考:
- 为什么要定制
- 哪些功能需要定制
- 编码规范
其中最需要注意的是编码规范问题,否则定制出来的代码不符合规范,大家还是需要花时间调整。
结合我们这边的一些实际情况,就这几个问题分别进行下解答。
【注:我们定制的是ibator 1.2.2 使用的iBATIS版本号 2.3.4.726】
1.为什么要定制
原有版本的问题
- 生成无用的注释,如getter / setter注释
- 生成无用的示例(example)方法、类
- 不符合技术部编码规范
2.哪些功能需要定制
对ibator的定制动作对代码的调整类型上可以分为三类:
- update类[修改和我们要求不相符的部分]
- delete类[删除无用的部分]
- insert类[添加我们想要但它没有的部分]
如:
update类 调整DAO方法顺序为 增 删 改 查 其他
delete类 删除Model[POJO、Domain]类getter/setter方法注释、删除默认生成的示例方法或类
insert类 在Model类中覆盖Object的toString() 提取表字段注释为Model属性文档注释 为DAO增加翻页等常用方法 增加生成Service Action等代码 增加自动调整配置文件
可以先从简单做起,不要想着一下子做完美
3.编码规范
Model、DAO、DAO实现、sqlmap XML的编码规范分别,结合实际代码进行说明:
Model类
package mov.common.domain;
import org.apache.commons.lang.builder.ToStringBuilder;
/**
* Ip段
*/
public class IpSection {
/** IP段编号 */
private Integer sectionId;
/** 开始IP */
private Long sIp;
/** 结束IP */
private Long eIp;
/** 开始IP */
private String startIp;
/** 结束IP */
private String endIp;
/** 国家编码:1中国 -1未知 */
private Integer countryCode;
/** 国家编码:1中国 -1未知 */
private Integer provinceCode;
/** 国家编码:1中国 -1未知 */
private Integer areaCode;
/** 国家编码:1中国 -1未知 */
private Integer subAreaCode;
/** 网络接入商类型, 1联通 2电信 4铁通 5长城宽带 6教育网 -1未知 */
private Integer networkProvider;
/** 地域描述 */
private String areaDesc;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
// getter && setters 省略
}
Model类一般约定:
1.property尽量使用包装类而非基本类型,以便于判断用户是否输入内容
2.property使用文档注释,尽量只占用一行
3.覆盖Object#toString()方法,并且toString()方法在getter、setter方法前
DAO接口
package mov.common.dao;
import mov.common.domain.IpSection;
/**
* IP段DAO接口
*/
public interface IpSectionDAO {
Integer insert(IpSection record);
Integer insertSelective(IpSection record);
int deleteByPrimaryKey(int sectionId);
int updateByPrimaryKey(IpSection record);
int updateByPrimaryKeySelective(IpSection record);
IpSection selectByPrimaryKey(int sectionId);
}
DAO接口一般约定:
1.根据主键删除、根据主键获取单行尽量使用基本类型
2.方法按照增、删、改、查的前后顺序分组排列
3.增 删 改返回值类型保存ibator原有返回值,增加返回Integer 删除 修改 返回int
DAO实现类
package mov.common.dao.impl;
import mov.common.dao.IpSectionDAO;
import mov.common.domain.IpSection;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
/**
* IP段DAO实现
*/
public class IpSectionDAOImpl extends SqlMapClientDaoSupport implements
IpSectionDAO {
public Integer insert(IpSection record) {
return (Integer) getSqlMapClientTemplate().insert(
"ip_section.insert", record);
}
public Integer insertSelective(IpSection record) {
return (Integer) getSqlMapClientTemplate().insert(
"ip_section.insertSelective", record);
}
public int deleteByPrimaryKey(int sectionId) {
return getSqlMapClientTemplate().delete(
"ip_section.deleteByPrimaryKey", sectionId);
}
public int updateByPrimaryKey(IpSection record) {
return getSqlMapClientTemplate().update(
"ip_section.updateByPrimaryKey", record);
}
public int updateByPrimaryKeySelective(IpSection record) {
return getSqlMapClientTemplate().update(
"ip_section.updateByPrimaryKeySelective", record);
}
public IpSection selectByPrimaryKey(int sectionId) {
return (IpSection) getSqlMapClientTemplate().queryForObject(
"ip_section.selectByPrimaryKey", sectionId);
}
}
DAO实现一般约束:
1.尽量减少中间变量,ibator原版中生成的方法体有些冗余
2.应用的SQL需要使用命名空间
sqlmap XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="ip_section" >
<typeAlias alias="IpSection" type="cn.xxt.common.domain.IpSection"/>
<resultMap id="BaseResultMap" class="IpSection" >
<result column="section_id" property="sectionId" jdbcType="INTEGER" />
<result column="s_ip" property="sIp" jdbcType="INTEGER" />
<result column="e_ip" property="eIp" jdbcType="INTEGER" />
<result column="start_ip" property="startIp" jdbcType="VARCHAR" />
<result column="end_ip" property="endIp" jdbcType="VARCHAR" />
<result column="country_code" property="countryCode" jdbcType="INTEGER" />
<result column="province_code" property="provinceCode" jdbcType="INTEGER" />
<result column="area_code" property="areaCode" jdbcType="INTEGER" />
<result column="sub_area_code" property="subAreaCode" jdbcType="INTEGER" />
<result column="network_provider" property="networkProvider" jdbcType="TINYINT" />
<result column="area_desc" property="areaDesc" jdbcType="VARCHAR" />
</resultMap>
<sql id="Base_Column_List" >
section_id, s_ip, e_ip, start_ip, end_ip, country_code, province_code, area_code,
sub_area_code, network_provider, area_desc
</sql>
<!-- ========================================================================
INSERT
========================================================================= -->
<insert id="insert" parameterClass="IpSection" >
<selectKey resultClass="java.lang.Integer" keyProperty="sectionId" >
SELECT nextval('s_ip_section')
</selectKey>
insert into ip_section (section_id, s_ip, e_ip, start_ip, end_ip,
country_code, province_code, area_code, sub_area_code,
network_provider, area_desc)
values (#sectionId:INTEGER#, #sIp:INTEGER#, #eIp:INTEGER#, #startIp:VARCHAR#, #endIp:VARCHAR#,
#countryCode:INTEGER#, #provinceCode:INTEGER#, #areaCode:INTEGER#, #subAreaCode:INTEGER#,
#networkProvider:TINYINT#, #areaDesc:VARCHAR#)
</insert>
<insert id="insertSelective" parameterClass="IpSection" >
<selectKey resultClass="java.lang.Integer" keyProperty="sectionId" >
SELECT nextval('s_ip_section')
</selectKey>
insert into ip_section
<dynamic prepend="(" >
<isNotNull prepend="," property="sectionId" >
section_id
</isNotNull>
<isNotNull prepend="," property="sIp" >
s_ip
</isNotNull>
<isNotNull prepend="," property="eIp" >
e_ip
</isNotNull>
<isNotNull prepend="," property="startIp" >
start_ip
</isNotNull>
<isNotNull prepend="," property="endIp" >
end_ip
</isNotNull>
<isNotNull prepend="," property="countryCode" >
country_code
</isNotNull>
<isNotNull prepend="," property="provinceCode" >
province_code
</isNotNull>
<isNotNull prepend="," property="areaCode" >
area_code
</isNotNull>
<isNotNull prepend="," property="subAreaCode" >
sub_area_code
</isNotNull>
<isNotNull prepend="," property="networkProvider" >
network_provider
</isNotNull>
<isNotNull prepend="," property="areaDesc" >
area_desc
</isNotNull>
)
</dynamic>
values
<dynamic prepend="(" >
<isNotNull prepend="," property="sectionId" >
#sectionId:INTEGER#
</isNotNull>
<isNotNull prepend="," property="sIp" >
#sIp:INTEGER#
</isNotNull>
<isNotNull prepend="," property="eIp" >
#eIp:INTEGER#
</isNotNull>
<isNotNull prepend="," property="startIp" >
#startIp:VARCHAR#
</isNotNull>
<isNotNull prepend="," property="endIp" >
#endIp:VARCHAR#
</isNotNull>
<isNotNull prepend="," property="countryCode" >
#countryCode:INTEGER#
</isNotNull>
<isNotNull prepend="," property="provinceCode" >
#provinceCode:INTEGER#
</isNotNull>
<isNotNull prepend="," property="areaCode" >
#areaCode:INTEGER#
</isNotNull>
<isNotNull prepend="," property="subAreaCode" >
#subAreaCode:INTEGER#
</isNotNull>
<isNotNull prepend="," property="networkProvider" >
#networkProvider:TINYINT#
</isNotNull>
<isNotNull prepend="," property="areaDesc" >
#areaDesc:VARCHAR#
</isNotNull>
)
</dynamic>
</insert>
<!-- ========================================================================
DELETE
========================================================================= -->
<delete id="deleteByPrimaryKey" parameterClass="int" >
delete from ip_section
where section_id = #sectionId:INTEGER#
</delete>
<!-- ========================================================================
UPDATE
========================================================================= -->
<update id="updateByPrimaryKey" parameterClass="IpSection" >
update ip_section
set s_ip = #sIp:INTEGER#,
e_ip = #eIp:INTEGER#,
start_ip = #startIp:VARCHAR#,
end_ip = #endIp:VARCHAR#,
country_code = #countryCode:INTEGER#,
province_code = #provinceCode:INTEGER#,
area_code = #areaCode:INTEGER#,
sub_area_code = #subAreaCode:INTEGER#,
network_provider = #networkProvider:TINYINT#,
area_desc = #areaDesc:VARCHAR#
where section_id = #sectionId:INTEGER#
</update>
<update id="updateByPrimaryKeySelective" parameterClass="IpSection" >
update ip_section
<dynamic prepend="set" >
<isNotNull prepend="," property="sIp" >
s_ip = #sIp:INTEGER#
</isNotNull>
<isNotNull prepend="," property="eIp" >
e_ip = #eIp:INTEGER#
</isNotNull>
<isNotNull prepend="," property="startIp" >
start_ip = #startIp:VARCHAR#
</isNotNull>
<isNotNull prepend="," property="endIp" >
end_ip = #endIp:VARCHAR#
</isNotNull>
<isNotNull prepend="," property="countryCode" >
country_code = #countryCode:INTEGER#
</isNotNull>
<isNotNull prepend="," property="provinceCode" >
province_code = #provinceCode:INTEGER#
</isNotNull>
<isNotNull prepend="," property="areaCode" >
area_code = #areaCode:INTEGER#
</isNotNull>
<isNotNull prepend="," property="subAreaCode" >
sub_area_code = #subAreaCode:INTEGER#
</isNotNull>
<isNotNull prepend="," property="networkProvider" >
network_provider = #networkProvider:TINYINT#
</isNotNull>
<isNotNull prepend="," property="areaDesc" >
area_desc = #areaDesc:VARCHAR#
</isNotNull>
</dynamic>
where section_id = #sectionId:INTEGER#
</update>
<!-- ========================================================================
SELECT
========================================================================= -->
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterClass="int" >
select
<include refid="ip_section.Base_Column_List" />
from ip_section
where section_id = #sectionId:INTEGER#
</select>
</sqlMap>
sqlmap XML一般约束
1.按照resultMap sql片段 增 删 改 查的顺序分组排列
2.由于XML文件一般长度会较长,建议对增 删 改 查 增加类似示例中的注释以方便快速
这些规范仅仅是我们这儿的一些粗略约定,读者需要根据所在公司的实际情况进行认真、细致的分析
定制ibator并不是特别难,但是要定制一个实用、符合规范的ibator必须做好这些准备工作,否则事倍功半,何苦折腾呢!
分享到:
相关推荐
7. **版本控制**:由于iBATOR-V1.1.0是具体版本,这意味着它可能包含了一些特定的功能或者修复了某些已知问题。升级或降级iBATOR版本时,需要考虑其对现有项目的影响。 总的来说,iBATOR是iBATIS框架的有力辅助工具...
虽然Ibator能显著提高开发效率,但生成的代码并不能完全满足所有复杂的业务场景,对于一些特殊的SQL操作,如分页查询、关联查询等,还需要开发者手动修改生成的XML文件。此外,为了保持代码的整洁,建议定期清理和...
标题中的"ibator1.2.1配置文件"指的是基于Apache Ibator的1.2.1版本的配置文件,这是一个用于简化MyBatis框架中DAO层(数据访问对象)开发的工具。Ibator是iBATIS(现在已经演变为MyBatis)的一个扩展,它能够根据...
通过灵活调整这些配置,开发者可以定制化Ibator生成的代码样式和结构,使其更符合项目规范。 总的来说,Ibator插件是MyEclipse中一个非常实用的工具,它能帮助开发者快速生成基于MyBatis的代码,减轻手动编码的工作...
Eclipse集成的Ibator插件是开发人员在使用MyBatis框架时的一个强大工具,它简化了数据库表到Java实体类的映射过程。Ibator,全称为"IntelliJ IDEA Table to Active Record",最初是为 IntelliJ IDEA 设计的,但随着...
【ibator 1.2.1】是一款基于Eclipse的插件,用于自动化生成Ibatis框架的代码。...通过这些资源,开发者不仅可以安装并使用ibator,还可以深入理解其内部工作原理,进行定制化开发,提升项目的整体效率。
综上所述,【Ibator参考程序】是一个结合了JavaEE、Ibator和SSI架构的实践案例,旨在展示如何根据项目需求,有效地利用Ibator进行数据映射的定制化开发,提高开发效率并优化代码质量。在实际操作中,开发者需要深入...
**ibator Eclipse 插件详解** `ibator`(IntelliJ IDEA的iBATIS Generator的Eclipse版本)是一款强大的数据库代码自动生成工具,它能够帮助开发者快速地生成Java持久层代码,包括实体类、Mapper接口及XML配置文件等...
相较于Hibernate,ibator允许开发者拥有更多的SQL控制权,可以在生成的基础代码上自由定制SQL语句,同时又具备自动化管理数据库映射的优势。对于大型项目而言,ibator能够显著提高开发效率,减少重复工作,使开发者...
7. **扩展和定制**:除了默认的生成模板,iBator还支持自定义插件和模板,可以根据项目需求定制生成的代码风格和功能。 总的来说,IBATOR作为一个强大的自动化工具,能够显著提高开发效率,减少手动编写重复代码的...
IBator是Apache iBATIS项目的一个子项目,它是一个代码生成器,能够帮助开发人员自动化创建基于iBATIS的持久层代码,包括Java模型类、SQL映射文件以及DAO接口。通过减少手动编写这些常见的重复性工作,IBator可以...
ibator插件优化的jar包,安装完ibator后,将eclipse\plugins\org.apache.ibatis.ibator.core_1.2.1下的jar包替换即可。
在Eclipse中使用ibator插件,首先需要安装插件,然后在项目中创建ibatorConfig.xml配置文件,根据实际的数据库信息和代码生成需求进行定制。接着,运行ibator插件,它会根据配置文件自动读取数据库中的表信息,生成...
ibator1.2.2多了点功能,具体可以百度,重新编译了下,生成注释去掉了
ibator教学视频,手把手教你使用ibator
Ibator is a code generator for iBATIS. Ibator will introspect a database table (or many tables) and will generate iBATIS artifacts that can be used to access the table(s). This abates some of the ...
Ibator-Eclipse插件1.2.1版正是这样一个辅助开发的神器,它将Ibator与Eclipse集成,为Java开发者提供了更便捷的代码生成体验。 这个插件版本1.2.1包含了优化后的jar包,意味着它在原有的功能基础上进行了性能和用户...
MySQL是一种广泛使用的开源关系型数据库管理系统,而iBatis(现在已经更名为MyBatis)是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在处理大量数据时,分页查询是非常常见且重要的功能,它可以...
以下是一些ibator使用的关键知识点: 1. **安装与配置**:首先需要下载`ibator.jar`,这通常会包含在iBatis的下载包中。然后在Java项目中引入该jar,并配置相关的Maven或Gradle依赖。 2. **创建配置文件**:`...
使用数据库的注释,不用自带的注释 http://blog.csdn.net/tiantangpw/article/details/43489817 运行命令 java -jar ibator.jar -configfile ibatorConfig.xml -overwrite >>ibator.log