读书人

ibator改善生成中文注释

发布时间: 2012-08-29 08:40:14 作者: rapoo

ibator改进,生成中文注释

过修改ibator1.2.2(http://svn.apache.org/repos/asf/ibatis/java/ibator)

1) 修改org.apache.ibatis.ibator.api.Ibator类,

方法private void writeFile(File file, String content) throws IOException

修改编码如下:

private void writeFile(File file, String content) throws IOException {       java.io.OutputStreamWriter fos = new java.io.OutputStreamWriter(new java.io.FileOutputStream(file), "UTF-8");        fos.write(content);        fos.flush();        fos.close();    }

?

2)修改org.apache.ibatis.ibator.internal.DefaultCommentGenerator类中的addFieldComment,addClassComment,addGetterComment,addSetterComment,addGeneralMethodComment,addComment方法,修改成你想要的格式。

修改如下方法:

public void addClassComment(InnerClass innerClass,            IntrospectedTable introspectedTable) {        addClassComment(innerClass, introspectedTable.getFullyQualifiedTable(), false);    }    public void addEnumComment(InnerEnum innerEnum,            IntrospectedTable introspectedTable) {        addEnumComment(innerEnum, introspectedTable.getFullyQualifiedTable());    }    public void addFieldComment(Field field,            IntrospectedTable introspectedTable,            IntrospectedColumn introspectedColumn) {        addFieldComment(field, introspectedTable.getFullyQualifiedTable(),                introspectedColumn.getRemarks());    }    public void addFieldComment(Field field, IntrospectedTable introspectedTable) {        addFieldComment(field, introspectedTable.getFullyQualifiedTable());    }    public void addGeneralMethodComment(Method method,            IntrospectedTable introspectedTable) {        addGeneralMethodComment(method, introspectedTable.getFullyQualifiedTable());    }    public void addGetterComment(Method method,            IntrospectedTable introspectedTable,            IntrospectedColumn introspectedColumn) {        addGetterComment(method, introspectedTable.getFullyQualifiedTable(),                introspectedColumn.getRemarks());    }    public void addSetterComment(Method method,            IntrospectedTable introspectedTable,            IntrospectedColumn introspectedColumn) {        addSetterComment(method, introspectedTable.getFullyQualifiedTable(),                introspectedColumn.getRemarks());    }    public void addClassComment(InnerClass innerClass,            IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {        addClassComment(innerClass, introspectedTable.getFullyQualifiedTable(), markAsDoNotDelete);    }

?主要是把

introspectedColumn.getActualColumnName()

?改成(利用数据库中的comment生成注释)

introspectedColumn.getRemarks()

?

3)修改好,把生成的jar文件:"ibator-core-1.2.2-SNAPSHOT.jar",改名为"ibator.jar",在安装了ibator插件的Eclipse中,覆盖eclipse\plugins\org.apache.ibatis.ibator.core_1.2.1下的jar文件

4)测试:

?? 4.1) 数据库脚本:

?

