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

和真正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(".", "/"));
                dir.mkdirs();

                String out
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Boot 项目中,通常会采用 MyBatis 框架进行持久化操作,按照 MVC 架构的设计思路,可将代码按照功能分为 EntityMapper 和 Service 三个层次。 1. Entity Entity 层是与数据库表进行映射的实体类。在 Entity 层中,通常会定义以下内容: - 定义实体类的属性和对应数据库表字段 - 定义实体类之间的关系 Entity 层的示例代码如下: ``` public class User { private Long id; private String name; private Integer age; // 省略 getter 和 setter 方法 } ``` 2. Mapper Mapper 层是连接数据库和业务逻辑的桥梁,它使用 MyBatis 框架来实现数据库操作。在 Mapper 层中,通常会定义以下内容: - 定义 SQL 语句和参数映射 - 定义查询条件和排序方式 - 定义对数据库的增删改查操作 Mapper 层的示例代码如下: ``` @Mapper public interface UserMapper { User getUserById(Long id); int addUser(User user); int updateUser(User user); int deleteUser(Long id); } ``` 3. Service Service 层是业务逻辑的处理层,它主要负责处理业务逻辑和调用 Mapper 层完成数据库操作。在 Service 层中,通常会定义以下内容: - 定义业务逻辑的方法 - 定义事务的管理方法 Service 层的示例代码如下: ``` @Service public class UserService { @Autowired private UserMapper userMapper; public User getUserById(Long id) { return userMapper.getUserById(id); } public int addUser(User user) { return userMapper.addUser(user); } public int updateUser(User user) { return userMapper.updateUser(user); } public int deleteUser(Long id) { return userMapper.deleteUser(id); } } ``` 以上就是 Spring Boot 中 EntityMapper 和 Service 三个层次的概述和示例代码。需要注意的是,为了让 MyBatis 自动扫描 Mapper 接口并实例化,需要在启动类上添加 @MapperScan 注解,如下所示: ``` @SpringBootApplication @MapperScan("com.example.demo.mapper") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 其中,com.example.demo.mapperMapper 所在的包路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值