整合maven+mybatis+generator生成java自定義model實體類,dao介面和mapper對映檔案
阿新 • • 發佈:2019-01-09
通過繼承PluginAdapter類,開發自定義外掛,生成自定義的中文註解的java實體類,dao介面和mapper對映檔案.
1.pom.xml新增依賴的jar包:
<dependencies> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.30</version> </dependency> <!--Mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.1</version> </dependency> <!-- Mybatis Generator --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.5</version> </dependency> </dependencies>
2.配置generatorConfig.xml:
以上配置完成,其實就通過generator可以生成預設的程式碼了,但是我們想生成我們自定義的程式碼,就需要繼承PluginAdapter開發自定義外掛來實現:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!-- 引入配置檔案 --> <properties resource="jdbc.properties" /> <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat"> <property name="beginningDelimiter" value="`" /> <property name="endingDelimiter" value="`" /> <!-- 生成的檔案編碼 --> <property name="javaFileEncoding" value="utf-8"/> <!-- 通過自定義外掛類生成自定義註解和介面 --> <plugin type="com.xe.demo.common.generator.GenPlugin"> <property name="mappers" value="com.xe.demo.mapper.BaseMapper" /> </plugin> <commentGenerator> <!-- 取消生成註釋 --> <property name="suppressAllComments" value="true"/> </commentGenerator> <!-- 資料庫連線屬性 --> <jdbcConnection driverClass="${jdbc.driver}" connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}" /> <!-- 生成實體類配置 --> <javaModelGenerator targetPackage="com.xe.demo.model" targetProject="src/main/java" /> <!-- 生成對映檔案配置 --> <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources" /> <!-- 生成對映介面配置 --> <javaClientGenerator targetPackage="com.xe.demo.mapper" targetProject="src/main/java" type="XMLMAPPER" /> <table tableName="%"> <!--mysql 配置 --> <generatedKey column="id" sqlStatement="Mysql" identity="true" /> </table> </context> </generatorConfiguration>
3.建立GenPlugin.java繼承PluginAdapter:
1).把資料庫欄位的註釋作為生成的實體類欄位註釋,建立GenCommentGenerator.java類,實現CommentGenerator.java,具體實現如下:
/** * 給欄位新增資料庫備註 * @param field * @param introspectedTable * @param introspectedColumn */ @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) { field.addJavaDocLine("//" + introspectedColumn.getRemarks()); } }
/**
* getter方法註釋
* @param method
* @param introspectedTable
* @param introspectedColumn
*/
@Override
public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
StringBuilder sb = new StringBuilder();
method.addJavaDocLine("/**");
if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
sb.append(" * 獲取");
sb.append(introspectedColumn.getRemarks());
method.addJavaDocLine(sb.toString());
method.addJavaDocLine(" *");
}
sb.setLength(0);
sb.append(" * @return ");
sb.append(introspectedColumn.getActualColumnName());
if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
sb.append(" - ");
sb.append(introspectedColumn.getRemarks());
}
method.addJavaDocLine(sb.toString());
method.addJavaDocLine(" */");
}
/**
* setter方法註釋
* @param method
* @param introspectedTable
* @param introspectedColumn
*/
@Override
public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
StringBuilder sb = new StringBuilder();
method.addJavaDocLine("/**");
if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
sb.append(" * 設定");
sb.append(introspectedColumn.getRemarks());
method.addJavaDocLine(sb.toString());
method.addJavaDocLine(" *");
}
Parameter parm = method.getParameters().get(0);
sb.setLength(0);
sb.append(" * @param ");
sb.append(parm.getName());
if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
sb.append(" ");
sb.append(introspectedColumn.getRemarks());
}
method.addJavaDocLine(sb.toString());
method.addJavaDocLine(" */");
}
在GenPlugin.java重寫方法setContext: // 註釋生成器
private CommentGeneratorConfiguration commentCfg;
@Override
public void setContext(Context context) {
super.setContext(context);
// 設定預設的註釋生成器
commentCfg = new CommentGeneratorConfiguration();
commentCfg.setConfigurationType(GenCommentGenerator.class.getCanonicalName());
context.setCommentGeneratorConfiguration(commentCfg);
// 支援oracle獲取註釋#114
context.getJdbcConnectionConfiguration().addProperty("remarksReporting", "true");
}
2).建立基礎mapper介面BaseMapper.java,重寫clientGenerated方法,讓generator自動生成的介面繼承BaseMapper.java:package com.xe.demo.mapper;
import java.io.Serializable;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.xe.demo.common.pojo.PageModel;
/**
* Mybatis基礎DAO
* @author 蔡澤華
*/
public interface BaseMapper<T> {
/**
* 通過ID查詢
* @param id
* @return
*/
Object selectById(Serializable id);
/**
* 查詢單條記錄
* @param entity
* @return
*/
Object selectOne(@Param("item")Object obj);
/**
* 查詢記錄集合
* @param entity
* @return
*/
List<?> selectList(@Param("item")Object obj);
/**
* 分頁查詢
* @param t
* @param page
* @return
*/
List<T> selectPage(@Param("item")Object obj, @Param("page")PageModel page);
/**
* 通用的儲存方法
* @param <T>
* @param entity
*/
void save(@Param("item")Object obj);
/**
* 批量儲存
* @param list
*/
int batchSave(List<?> list);
/**
* 通用的修改方法
* @param <T>
* @param entity
*/
int update(@Param("item")Object obj);
/**
* 批量更新
* @param list
* @return
*/
int batchUpdate(List<?> list);
/**
* 刪除方法
* @param id
*/
int delById(Serializable id);
/**
* 批量刪除
* @param list
* @return
*/
int delList(List<?> list);
/**
* 批量刪除方法
* @param ids
*/
int delArray(int[] ids);
/**
* 統計查詢
* @param <T>
* @param params 查詢引數
* @return 總記錄條數
*/
int count(Object obj);
}
private Set<String> mappers = new HashSet<String>();
@Override
public void setProperties(Properties properties) {
super.setProperties(properties);
String mappers = this.properties.getProperty("mappers");
for (String mapper : mappers.split(",")) {
this.mappers.add(mapper);
}
}
/**
* 生成的Mapper介面
* @param interfaze
* @param topLevelClass
* @param introspectedTable
* @return
*/
@Override
public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
// 獲取實體類
FullyQualifiedJavaType entityType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
// import介面
for (String mapper : mappers) {
interfaze.addImportedType(new FullyQualifiedJavaType(mapper));
interfaze.addSuperInterface(new FullyQualifiedJavaType(mapper + "<" + entityType.getShortName() + ">"));
}
// import實體類
interfaze.addImportedType(entityType);
return true;
}
3).重寫sqlMapDocumentGenerated方法,讓生成BaseMapper.java介面對應的對映檔案:
/**
* 拼裝SQL語句生成Mapper介面對映檔案
*/
@Override
public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {
XmlElement rootElement = document.getRootElement();
// 資料庫表名
String tableName = introspectedTable.getFullyQualifiedTableNameAtRuntime();
// 主鍵
IntrospectedColumn pkColumn = introspectedTable.getPrimaryKeyColumns().get(0);
// 公共欄位
StringBuilder columnSQL = new StringBuilder();
// IF判斷語句
StringBuilder ifSQL = new StringBuilder();
// 要插入的欄位(排除自增主鍵)
StringBuilder saveColumn = new StringBuilder("insert into ").append(tableName).append("(\n");
// 要儲存的值
StringBuilder saveValue = new StringBuilder("(\n");
// 拼裝更新欄位
StringBuilder updateSQL = new StringBuilder("update ").append(tableName).append(" set ").append(pkColumn.getActualColumnName())
.append(" = #{item.").append(pkColumn.getJavaProperty()).append("}\n");
// 資料庫欄位名
String columnName = null;
// java欄位名
String javaProperty = null;
for (IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) {
columnName = MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn);
javaProperty = introspectedColumn.getJavaProperty();
// 拼接欄位
columnSQL.append(columnName).append(",");
// 拼接IF語句
ifSQL.append(" <if test=\"null != item.").append(javaProperty).append(" and '' != item.").append(javaProperty).append("\">");
ifSQL.append("and ").append(columnName).append(" = #{item.").append(javaProperty).append("}</if>\n");
// 拼接SQL
if (!introspectedColumn.isAutoIncrement()) {
saveColumn.append("\t <if test=\"null != item.").append(javaProperty).append("\">, ").append(columnName).append("</if>\n");
saveValue.append("\t <if test=\"null != item.").append(javaProperty).append("\">, ").append("#{item.").append(javaProperty)
.append("}</if>\n");
updateSQL.append(" <if test=\"null != item.").append(javaProperty).append("\">");
updateSQL.append(", ").append(columnName).append(" = #{item.").append(javaProperty).append("}</if>\n");
}
}
String columns = columnSQL.substring(0, columnSQL.length() - 1);
rootElement.addElement(createSql("sql_columns", columns));
String whereSQL = MessageFormat.format("<where>\n{0}\t</where>", ifSQL.toString());
rootElement.addElement(createSql("sql_where", whereSQL));
rootElement.addElement(createSelect("selectById", tableName, pkColumn));
rootElement.addElement(createSelect("selectOne", tableName, null));
rootElement.addElement(createSelect("selectList", tableName, null));
rootElement.addElement(createSelect("selectPage", tableName, null));
rootElement.addElement(createSql("sql_save_columns", saveColumn.append("\t) values").toString().replaceFirst(",", "")));
rootElement.addElement(createSql("sql_save_values", saveValue.append("\t)").toString().replaceFirst(",", "")));
rootElement.addElement(createSave("save", pkColumn));
rootElement.addElement(createSave("batchSave", null));
updateSQL.append("\twhere ").append(pkColumn.getActualColumnName()).append(" = #{item.").append(pkColumn.getJavaProperty()).append("}");
rootElement.addElement(createSql("sql_update", updateSQL.toString()));
rootElement.addElement(createUpdate("update"));
rootElement.addElement(createUpdate("batchUpdate"));
rootElement.addElement(createDels(tableName, pkColumn, "delArray", "array"));
rootElement.addElement(createDels(tableName, pkColumn, "delList", "list"));
return super.sqlMapDocumentGenerated(document, introspectedTable);
}
/**
* 公共SQL
* @param id
* @param sqlStr
* @return
*/
private XmlElement createSql(String id, String sqlStr) {
XmlElement sql = new XmlElement("sql");
sql.addAttribute(new Attribute("id", id));
sql.addElement(new TextElement(sqlStr));
return sql;
}
/**
* 查詢
* @param id
* @param tableName
* @param pkColumn
* @return
*/
private XmlElement createSelect(String id, String tableName, IntrospectedColumn pkColumn) {
XmlElement select = new XmlElement("select");
select.addAttribute(new Attribute("id", id));
select.addAttribute(new Attribute("resultMap", "BaseResultMap"));
StringBuilder selectStr = new StringBuilder("select <include refid=\"sql_columns\" /> from ").append(tableName);
if (null != pkColumn) {
selectStr.append(" where ").append(pkColumn.getActualColumnName()).append(" = #{").append(pkColumn.getJavaProperty()).append("}");
} else {
selectStr.append(" <include refid=\"sql_where\" />");
}
if ("selectPage".equals(id)) {
selectStr.append(" limit #{page.startRow}, #{page.pageSize}");
}
select.addElement(new TextElement(selectStr.toString()));
return select;
}
/**
* 儲存
* @param id
* @param pkColumn
* @return
*/
private XmlElement createSave(String id, IntrospectedColumn pkColumn) {
XmlElement save = new XmlElement("insert");
save.addAttribute(new Attribute("id", id));
if (null != pkColumn) {
save.addAttribute(new Attribute("keyProperty", "item." + pkColumn.getJavaProperty()));
save.addAttribute(new Attribute("useGeneratedKeys", "true"));
save.addElement(new TextElement("<include refid=\"sql_save_columns\" /><include refid=\"sql_save_values\" />"));
} else {
StringBuilder saveStr = new StringBuilder(
"<foreach collection=\"list\" index=\"index\" item=\"item\" open=\"\" separator=\";\" close=\"\">\n\t ")
.append("<include refid=\"sql_save_columns\" /><include refid=\"sql_save_values\" />\n\t</foreach>");
save.addElement(new TextElement(saveStr.toString()));
}
return save;
}
/**
* 更新
* @param id
* @return
*/
private XmlElement createUpdate(String id) {
XmlElement update = new XmlElement("update");
update.addAttribute(new Attribute("id", id));
if ("update".equals(id)) {
update.addElement(new TextElement("<include refid=\"sql_update\" />"));
} else {
update.addElement(new TextElement(
"<foreach collection=\"list\" index=\"index\" item=\"item\" open=\"\" separator=\";\" close=\"\">\n\t <include refid=\"sql_update\" />\n\t</foreach>"));
}
return update;
}
/**
* 刪除
* @param tableName
* @param pkColumn
* @param method
* @param type
* @return
*/
private XmlElement createDels(String tableName, IntrospectedColumn pkColumn, String method, String type) {
XmlElement delete = new XmlElement("delete");
delete.addAttribute(new Attribute("id", method));
StringBuilder deleteStr = new StringBuilder("delete from ").append(tableName).append(" where ").append(pkColumn.getActualColumnName())
.append(" in\n\t")
.append("<foreach collection=\"").append(type)
.append("\" index=\"index\" item=\"item\" open=\"(\" separator=\",\" close=\")\">#{item}</foreach>");
delete.addElement(new TextElement(deleteStr.toString()));
return delete;
}
4.執行GenMain.java方法:package com.xe.demo;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
public class GenMain {
public static void main(String[] args) {
//讀取檔案
File configFile = new File(GenMain.class.getResource("/generatorConfig.xml").getFile());
List<String> warnings = new ArrayList<String>();
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = null;
//true:覆蓋生成
DefaultShellCallback callback = new DefaultShellCallback(true);
MyBatisGenerator myBatisGenerator = null;
try {
config = cp.parseConfiguration(configFile);
myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
System.err.println("程式碼成功生成!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
執行完重新整理專案,專案結構前後對比:下面是自動生成的程式碼:
package com.xe.demo.model;
import java.math.BigDecimal;
public class IMemberOrders {
private Long oid;
//訂單號
private String ordercode;
//暱稱
private String nickname;
//商品名
private String shopname;
//購買數量
private Short buycount;
//當次花費
private BigDecimal paycount;
//購買時間
private String buytime;
/**
* @return oid
*/
public Long getOid() {
return oid;
}
/**
* @param oid
*/
public void setOid(Long oid) {
this.oid = oid;
}
/**
* 獲取訂單號
*
* @return ordercode - 訂單號
*/
public String getOrdercode() {
return ordercode;
}
/**
* 設定訂單號
*
* @param ordercode 訂單號
*/
public void setOrdercode(String ordercode) {
this.ordercode = ordercode;
}
/**
* 獲取暱稱
*
* @return nickname - 暱稱
*/
public String getNickname() {
return nickname;
}
/**
* 設定暱稱
*
* @param nickname 暱稱
*/
public void setNickname(String nickname) {
this.nickname = nickname;
}
/**
* 獲取商品名
*
* @return shopname - 商品名
*/
public String getShopname() {
return shopname;
}
/**
* 設定商品名
*
* @param shopname 商品名
*/
public void setShopname(String shopname) {
this.shopname = shopname;
}
/**
* 獲取購買數量
*
* @return buycount - 購買數量
*/
public Short getBuycount() {
return buycount;
}
/**
* 設定購買數量
*
* @param buycount 購買數量
*/
public void setBuycount(Short buycount) {
this.buycount = buycount;
}
/**
* 獲取當次花費
*
* @return paycount - 當次花費
*/
public BigDecimal getPaycount() {
return paycount;
}
/**
* 設定當次花費
*
* @param paycount 當次花費
*/
public void setPaycount(BigDecimal paycount) {
this.paycount = paycount;
}
/**
* 獲取購買時間
*
* @return buytime - 購買時間
*/
public String getBuytime() {
return buytime;
}
/**
* 設定購買時間
*
* @param buytime 購買時間
*/
public void setBuytime(String buytime) {
this.buytime = buytime;
}
}
package com.xe.demo.mapper;
import com.xe.demo.model.IMemberOrders;
public interface IMemberOrdersMapper extends BaseMapper<IMemberOrders> {
}
<?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.xe.demo.mapper.IMemberOrdersMapper">
<resultMap id="BaseResultMap" type="com.xe.demo.model.IMemberOrders">
<id column="oid" jdbcType="BIGINT" property="oid" />
<result column="ordercode" jdbcType="VARCHAR" property="ordercode" />
<result column="nickname" jdbcType="VARCHAR" property="nickname" />
<result column="shopname" jdbcType="VARCHAR" property="shopname" />
<result column="buycount" jdbcType="SMALLINT" property="buycount" />
<result column="paycount" jdbcType="DECIMAL" property="paycount" />
<result column="buytime" jdbcType="VARCHAR" property="buytime" />
</resultMap>
<sql id="sql_columns">
oid,ordercode,nickname,shopname,buycount,paycount,buytime
</sql>
<sql id="sql_where">
<where>
<if test="null != item.oid and '' != item.oid">and oid = #{item.oid}</if>
<if test="null != item.ordercode and '' != item.ordercode">and ordercode = #{item.ordercode}</if>
<if test="null != item.nickname and '' != item.nickname">and nickname = #{item.nickname}</if>
<if test="null != item.shopname and '' != item.shopname">and shopname = #{item.shopname}</if>
<if test="null != item.buycount and '' != item.buycount">and buycount = #{item.buycount}</if>
<if test="null != item.paycount and '' != item.paycount">and paycount = #{item.paycount}</if>
<if test="null != item.buytime and '' != item.buytime">and buytime = #{item.buytime}</if>
</where>
</sql>
<select id="selectById" resultMap="BaseResultMap">
select <include refid="sql_columns" /> from i_member_orders where oid = #{oid}
</select>
<select id="selectOne" resultMap="BaseResultMap">
select <include refid="sql_columns" /> from i_member_orders <include refid="sql_where" />
</select>
<select id="selectList" resultMap="BaseResultMap">
select <include refid="sql_columns" /> from i_member_orders <include refid="sql_where" />
</select>
<select id="selectPage" resultMap="BaseResultMap">
select <include refid="sql_columns" /> from i_member_orders <include refid="sql_where" /> limit #{page.startRow}, #{page.pageSize}
</select>
<sql id="sql_save_columns">
insert into i_member_orders(
<if test="null != item.ordercode"> ordercode</if>
<if test="null != item.nickname">, nickname</if>
<if test="null != item.shopname">, shopname</if>
<if test="null != item.buycount">, buycount</if>
<if test="null != item.paycount">, paycount</if>
<if test="null != item.buytime">, buytime</if>
) values
</sql>
<sql id="sql_save_values">
(
<if test="null != item.ordercode"> #{item.ordercode}</if>
<if test="null != item.nickname">, #{item.nickname}</if>
<if test="null != item.shopname">, #{item.shopname}</if>
<if test="null != item.buycount">, #{item.buycount}</if>
<if test="null != item.paycount">, #{item.paycount}</if>
<if test="null != item.buytime">, #{item.buytime}</if>
)
</sql>
<insert id="save" keyProperty="item.oid" useGeneratedKeys="true">
<include refid="sql_save_columns" /><include refid="sql_save_values" />
</insert>
<insert id="batchSave">
<foreach collection="list" index="index" item="item" open="" separator=";" close="">
<include refid="sql_save_columns" /><include refid="sql_save_values" />
</foreach>
</insert>
<sql id="sql_update">
update i_member_orders set oid = #{item.oid}
<if test="null != item.ordercode">, ordercode = #{item.ordercode}</if>
<if test="null != item.nickname">, nickname = #{item.nickname}</if>
<if test="null != item.shopname">, shopname = #{item.shopname}</if>
<if test="null != item.buycount">, buycount = #{item.buycount}</if>
<if test="null != item.paycount">, paycount = #{item.paycount}</if>
<if test="null != item.buytime">, buytime = #{item.buytime}</if>
where oid = #{item.oid}
</sql>
<update id="update">
<include refid="sql_update" />
</update>
<update id="batchUpdate">
<foreach collection="list" index="index" item="item" open="" separator=";" close="">
<include refid="sql_update" />
</foreach>
</update>
<delete id="delArray">
delete from i_member_orders where oid in
<foreach collection="array" index="index" item="item" open="(" separator="," close=")">#{item}</foreach>
</delete>
<delete id="delList">
delete from i_member_orders where oid in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">#{item}</foreach>
</delete>
</mapper>
原始碼下載地址: