代码生成器-根据数据库生成对应Entity和Mapper

本文介绍了一种不同于传统mybatis generator的方法,通过已有的数据库表,自动生成Entity和Mapper。Entity包含了所有字段和方法,而Mapper仅包含基本接口和方法。代码分为EntityGenerator、Generate和SqlHelper三个部分,详细解释了各个部分的功能,并提供了代码示例。同样的结构也适用于MapperGenerator。文章最后展示了数据库表和生成的代码内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

和真正mybatis generator的基于xml不同,笔者是建立在数据库已建好的基础上,分别进行Entity与Mapper的自动生成。

Entity包含所有的字段声明(private String username等)以及所有的getset方法。
Mapper仅包含@Mapper下的接口的声明,以及一个insert方法。其他select以及update可以根据业务需要自行修改少部分代码进行生成,有任何疑问可以楼下评论,笔者会尽快回复。


1. Entity

代码分为三个部分:

  • 主功能类EntityGenerator
  • 入口Generate
  • 工具类SqlHelper

注释已经写的很清楚了,这里直接上代码:

1. EntityGenerator

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

public class EntityGenerator {
    // 数据库连接
    private String URL;
    private String DBName;
    private String NAME;
    private String PASS;

    private String authorName = "undestiny";// 作者名字
    private String[] colnames; // 列名数组
    private String[] colTypes; // 列名类型数组
    private int[] colSizes; // 列名大小数组
    private boolean f_util = false; // 是否需要导入包java.util.*
    private boolean f_sql = false; // 是否需要导入包java.sql.*

    private SqlHelper sqlHelper = null;

    /*
     * 构造函数
     */
    public EntityGenerator(String url, String dbname, String username, String password) {
        this.URL = url + "/" + dbname;
        this.DBName = dbname;
        this.NAME = username;
        this.PASS = password;

        sqlHelper = new SqlHelper(this.URL, this.NAME, this.PASS);
    }

    public void Generate() {
        List<String> tableNames = sqlHelper.Get(
                "SELECT * FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='" + DBName + "';", "TABLE_NAME");
        Connection con = null;
        try {
            con = sqlHelper.getConnection();
        } catch (ClassNotFoundException | SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        for (String table : tableNames) {
            Generate(table, con);
            System.out.println("generated: "+table );
            resetTableInfo();
        }
        try {
            sqlHelper.closeConnection(con);
        } catch (ClassNotFoundException | SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private void resetTableInfo(){
        colnames = null;
        colTypes=null;
        colSizes=null;
        f_util=false;
        f_sql=false;
    }

    private String getPackageOutPath() {
        return "com.entity." + DBName;
    }

    private void Generate(String tablename, Connection con) {
        if (con == null) {
            System.out.println("------------------Connection to database was not set up------------------");
            return;
        }
        // 查要生成实体类的表
        String sql = "SELECT * FROM " + tablename + " limit 0, 1;";
        PreparedStatement pStemt = null;
        try {
            pStemt = con.prepareStatement(sql);
            ResultSetMetaData rsmd = pStemt.getMetaData();
            int size = rsmd.getColumnCount(); // 统计列
            colnames = new String[size];
            colTypes = new String[size];
            colSizes = new int[size];
            for (int i = 0; i < size; i++) {
                colnames[i] = rsmd.getColumnName(i + 1).replace(" ", "");
                colTypes[i] = rsmd.getColumnTypeName(i + 1);

                if (colTypes[i].equalsIgnoreCase("datetime") || colTypes[i].equalsIgnoreCase("date")) {
                    f_util = true;
                }
                if (colTypes[i].equalsIgnoreCase("image") || colTypes[i].equalsIgnoreCase("text")
                        || colTypes[i].equalsIgnoreCase("TIMESTAMP")) {
                    f_sql = true;
                }
                colSizes[i] = rsmd.getColumnDisplaySize(i + 1);
            }

            String content = parse(colnames, colTypes, colSizes, tablename);

            try {
                File directory = new File("");
                File dir = new File(directory.getAbsolutePath() + "/src/" + this.getPackageOutPath().replace(".", "/"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值