由于近期参与项目用到的是Mybatis的注解开发,不涉及到Xml文件,为了图省事,想到以前的Mybatis的逆向工程MyBatis Generator实现MySQL分页插件, Mybaties-plus之AutoGenerator 代码生成器,
重复的劳动何必反复去做呢?,就各种百度git,找到了MybatisAnnotationTools,这里对于别人的代码做了优化和增加功能,可能还不是很完善,如果有侵权或者建议,请及时反馈或者及时改正,文章后会给出具体参考链接
这里简单介绍下我是怎么实现的,具体配置:
application.properties (具体简介都在配置文件里了)
因为我找个是MAC,不是windows,所以路径是MAC路径/Applications/code/ceshi/,windows可以参考原文 例如:E:/CODE/github/dao/
# MySQL 连接配置
mysql.datasource.driver-class-name=com.mysql.jdbc.Driver
mysql.datasource.url=jdbc:localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false
mysql.datasource.username=root
mysql.datasource.password=123456
# 表前缀,生成类时会去掉这个前缀
mysql.datasource.table.prefix=
# 是否要生成 PO
java.model.enable=true
# PO 包路径
java.model.package=com.yitian.po
# PO 类文件生成路径,"/"结尾
java.model.src.folder=/Applications/code/ceshi/
# PO 类文件前缀
java.model.prefix=
# PO 类文件后缀
java.model.suffix=DTO
# 是否要生成 DAO
java.dao.enable=true
# DAO 包路径
java.dao.package=com.yitian.dao
# DAO 类文件生成路径,"/"结尾
java.dao.src.folder=/Applications/code/ceshi/
# DAO 类文件前缀
java.dao.prefix=
# DAO 类文件后缀
java.dao.suffix=Dao
Dao层和Pojo生成主要依靠DaoTemplate和ModelTemplate
package #<daoPackage>;
import java.io.Serializable;
import java.util.List;
import #<modelPackage>.#<modelName>;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
/**
* #<tableComment>(#<tableName>).
*
* @author yitianRen
* @since #<createTime>
*/
@Repository("#<daoName>")
public interface #<daoName>{
/**
* 根据id查询
*
* @param id id
* @return po
*/
@Select("select * from #<tableName> where id = #{id}")
@Results({
#<result>})
#<modelName> selectByPrimaryKey(Serializable id);
/**
* 单个插入
*
* @param po po
*/
@Insert("insert into #<tableName>(#<fields>) "
+ "values(#<insertValues>)")
@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", before = false, resultType = Integer.class)
int insert(#<modelName> po);
/**
* 批量插入
*
* @param list po列表
*/
@Insert("<script>insert into #<tableName>(#<fields>) values "
+ "<foreach collection='list' index='index' item='n' separator=','> "
+ "(#<batchInsertValues>)"
+ "</foreach></script>")
void insertBatch(@Param("list") List<#<modelName>> list);
/**
* 更新
*
* @param po po
*/
@Update("update #<tableName> set #<updateValues> where id = #{id}")
void update(#<modelName> po);
/**
* 单个删除
*
* @param id id
*/
@Delete("delete from #<tableName> where id = #{id}")
void delete(Serializable id);
/**
* 批量删除
*
* @param ids id 集合
*/
@Delete("<script>delete from #<tableName> where id in "
+ "<foreach collection='ids' index='index' item='id' open='(' separator=',' close=')'>"
+ "#{id}"
+ "</foreach></script>")
void deleteByIds(@Param("ids") Set<Serializable> ids);
/**
* 统计
*
* @return 数量
*/
@Select("select count(*) from #<tableName>")
int count();
}
实体类Pojo
package #<modelPackage>;
import java.io.Serializable;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
* #<tableComment>(#<tableName>)
*
* @author yitianRen
* @since #<createTime>
*/
public class #<modelName>{
private static final long serialVersionUID = #<serialVersionUID>L;
#<fields>
#<getterSetter>
}
这里优化的地方是原代码中没有@Results注解,没有相对应的@Result 这里是这么写的#<result> 后面会讲到到这个怎么实现的
/**
* 根据id查询
*
* @param id id
* @return po
*/
@Select("select * from #<tableName> where id = #{id}")
@Results({
#<result>})
#<modelName> selectByPrimaryKey(Serializable id);
模板已经有了,那我们可以去创建我们需要的dao和pojo了 ,主要依靠DaoCreator和ModelCreator,这里只对DaoCreator优化新增#<result>也就是创建@Resuls做个介绍,相信你简单看过之后其他怎么实现的就清楚了
看代码最后一部分#<result>,这里就是创建@Result注解的部分了,具体实现方法是getResults,其中\t和\r\n分别是缩进和换行
private String createDaoFileContent(String longTableName) {
final String[] tableNames = longTableName.split(SPLIT_CHAR);
final String tableName = tableNames[0];
String fileContent = FileUtils.getTemplate(DAO_TEMP);
final String tableComment = tableNames.length > 1 ? tableNames[1] : "";
fileContent = fileContent.replaceAll("#<tableComment>", tableComment);
fileContent = fileContent.replaceAll("#<tableName>", tableName);
fileContent = fileContent.replaceAll("#<fields>", getFields(longTableName));
fileContent = fileContent.replaceAll("#<insertValues>", getInsertValues(longTableName));
fileContent = fileContent.replaceAll("#<batchInsertValues>", getBatchInsertValues(longTableName));
fileContent = fileContent.replaceAll("#<updateValues>", getUpdateValues(longTableName));
fileContent = fileContent.replaceAll("#<daoPackage>", table.getDaoPackage());
fileContent = fileContent.replaceAll("#<daoName>", getDaoName(tableName));
// model
fileContent = fileContent.replaceAll("#<modelPackage>", table.getModelPackage());
fileContent = fileContent.replaceAll("#<modelName>", getModelName(tableName));
fileContent = fileContent.replaceAll("#<createUser>", System.getProperty("user.name"));
final String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));
fileContent = fileContent.replaceAll("#<createTime>", createTime);
//这里做了优化 @Results获取字段对应的数据
fileContent = fileContent.replaceAll("#<result>", getResults(longTableName));
return fileContent;
}
private String getResults(String tableName) {
List<Field> fields = table.getTableFields().get(tableName);
StringBuilder builder = new StringBuilder();
Field field0 = fields.get(0);
builder.append("\t@Result(column = \""+field0.getFieldName()+"\",jdbcType= JdbcType."+field0.getFieldType()+",property= \""
+field0.getJavaFieldName()+", id = true),\r\n");
for (int i = 1; i < fields.size(); i++) {
Field field = fields.get(i);
builder.append("\t\t@Result(column = \""+field.getFieldName()+"\",jdbcType= JdbcType."+field.getFieldType()+",property= \""
+field.getJavaFieldName()+"),\r\n");
}
builder.append("\t\t");
return builder.toString();
}
好了,创建我们也实现了,那我们启动Bootstrap类 这里就是实现过程了,不过原文中是创建所有的表,这里优化了一下只创建我们需要的表 优化过程看第二段代码
public static void main(String[] args) throws Exception {
propPath = StringUtils.isAllBlank(args) ? "" : args[0];
Map<String, List<Field>> tableFields = new HashMap<>();
// 读取配置文件
Table table = queryProperties(tableFields);
// 获取数据库信息
queryDatabase(tableFields);
// 创建 Java 文件
createJavaFiles(table);
System.out.println("Finished, find " + tableFields.size() + " tables");
}
优化在方法queryDatabase中,判断是否是我们需要创建的表吗,不是就继续
//mysql中这里改成3
final String tableName = tables.getString(3);
//这里优化了一下 导出自己需要的表就行 没必要全部导出
if(!("sale_online_pay_detail").equals(tableName)){
continue;
}
run main方法,自动在我们配置文件中配置的路径下就会出现我们需要的pojo和dao层
实例:(需要个性化配置,自动去修改模板和创建过程就可以了)
package com.yitian.dao;
import java.io.Serializable;
import java.util.List;
import com.yitian.po.SaleOnlinePayDetailDTO;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
/**
* (sale_online_pay_detail).
*
* @author yitianRen
* @since 2020/09/15 16:23:56
*/
@Repository("SaleOnlinePayDetailDao")
public interface SaleOnlinePayDetailDao{
/**
* 根据id查询
*
* @param id id
* @return po
*/
@Select("select * from sale_online_pay_detail where id = #{id}")
@Results({
@Result(column = "id",jdbcType= JdbcType.INT,property= "id, id = true),
@Result(column = "sale_order_id",jdbcType= JdbcType.INT,property= "saleOrderId),
@Result(column = "sale_pay_order_id",jdbcType= JdbcType.INT,property= "salePayOrderId),
@Result(column = "pay_type_code",jdbcType= JdbcType.VARCHAR,property= "payTypeCode),
@Result(column = "pay_amount",jdbcType= JdbcType.DECIMAL,property= "payAmount),
@Result(column = "status_code",jdbcType= JdbcType.VARCHAR,property= "statusCode),
@Result(column = "creater",jdbcType= JdbcType.VARCHAR,property= "creater),
@Result(column = "create_time",jdbcType= JdbcType.DATETIME,property= "createTime),
@Result(column = "updater",jdbcType= JdbcType.VARCHAR,property= "updater),
@Result(column = "update_time",jdbcType= JdbcType.DATETIME,property= "updateTime),
@Result(column = "delete_flag",jdbcType= JdbcType.VARCHAR,property= "deleteFlag),
})
SaleOnlinePayDetailDTO selectByPrimaryKey(Serializable id);
/**
* 单个插入
*
* @param po po
*/
@Insert("insert into sale_online_pay_detail(id, sale_order_id, sale_pay_order_id, pay_type_code, pay_amount, status_code, creater, create_time, updater, update_time, delete_flag) "
+ "values(#{id}, #{saleOrderId}, #{salePayOrderId}, #{payTypeCode}, #{payAmount}, #{statusCode}, #{creater}, #{createTime}, #{updater}, #{updateTime}, #{deleteFlag})")
@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", before = false, resultType = Integer.class)
int insert(SaleOnlinePayDetailDTO po);
/**
* 批量插入
*
* @param list po列表
*/
@Insert("<script>insert into sale_online_pay_detail(id, sale_order_id, sale_pay_order_id, pay_type_code, pay_amount, status_code, creater, create_time, updater, update_time, delete_flag) values "
+ "<foreach collection='list' index='index' item='n' separator=','> "
+ "(#{n.id}, #{n.saleOrderId}, #{n.salePayOrderId}, #{n.payTypeCode}, #{n.payAmount}, #{n.statusCode}, #{n.creater}, #{n.createTime}, #{n.updater}, #{n.updateTime}, #{n.deleteFlag})"
+ "</foreach></script>")
void insertBatch(@Param("list") List<SaleOnlinePayDetailDTO> list);
/**
* 更新
*
* @param po po
*/
@Update("update sale_online_pay_detail set id = #{id}, sale_order_id = #{saleOrderId}, sale_pay_order_id = #{salePayOrderId}, pay_type_code = #{payTypeCode}, pay_amount = #{payAmount}, status_code = #{statusCode}, creater = #{creater}, create_time = #{createTime}, updater = #{updater}, update_time = #{updateTime}, delete_flag = #{deleteFlag} where id = #{id}")
void update(SaleOnlinePayDetailDTO po);
/**
* 单个删除
*
* @param id id
*/
@Delete("delete from sale_online_pay_detail where id = #{id}")
void delete(Serializable id);
/**
* 批量删除
*
* @param ids id 集合
*/
@Delete("<script>delete from sale_online_pay_detail where id in "
+ "<foreach collection='ids' index='index' item='id' open='(' separator=',' close=')'>"
+ "#{id}"
+ "</foreach></script>")
void deleteByIds(@Param("ids") Set<Serializable> ids);
/**
* 统计
*
* @return 数量
*/
@Select("select count(*) from sale_online_pay_detail")
int count();
}
本文优化后github路径:优化后路径
原git路径原git