Mybatis注解开发逆向工程MybatisAnnotationTools

由于近期参与项目用到的是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

参考Java 8 开发的 Mybatis 注解代码生成工具

MybatisAnnotationTools-1.0使用教学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值