整合maven+mybatis+generator生成java自定义model实体类,dao接口和mapper映射文件
来源:互联网 发布:ucsc数据库 编辑:程序博客网 时间:2024/05/16 10:22
通过继承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:
<?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>以上配置完成,其实就通过generator可以生成默认的代码了,但是我们想生成我们自定义的代码,就需要继承PluginAdapter开发自定义插件来实现:
3.创建GenPlugin.java继承PluginAdapter:
1).把数据库字段的注释作为生成的实体类字段注释,创建GenCommentGenerator.java类,实现CommentGenerator.java,具体实现如下:
/** * 给字段添加数据库备注 * @param field * @param introspectedTable * @param introspectedColumn */@Overridepublic void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {field.addJavaDocLine("//" + introspectedColumn.getRemarks());}}
/** * getter方法注释 * @param method * @param introspectedTable * @param introspectedColumn */@Overridepublic 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 */@Overridepublic 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;@Overridepublic void setContext(Context context) {super.setContext(context);// 设置默认的注释生成器commentCfg = new CommentGeneratorConfiguration();commentCfg.setConfigurationType(GenCommentGenerator.class.getCanonicalName());context.setCommentGeneratorConfiguration(commentCfg);// 支持oracle获取注释#114context.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>();@Overridepublic 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 */@Overridepublic 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接口映射文件 */@Overridepublic 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");// 拼接SQLif (!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>源码下载地址:整合maven+mybatis+generator生成java自定义model实体类,dao接口和mapper映射文件
阅读全文
0 0
- 整合maven+mybatis+generator生成java自定义model实体类,dao接口和mapper映射文件
- 如何用MyBatis-Generator自动创建代码(映射生成实体类、DAO接口和Mapping映射文件)
- maven插件mybatis-generator自动生成实体类、mapper.xml、mapper.java文件
- 使用mybatis-generator自动生成实体类,接口实现类和Mapper映射配置文件
- mybatis generator自动生成dao,model,mapper文件
- mybatis-generator自动创建model,mapper和dao接口
- 使用MyBatis Generator自动生成实体、mapper和dao层
- 使用mybatis-generator自动生成dao、model和mapper
- mybatis generator自动生成model、dao、mapper
- 使用Mybatis-Generator自动生成Dao、model和mapper.xml相关文件
- 简单两步快速学会使用Mybatis-Generator自动生成entity实体、dao接口和简单mapper映射(用mysql和oracle举例)
- Maven使用Mybatis Generator插件生成Mapper接口 xml和实体
- Maven中使用MyBatis自动生成model实体、dao、XML映射文件
- Mybatis--使用mybatis generator插件映射数据库,自动生成pojo对象,dao接口,mapper.xml文件的方法
- 利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件
- MyBatis自动生成实体类、DAO接口和Mapping映射文件的代码(逆向工程)
- 使用Mybatis生成工具自动生成实体类和对应的mapper映射文件以及接口文件
- Mybatis的功能之一:数据库表自动生成对应的model类,dao接口和Mapper.xml文件
- 分针网—每日分享:HTTP 填坑
- 图片轮播,鼠标放上去即停止,鼠标移除即播放下一张图片
- 原生js QQ列表展示小练习
- Ext属性详细信息
- onActivityResult的使用(Activity界面销毁数据带回)
- 整合maven+mybatis+generator生成java自定义model实体类,dao接口和mapper映射文件
- 2.java面试复习大纲
- Jquery图片轮播插件--jcarousellite的使用
- Hadoop基本原理
- json表单序列化
- CRC循环冗余检验算法
- GET与POST比较(数据大小、数据类型、传送形式)
- IOS核心动画高级二:寄宿图
- 出国开会总结,学生,初次出国参加学术会议