create tableCREATE TABLE `brand` (   `code` varchar(36) NOT NULL default '' COMMENT '代码',   `logopath` varchar(80) default NULL COMMENT 'logo路径',   `name` varchar(40) NOT NULL default '' COMMENT '名字',   `visible` bit(1) NOT NULL COMMENT '是否可见',   PRIMARY KEY  (`code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8create tableCREATE TABLE `employee` (   `username` varchar(20) NOT NULL default '' COMMENT '用户名',   `degree` varchar(10) default NULL COMMENT '等级',   `email` varchar(50) default NULL COMMENT '电子邮箱',   `gender` varchar(5) NOT NULL default '' COMMENT '性别',   `imageName` varchar(41) default NULL COMMENT '图片名字',   `password` varchar(20) NOT NULL default '' COMMENT '密码',   `phone` varchar(20) default NULL COMMENT '电话',   `realname` varchar(10) NOT NULL default '' COMMENT '真实姓名',   `school` varchar(20) default NULL COMMENT '学校',   `visible` bit(1) NOT NULL COMMENT '是否可见',   `department_id` int(11) default NULL COMMENT '部门ID',   `card_id` int(11) NOT NULL COMMENT '身份证',   PRIMARY KEY  (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8?
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE ibatorConfiguration PUBLIC "-//Apache Software Foundation//DTD Apache iBATIS Ibator Configuration 1.0//EN" "http://ibatis.apache.org/dtd/ibator-config_1_0.dtd" ><ibatorConfiguration><classPathEntrylocation="D:/Eclipse/workspace/helios-3.6/test/lib/mysql_connector_java_5.jar" /><ibatorContext id="context1" targetRuntime="Ibatis2Java5"><commentGenerator><property name="suppressDate" value="true" /></commentGenerator><jdbcConnection driveruserId="root"password="root"></jdbcConnection><javaModelGenerator targetPackage="cn.zlj.ibatis.entity"targetProject="test" /><sqlMapGenerator targetPackage="cn.zlj.ibatis.sqlmap"targetProject="test" /><daoGenerator targetPackage="cn.zlj.ibatis.dao"targetProject="test" implementationPackage="cn.zlj.ibatis.dao.impl"type="spring" /><table tableName="brand"></table><table tableName="employee"></table></ibatorContext></ibatorConfiguration>

?

? 4.3)ibator生成文件

?

package cn.zlj.ibatis.entity;public class Brand {    /**     * 代码     */    private String code;    /**     * logo路径     */    private String logopath;    /**     * 名字     */    private String name;    /**     * 是否可见     */    private Boolean visible;    /**     * 获取 代码     *     * @return      */    public String getCode() {        return code;    }    /**     * 设置  代码     *     * @param code     */    public void setCode(String code) {        this.code = code;    }    /**     * 获取 logo路径     *     * @return      */    public String getLogopath() {        return logopath;    }    /**     * 设置  logo路径     *     * @param logopath     */    public void setLogopath(String logopath) {        this.logopath = logopath;    }    /**     * 获取 名字     *     * @return      */    public String getName() {        return name;    }    /**     * 设置  名字     *     * @param name     */    public void setName(String name) {        this.name = name;    }    /**     * 获取 是否可见     *     * @return      */    public Boolean getVisible() {        return visible;    }    /**     * 设置  是否可见     *     * @param visible     */    public void setVisible(Boolean visible) {        this.visible = visible;    }}

?

package cn.zlj.ibatis.entity;public class Employee {    /**     * 用户名     */    private String username;    /**     * 等级     */    private String degree;    /**     * 电子邮箱     */    private String email;    /**     * 性别     */    private String gender;    /**     * 图片名字     */    private String imagename;    /**     * 密码     */    private String password;    /**     * 电话     */    private String phone;    /**     * 真实姓名     */    private String realname;    /**     * 学校     */    private String school;    /**     * 是否可见     */    private Boolean visible;    /**     * 部门ID     */    private Integer departmentId;    /**     * 身份证     */    private Integer cardId;    /**     * 获取 用户名     *     * @return      */    public String getUsername() {        return username;    }    /**     * 设置  用户名     *     * @param username     */    public void setUsername(String username) {        this.username = username;    }    /**     * 获取 等级     *     * @return      */    public String getDegree() {        return degree;    }    /**     * 设置  等级     *     * @param degree     */    public void setDegree(String degree) {        this.degree = degree;    }    /**     * 获取 电子邮箱     *     * @return      */    public String getEmail() {        return email;    }    /**     * 设置  电子邮箱     *     * @param email     */    public void setEmail(String email) {        this.email = email;    }    /**     * 获取 性别     *     * @return      */    public String getGender() {        return gender;    }    /**     * 设置  性别     *     * @param gender     */    public void setGender(String gender) {        this.gender = gender;    }    /**     * 获取 图片名字     *     * @return      */    public String getImagename() {        return imagename;    }    /**     * 设置  图片名字     *     * @param imagename     */    public void setImagename(String imagename) {        this.imagename = imagename;    }    /**     * 获取 密码     *     * @return      */    public String getPassword() {        return password;    }    /**     * 设置  密码     *     * @param password     */    public void setPassword(String password) {        this.password = password;    }    /**     * 获取 电话     *     * @return      */    public String getPhone() {        return phone;    }    /**     * 设置  电话     *     * @param phone     */    public void setPhone(String phone) {        this.phone = phone;    }    /**     * 获取 真实姓名     *     * @return      */    public String getRealname() {        return realname;    }    /**     * 设置  真实姓名     *     * @param realname     */    public void setRealname(String realname) {        this.realname = realname;    }    /**     * 获取 学校     *     * @return      */    public String getSchool() {        return school;    }    /**     * 设置  学校     *     * @param school     */    public void setSchool(String school) {        this.school = school;    }    /**     * 获取 是否可见     *     * @return      */    public Boolean getVisible() {        return visible;    }    /**     * 设置  是否可见     *     * @param visible     */    public void setVisible(Boolean visible) {        this.visible = visible;    }    /**     * 获取 部门ID     *     * @return      */    public Integer getDepartmentId() {        return departmentId;    }    /**     * 设置  部门ID     *     * @param departmentId     */    public void setDepartmentId(Integer departmentId) {        this.departmentId = departmentId;    }    /**     * 获取 身份证     *     * @return      */    public Integer getCardId() {        return cardId;    }    /**     * 设置  身份证     *     * @param cardId     */    public void setCardId(Integer cardId) {        this.cardId = cardId;    }}

?

<?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="brand" >  <resultMap id="BaseResultMap" >    <result column="code" property="code" jdbcType="VARCHAR" />    <result column="logopath" property="logopath" jdbcType="VARCHAR" />    <result column="name" property="name" jdbcType="VARCHAR" />    <result column="visible" property="visible" jdbcType="BIT" />  </resultMap>  <sql id="Example_Where_Clause" >    <iterate property="oredCriteria" conjunction="or" prepend="where" removeFirstPrepend="iterate" >      <isEqual property="oredCriteria[].valid" compareValue="true" >        (        <iterate prepend="and" property="oredCriteria[].criteriaWithoutValue" conjunction="and" >          $oredCriteria[].criteriaWithoutValue[]$        </iterate>        <iterate prepend="and" property="oredCriteria[].criteriaWithSingleValue" conjunction="and" >          $oredCriteria[].criteriaWithSingleValue[].condition$ #oredCriteria[].criteriaWithSingleValue[].value#        </iterate>        <iterate prepend="and" property="oredCriteria[].criteriaWithListValue" conjunction="and" >          $oredCriteria[].criteriaWithListValue[].condition$          <iterate property="oredCriteria[].criteriaWithListValue[].values" open="(" close=")" conjunction="," >            #oredCriteria[].criteriaWithListValue[].values[]#          </iterate>        </iterate>        <iterate prepend="and" property="oredCriteria[].criteriaWithBetweenValue" conjunction="and" >          $oredCriteria[].criteriaWithBetweenValue[].condition$          #oredCriteria[].criteriaWithBetweenValue[].values[0]# and          #oredCriteria[].criteriaWithBetweenValue[].values[1]#        </iterate>        )      </isEqual>    </iterate>  </sql>  <sql id="Base_Column_List" >    code, logopath, name, visible  </sql>  <select id="selectByExample" resultMap="BaseResultMap" parameter>    select    <isParameterPresent >      <isEqual property="distinct" compareValue="true" >        distinct      </isEqual>    </isParameterPresent>    <include refid="brand.Base_Column_List" />    from brand    <isParameterPresent >      <include refid="brand.Example_Where_Clause" />      <isNotNull property="orderByClause" >        order by $orderByClause$      </isNotNull>    </isParameterPresent>  </select>  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameter>    select     <include refid="brand.Base_Column_List" />    from brand    where code = #code:VARCHAR#  </select>  <delete id="deleteByPrimaryKey" parameter>    delete from brand    where code = #code:VARCHAR#  </delete>  <delete id="deleteByExample" parameter>    delete from brand    <include refid="brand.Example_Where_Clause" />  </delete>  <insert id="insert" parameter>    insert into brand (code, logopath, name, visible)    values (#code:VARCHAR#, #logopath:VARCHAR#, #name:VARCHAR#, #visible:BIT#)  </insert>  <insert id="insertSelective" parameter>    insert into brand    <dynamic prepend="(" >      <isNotNull prepend="," property="code" >        code      </isNotNull>      <isNotNull prepend="," property="logopath" >        logopath      </isNotNull>      <isNotNull prepend="," property="name" >        name      </isNotNull>      <isNotNull prepend="," property="visible" >        visible      </isNotNull>      )    </dynamic>    values    <dynamic prepend="(" >      <isNotNull prepend="," property="code" >        #code:VARCHAR#      </isNotNull>      <isNotNull prepend="," property="logopath" >        #logopath:VARCHAR#      </isNotNull>      <isNotNull prepend="," property="name" >        #name:VARCHAR#      </isNotNull>      <isNotNull prepend="," property="visible" >        #visible:BIT#      </isNotNull>      )    </dynamic>  </insert>  <select id="countByExample" parameterresult>    select count(*) from brand    <include refid="brand.Example_Where_Clause" />  </select>  <update id="updateByExampleSelective" >    update brand    <dynamic prepend="set" >      <isNotNull prepend="," property="record.code" >        code = #record.code:VARCHAR#      </isNotNull>      <isNotNull prepend="," property="record.logopath" >        logopath = #record.logopath:VARCHAR#      </isNotNull>      <isNotNull prepend="," property="record.name" >        name = #record.name:VARCHAR#      </isNotNull>      <isNotNull prepend="," property="record.visible" >        visible = #record.visible:BIT#      </isNotNull>    </dynamic>    <isParameterPresent >      <include refid="brand.Example_Where_Clause" />    </isParameterPresent>  </update>  <update id="updateByExample" >    update brand    set code = #record.code:VARCHAR#,      logopath = #record.logopath:VARCHAR#,      name = #record.name:VARCHAR#,      visible = #record.visible:BIT#    <isParameterPresent >      <include refid="brand.Example_Where_Clause" />    </isParameterPresent>  </update>  <update id="updateByPrimaryKeySelective" parameter>    update brand    <dynamic prepend="set" >      <isNotNull prepend="," property="logopath" >        logopath = #logopath:VARCHAR#      </isNotNull>      <isNotNull prepend="," property="name" >        name = #name:VARCHAR#      </isNotNull>      <isNotNull prepend="," property="visible" >        visible = #visible:BIT#      </isNotNull>    </dynamic>    where code = #code:VARCHAR#  </update>  <update id="updateByPrimaryKey" parameter>    update brand    set logopath = #logopath:VARCHAR#,      name = #name:VARCHAR#,      visible = #visible:BIT#    where code = #code:VARCHAR#  </update></sqlMap>

?

?

package cn.zlj.ibatis.dao;import cn.zlj.ibatis.entity.Brand;import cn.zlj.ibatis.entity.BrandExample;import java.util.List;public interface BrandDAO {    /**     * brand countByExample     */    int countByExample(BrandExample example);    /**     * brand deleteByExample     */    int deleteByExample(BrandExample example);    /**     * brand deleteByPrimaryKey     */    int deleteByPrimaryKey(String code);    /**     * brand insert     */    void insert(Brand record);    /**     * brand insertSelective     */    void insertSelective(Brand record);    /**     * brand selectByExample     */    List<Brand> selectByExample(BrandExample example);    /**     * brand selectByPrimaryKey     */    Brand selectByPrimaryKey(String code);    /**     * brand updateByExampleSelective     */    int updateByExampleSelective(Brand record, BrandExample example);    /**     * brand updateByExample     */    int updateByExample(Brand record, BrandExample example);    /**     * brand updateByPrimaryKeySelective     */    int updateByPrimaryKeySelective(Brand record);    /**     * brand updateByPrimaryKey     */    int updateByPrimaryKey(Brand record);}

?

?

package cn.zlj.ibatis.dao.impl;import cn.zlj.ibatis.dao.BrandDAO;import cn.zlj.ibatis.entity.Brand;import cn.zlj.ibatis.entity.BrandExample;import java.util.List;import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;public class BrandDAOImpl extends SqlMapClientDaoSupport implements BrandDAO {    /**     * brand BrandDAOImpl     */    public BrandDAOImpl() {        super();    }    /**     * brand countByExample     */    public int countByExample(BrandExample example) {        Integer count = (Integer)  getSqlMapClientTemplate().queryForObject("brand.countByExample", example);        return count;    }    /**     * brand deleteByExample     */    public int deleteByExample(BrandExample example) {        int rows = getSqlMapClientTemplate().delete("brand.deleteByExample", example);        return rows;    }    /**     * brand deleteByPrimaryKey     */    public int deleteByPrimaryKey(String code) {        Brand _key = new Brand();        _key.setCode(code);        int rows = getSqlMapClientTemplate().delete("brand.deleteByPrimaryKey", _key);        return rows;    }    /**     * brand insert     */    public void insert(Brand record) {        getSqlMapClientTemplate().insert("brand.insert", record);    }    /**     * brand insertSelective     */    public void insertSelective(Brand record) {        getSqlMapClientTemplate().insert("brand.insertSelective", record);    }    /**     * brand selectByExample     */    @SuppressWarnings("unchecked")    public List<Brand> selectByExample(BrandExample example) {        List<Brand> list = getSqlMapClientTemplate().queryForList("brand.selectByExample", example);        return list;    }    /**     * brand selectByPrimaryKey     */    public Brand selectByPrimaryKey(String code) {        Brand _key = new Brand();        _key.setCode(code);        Brand record = (Brand) getSqlMapClientTemplate().queryForObject("brand.selectByPrimaryKey", _key);        return record;    }    /**     * brand updateByExampleSelective     */    public int updateByExampleSelective(Brand record, BrandExample example) {        UpdateByExampleParms parms = new UpdateByExampleParms(record, example);        int rows = getSqlMapClientTemplate().update("brand.updateByExampleSelective", parms);        return rows;    }    /**     * brand updateByExample     */    public int updateByExample(Brand record, BrandExample example) {        UpdateByExampleParms parms = new UpdateByExampleParms(record, example);        int rows = getSqlMapClientTemplate().update("brand.updateByExample", parms);        return rows;    }    /**     * brand updateByPrimaryKeySelective     */    public int updateByPrimaryKeySelective(Brand record) {        int rows = getSqlMapClientTemplate().update("brand.updateByPrimaryKeySelective", record);        return rows;    }    /**     * brand updateByPrimaryKey     */    public int updateByPrimaryKey(Brand record) {        int rows = getSqlMapClientTemplate().update("brand.updateByPrimaryKey", record);        return rows;    }    /**     * brand     */    protected static class UpdateByExampleParms extends BrandExample {        private Object record;        public UpdateByExampleParms(Object record, BrandExample example) {            super(example);            this.record = record;        }        public Object getRecord() {            return record;        }    }}

?

OK,修改完成,去掉了很多原来自动生成的注释。

?

可以自己写实现org.apache.ibatis.ibator.api.CommentGenerato

或者重写org.apache.ibatis.ibator.internal.DefaultCommentGenerator这个类的

public void addClassComment(InnerClass innerClass,            IntrospectedTable introspectedTable)     public void addEnumComment(InnerEnum innerEnum,            IntrospectedTable introspectedTable)     public void addFieldComment(Field field,            IntrospectedTable introspectedTable,            IntrospectedColumn introspectedColumn)     public void addFieldComment(Field field, IntrospectedTable introspectedTable);    public void addGeneralMethodComment(Method method,            IntrospectedTable introspectedTable) ;    public void addGetterComment(Method method,            IntrospectedTable introspectedTable,            IntrospectedColumn introspectedColumn) ;    public void addSetterComment(Method method,            IntrospectedTable introspectedTable,            IntrospectedColumn introspectedColumn) ;    public void addClassComment(InnerClass innerClass,            IntrospectedTable introspectedTable, boolean markAsDoNotDelete) ;

?ibator1.2.2与以前的版本的主要改变就是以上这几个方法,原来的这种

addFieldComment(Field field, FullyQualifiedTable table, String columnName)方法,

在下一版本中就会被去掉了。

?

?

/**     * Method from the old version of the interface.     *      * TODO - remove in release 1.2.3     *      * @deprecated as of version 1.2.2.     * @see DefaultCommentGenerator#addFieldComment(Field, IntrospectedTable, IntrospectedColumn)     */    public void addFieldComment(Field field, FullyQualifiedTable table, String columnName) {。。。。。}
?

?

?

1 楼 jerry8601 2010-09-14 我复制过去了,但是还是不行,能否在说明一下谢谢 2 楼 www-hello 2010-09-14 报什么错吗? 3 楼 www-hello 2010-09-14 创建数据库表时,加中文注释了吗?
如 `code` varchar(36) NOT NULL default '' COMMENT '代码', 4 楼 webee 2010-11-07 获取的注释信息为null.我确认有注释的! 5 楼 tjc 2010-11-29 这个对于sqlserver的注释貌似获取不到。。。 6 楼 www-hello 2010-12-31 在MySQL中可以,没试过别的数据库,没有环境,没法试sqlserver的。 7 楼 linhao315 2011-10-09 在oracle 10g下注释没任何变动,而且1.2.1中去掉daoGenerator就报空制针的问题依然存在,听说1.2.2已经修复了的。

另外请问下博主,我下载编译了ibator1.2.2,但是用java程序调用时就报错:java.net.MalformedURLException,死活找不到原因,放在插件里头也一样的错误,不知博主是怎么解决的?或者你这个版本不是最新的1.2.2? 8 楼 linhao315 2011-10-09 linhao315 写道在oracle 10g下注释没任何变动,而且1.2.1中去掉daoGenerator就报空制针的问题依然存在,听说1.2.2已经修复了的。

另外请问下博主,我下载编译了ibator1.2.2,但是用java程序调用时就报错:java.net.MalformedURLException,死活找不到原因,放在插件里头也一样的错误,不知博主是怎么解决的?或者你这个版本不是最新的1.2.2?

不好意思!刚才没重启eclipse。重启后,注释变了,不过字段注释为null。daoGenerator去掉也不报错了。
但是有个问题,记得原版重新生成代码后,能覆盖原来一样的代码;但修改版第二次生成时,中文注释变为乱码,然后合并到旧代码中,导致字段重复。

读书人网 >软件架构设计

热点推荐