前段時間看了張開濤寫的代碼生成插件,感覺思路很好,通過連接庫然后獲取數據庫表信息,然后用戶在界面中勾選要映射的策略,映射的字段,然后可以自動生成業務代碼.
基於開濤的思路,自己寫了一個簡易插件,去掉了連接庫操作,改用注解,使用時需要先自行定義實體類,然后使用注解定義那部分映射,如何映射,然后啟動生成,進而生成業務代碼
功能描述:
支持
1.注解自定義映射,.
2.掃描實體類生成對應的業務代碼(業務層、事務層、持久層[接口+接口對應的映射mapper.xml文件])
3.編碼自定義,支持生成注解
4.支持模塊擴展,可以自己定義生成哪個模塊,也可以擴展生成模塊(這塊沒有設計好,擴展代碼比較復雜)
不支持
復雜結構對象映射
目前生成映射xml中的SQL腳本為mysql,只是為了練手而寫,所以后期有時間的話,擴展自定義數據庫
使用實體:
定義實體如下:
//映射表別名
@GeneratorTable(name = "tb_member") public class Member implements Serializable{ //映射該字段,並且為主鍵,自定義字段別名
@GeneratorField(primaryKey = true, name = "m_Id") private Integer id; @GeneratorField(name = "member_name") private String memberName; //映射時不映射該字段
@AbolishedField private String address; //不使用注解,默認為使用屬性名進行映射
private String zipCode; //getter and setter
}
生成配置
public static void main(String [] args){ GeneratorConfig config = new GeneratorConfig(); //代碼根路徑
config.setSrcRoot("src/main/java"); //掃描的包,默認支持遞歸掃描該包下的東西
config.setScanBaseModelPackage("com.dobby.code.make.model"); config.setEncoding("UTF-8"); //生成的代碼存放的包
config.setCodeGeneratorPackage("com.dobby.autocode"); //如果生成的類文件已經存在,是否覆蓋
config.setCodeExistsOverride(false); //生成注解代碼
config.setAnnotationSupport(true); //使用插件生成
new Generator(config).generatorCode(); }
生成前的代碼結構:
生成的代碼模塊,下圖標紅區域
生成的業務層代碼:

package com.dobby.autocode.service; import java.util.List; import com.dobby.common.base.BaseService; import com.dobby.code.make.model.Member; /** * * User: dobby * Date: 2014-11-26 * Time: 21:10:06 * Version: 1.0 * */
public interface MemberService extends BaseService<Member,java.lang.Integer>{ }
package com.dobby.autocode.service.impl; import java.util.List; import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; import com.dobby.common.page.Page; import com.dobby.autocode.service.MemberService; import com.dobby.autocode.manager.MemberManager; import com.dobby.code.make.model.Member; /** * * User: dobby * Date: 2014-11-26 * Time: 21:10:06 * Version: 1.0 * */ @Service(value = "memberService") public class MemberServiceImpl implements MemberService{ @Autowired private MemberManager memberManager; /** * save member <br/> * * @param member * member * @return * effect of row number */ @Override public int save(Member member){ return this.memberManager.save(member); } /** * update member <br/> * * @param member * member * @return * effect of row number */ @Override public int update(Member member) { return this.memberManager.update(member); } /** * delete member by primary key <br/> * * @param primaryKey * primaryKey * @return * effect of row number */ @Override public int delete(java.lang.Integer primaryKey){ return this.memberManager.delete(primaryKey); } /** * delete member by condition <br/> * * @param member * condition member * @return * effect of row number */ @Override public int deleteObjects(Member member) { return this.memberManager.deleteObjects(member); } /** * select member by primary key <br/> * * @param primaryKey * primaryKey * @return * with the conditions of the one object */ @Override public Member select(java.lang.Integer primaryKey) { return this.memberManager.select(primaryKey); } /** * select list member by condition <br/> * * @param member * condition member * @return * with the conditions of the result set */ @Override public List<Member> selectObjects(Member member){ return this.memberManager.selectObjects(member); } /** * select list member by condition for page show<br/> * * @param member * query condition * @param pageNow * get data for which page * @param pageSize * pageSize for each page * @return * with the conditions of the result set */ @Override public Page<Member> selectPage(Member member, Integer pageNow, Integer pageSize){ return this.memberManager.selectPage(member , pageNow , pageSize); } public void setMemberManager (MemberManager memberManager) { this.memberManager = memberManager; } }
生成的事物層代碼

package com.dobby.autocode.manager; import com.dobby.common.base.BaseManager; import com.dobby.code.make.model.Member; /** * * User: dobby * Date: 2014-11-26 * Time: 21:10:06 * Version: 1.0 * */
public interface MemberManager extends BaseManager<Member,java.lang.Integer> { }
package com.dobby.autocode.manager.impl; import java.util.List; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; import org.springframework.stereotype.Component; import org.springframework.beans.factory.annotation.Autowired; import javax.annotation.Resource; import com.dobby.common.page.Page; import com.dobby.autocode.manager.MemberManager; import com.dobby.autocode.dao.MemberDao; import com.dobby.code.make.model.Member; /** * * User: dobby * Date: 2014-11-26 * Time: 21:10:06 * Version: 1.0 * */ @Component(value = "memberManager") public class MemberManagerImpl implements MemberManager{ @Resource( name = "transactionMemberManager") private PlatformTransactionManager transactionMemberManager; @Autowired private MemberDao memberDao; public void setTransactionMemberManager (PlatformTransactionManager transactionMemberManager) { this.transactionMemberManager = transactionMemberManager; } public void setMemberDao (MemberDao memberDao) { this.memberDao = memberDao; } @Override public int save(final Member member){ int result = 0; TransactionTemplate template = new TransactionTemplate(this.transactionMemberManager); result = (Integer)template.execute(new TransactionCallback() { @Override public Object doInTransaction(TransactionStatus status) { return memberDao.insert(member); } }); return result; } @Override public int update(final Member member) { int result = 0; TransactionTemplate template = new TransactionTemplate(this.transactionMemberManager); result = (Integer)template.execute(new TransactionCallback() { @Override public Object doInTransaction(TransactionStatus status) { return memberDao.update(member); } }); return result; } @Override public int delete(final java.lang.Integer primaryKey){ int result = 0; TransactionTemplate template = new TransactionTemplate(this.transactionMemberManager); result = (Integer)template.execute(new TransactionCallback() { @Override public Object doInTransaction(TransactionStatus status) { return memberDao.delete(primaryKey); } }); return result; } @Override public int deleteObjects(final Member member) { int result = 0; TransactionTemplate template = new TransactionTemplate(this.transactionMemberManager); result = (Integer)template.execute(new TransactionCallback() { @Override public Object doInTransaction(TransactionStatus status) { return memberDao.deleteObjects(member); } }); return result; } @Override public Member select(java.lang.Integer primaryKey) { return this.memberDao.select(primaryKey); } @Override public List<Member> selectObjects(Member member){ return this.memberDao.selectObjects(member); } @Override public Page<Member> selectPage(Member member, Integer pageNow, Integer pageSize){ Page<Member> page = null; try { List<Member> list = this.memberDao.selectPagination(member, (pageNow - 1) * pageSize, pageSize); int recordTotal = this.memberDao.selectPageCount(member); page = new Page<Member>(list,recordTotal,pageNow); } catch (Exception e) { e.printStackTrace(); } return page; } }
生成的持久層代碼

package com.dobby.autocode.dao; import java.util.List; import com.dobby.common.base.BaseCudDao; import com.dobby.common.base.BaseReadDao; import com.dobby.code.make.model.Member; /** * * User: dobby * Date: 2014-11-26 * Time: 21:10:06 * Version: 1.0 * */
public interface MemberDao extends BaseReadDao<Member,java.lang.Integer>,BaseCudDao<Member,java.lang.Integer>{ }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dobby.autocode.dao.MemberDao"> <!-- all table column--> <sql id="allColumns"> zipCode, memberName </sql> <!-- query entity by id --> <select id="select" parameterType="java.lang.Integer" resultType="member" useCache="true"> SELECT <include refid="allColumns" /> FROM tb_member WHERE m_Id=#{pKey} </select> <!-- query entity by condition for page --> <select id="selectPagination" resultType="member" useCache="true"> SELECT <include refid="allColumns" /> FROM tb_member WHERE 1 = 1 <if test="object.zipCode!= null and ''!=object.zipCode"> <![CDATA[ AND zipCode = #{object.zipCode} ]]> </if> <if test="object.memberName!= null and ''!=object.memberName"> <![CDATA[ AND member_name = #{object.memberName} ]]> </if> LIMIT #{start},#{size} </select> <!-- query entity collection by condition for page total --> <select id="selectPageCount" parameterType="member" resultType="java.lang.Integer" useCache="true"> SELECT count(0) FROM tb_member WHERE 1 = 1 <if test="object.zipCode!= null and ''!=object.zipCode"> <![CDATA[ AND zipCode = #{object.zipCode} ]]> </if> <if test="object.memberName!= null and ''!=object.memberName"> <![CDATA[ AND member_name = #{object.memberName} ]]> </if> </select> <!-- query entity by condition --> <select id="selectObjects" parameterType="member" useCache="true"> SELECT <include refid="allColumns" /> FROM tb_member WHERE 1 = 1 <if test="object.zipCode!= null and ''!=object.zipCode"> <![CDATA[ AND zipCode = #{object.zipCode} ]]> </if> <if test="object.memberName!= null and ''!=object.memberName"> <![CDATA[ AND member_name = #{object.memberName} ]]> </if> </select> <!-- insert entity --> <insert id="insert" parameterType="member" flushCache="true"> INSERT INTO tb_member(<include refid="allColumns"/>) VALUES (#{zipCode}, #{memberName}) </insert> <!-- insert entity by primary key--> <delete id="delete" parameterType="java.lang.Integer" flushCache="true"> DELETE FROM tb_member WHERE m_Id=#{pKey} </delete> <!-- delete entity by object condition--> <delete id="deleteObjects" parameterType="member" flushCache="true"> DELETE FROM tb_member WHERE 1 = 1 <if test="object.zipCode!= null and ''!=object.zipCode"> <![CDATA[ AND zipCode = #{object.zipCode} ]]> </if> <if test="object.memberName!= null and ''!=object.memberName"> <![CDATA[ AND member_name = #{object.memberName} ]]> </if> </delete> <!-- update entity by primary key--> <update id="update" parameterType="member" flushCache="true"> UPDATE tb_member <set> <if test="object.zipCode!= null and ''!=object.zipCode"> <![CDATA[ AND zipCode = #{object.zipCode} ]]> </if> <if test="object.memberName!= null and ''!=object.memberName"> <![CDATA[ AND member_name = #{object.memberName} ]]> </if> </set> WHERE m_Id=#{pKey} </update> </mapper>
說明:生成代碼並沒有做真正的業務測試,可能某些地方有問題,后續有時間會完善.
附件:
插件包: http://files.cnblogs.com/dennisit/%E7%94%9F%E6%88%90%E6%8F%92%E4%BB%B6%E5%8C%85.zip
注解模塊實現說明:http://www.cnblogs.com/dennisit/p/4125103.html