传入参数自动生成数据库(简易学习版)

今天由于业务要求,写了一个自动生成数据库,其实网上一大堆,但有些不适用,cv多了自己也能写点东西了,仔细琢磨了一下,我打算从sql语句入手,也就是通过拼接sql语句然后执行sql语句就可以实现,这里我并没考虑不到sql注入的问题,毕竟是简易版,但为了满足需求后续会继续更新这部分代码,废话不多说了,步入正题。

直接上代码,写了一部分注解

public class GenSqlUtil {
    static Connection con = null;
    static String url = "jdbc:mysql://localhost:3306/auto_system?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC";
    static String user = "root";
    static String word = "123456";
    static String driver = "com.mysql.cj.jdbc.Driver";
    static PreparedStatement stmt;

    public static void genSql(String tableName, Map<String, Object> map) {
        StringBuilder sql = new StringBuilder();
        //取出键
        Set set = map.keySet();
        int flag = 0;
        int addFlag = 0;
        //判断数据库是否存在表  如果存在
        if (validateTableNameExist(tableName)) {
            for (Iterator iter = set.iterator(); iter.hasNext(); ) {
                String key = (String) iter.next();
                if (key == "id") {
                    Integer id = (Integer) map.get(key);
                    String selSql = "select * from " + tableName + " where id = " + id;

                    try {
                        Class.forName(driver);
                        con = DriverManager.getConnection(url, user, word);
                        stmt = con.prepareStatement(selSql);
                        ResultSet rsColumn = stmt.executeQuery(selSql);
                        ResultSetMetaData data = rsColumn.getMetaData();
                        if (rsColumn.next()) {
                            //组成update更新语句
                            sql.append("update " + tableName + " set ");
                            for (Iterator iters = set.iterator(); iters.hasNext(); ) {

                                String keys = (String) iters.next();
                                if (keys != "id") {
                                    String value = (String) map.get(keys);
                                    sql.append(keys + " = " + "'" + value + "'" + " ");
                                    flag++;
                                    if (flag < set.size() - 1)
                                        sql.append(",");
                                }
                            }
                            sql.append(" where id = " + map.get("id"));

                            con = DriverManager.getConnection(url, user, word);
                            stmt = con.prepareStatement(sql.toString());
                            stmt.execute(sql.toString());
                            System.out.println(sql);
                        } else {
                            //组成insert更新语句
                            sql.append("insert into " + tableName + "(");
                            for (Iterator iterss = set.iterator(); iterss.hasNext(); ) {
                                String keyss = (String) iterss.next();
                                if (keyss != "id") {
                                    flag++;
                                    sql.append(keyss);
                                    if (flag < set.size() - 1) {
                                        sql.append(", ");
                                    } else {
                                        sql.append(")");
                                    }
                                }
                            }
                            sql.append(" values(");
                            for (Iterator itersss = set.iterator(); itersss.hasNext(); ) {
                                String keysss = (String) itersss.next();

                                if (keysss != "id") {
                                    String valuesss = (String) map.get(keysss);
                                    sql.append("'" + valuesss +"'");
                                    addFlag++;
                                    if (addFlag < set.size() - 1)
                                        sql.append(", ");
                                    else
                                        sql.append(")");
                                }
                            }
                            System.out.println(sql);
                            con = DriverManager.getConnection(url, user, word);
                            stmt = con.prepareStatement(sql.toString());
                            stmt.execute(sql.toString());

                        }
                    } catch (ClassNotFoundException | SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        } else {
            //如果不存在就建表 组成create语句
            sql.append("create table " + tableName + " (");

            for (Iterator idIter = set.iterator(); idIter.hasNext(); ) {
                String key = (String) idIter.next();
                if (key == "id")
                {
                    Integer id = (Integer) map.get("id");
                    sql.append(key + " int NOT NULL AUTO_INCREMENT, ");
                }
            }
            for (Iterator iter = set.iterator(); iter.hasNext(); ) {
                String key = (String) iter.next();
                if (key != "id") {
                    sql.append(key + " varchar(255) DEFAULT NULL,");
                }
            }
            sql.append("PRIMARY KEY(id))");
            System.out.println(sql);
            try {
                //执行sql语句三要素
                con = DriverManager.getConnection(url, user, word);
                stmt = con.prepareStatement(sql.toString());
                stmt.execute(sql.toString());
                genSql(tableName,map);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

        }
    }


    public static boolean validateTableNameExist(String tableName) {
        // 数据源配置
        try {
            String sql = "select * from " + tableName;
            PreparedStatement stmt;
            Class.forName(driver);
            con = DriverManager.getConnection(url, user, word);
            ResultSet rs = con.getMetaData().getTables(null, null, tableName, null);
            if (rs.next()) {
                stmt = con.prepareStatement(sql);
                ResultSet rsColumn = stmt.executeQuery(sql);
                ResultSetMetaData data = rsColumn.getMetaData();
                Map<String, Object> columns = new HashMap<>();
                for (int i = 1; i <= data.getColumnCount(); i++) {
                    // 获得所有列的数目及实际列数
                    int columnCount = data.getColumnCount();
                    // 获得指定列的列名
                    String columnName = data.getColumnName(i);
                    // 获得指定列的列值
                    columns.put(columnName, columnName);
                    int columnType = data.getColumnType(i);
                    // 获得指定列的数据类型名
                    String columnTypeName = data.getColumnTypeName(i);
                    // 所在的Catalog名字
                    String catalogName = data.getCatalogName(i);
                    // 对应数据类型的类
                    String columnClassName = data.getColumnClassName(i);
                    // 在数据库中类型的最大字符个数
                    int columnDisplaySize = data.getColumnDisplaySize(i);
                    // 默认的列的标题
                    String columnLabel = data.getColumnLabel(i);
                    // 获得列的模式
                    String schemaName = data.getSchemaName(i);
                    // 某列类型的精确度(类型的长度)
                    int precision = data.getPrecision(i);
                    // 小数点后的位数
                    int scale = data.getScale(i);
                    // 获取某列对应的表名
                    String tablesName = data.getTableName(i);
                    // 是否自动递增
                    boolean isAutoInctement = data.isAutoIncrement(i);
                    // 在数据库中是否为货币型
                    boolean isCurrency = data.isCurrency(i);
                    // 是否为空
                    int isNullable = data.isNullable(i);
                    // 是否为只读
                    boolean isReadOnly = data.isReadOnly(i);
                    // 能否出现在where中
                    boolean isSearchable = data.isSearchable(i);
                }
                return true;
            } else {
                return false;
            }
        } catch (SQLException | ClassNotFoundException troubles) {
            troubles.printStackTrace();
            return false;
        }

    }

    public static void genSqlFace(String tableName,Map<String,Object> map) {

//        String tableName = "acd";
//        Map<String, Object> map = new HashMap<>();
//        map.put("id", 1);
//        map.put("name", "ysy");
//        map.put("sex", "man");
//        map.put("age", "18");
//        map.put("score", "100");
         genSql(tableName, map);

    }

}

由于我的业务需求是需要传值进入调用这个类方法,所以才多此一举写了一个face方法来接参数,代码中有些逻辑比较复杂,所以一时半会我也没有转过来,可能就会出现一些多余的代码段,考虑到后期可能会用到一些获取数据信息的代码,可供参考。

调用这个方法

 public DataResponse genAuto(Map<String,Object> params){
        String tableName = (String) params.get("tableName");
        params.remove("tableName");
        GenSqlUtil.genSqlFace(tableName,params);
        GenMainUtil.genMainFace(tableName);
        return new DataResponse().defaultOperationResponse(BizSuccessEnum.BUSINESS_OPERATE_SUCCESS.getMessage());
    }

这个是我在service层写的方法,将数据在一个封装进入hashmap,返回值类型是我自定义的一个类,是一个前辈传授与我,我还没吃透,等吃透了会专门写一篇解析的博客

接下来是我的controller层了

 @PostMapping("/test")
    public DataResponse generators (@RequestBody Map<String,Object> params){
        DataResponse dataResponse = acdService.genAuto(params);
        return dataResponse;
    }

打开邮递男孩postman,测试一波

在这里插入图片描述
封装json的数据传入接口,此时数据库内并没有testTable这张表,于是根据代码逻辑,需要执行create和insert方法
执行的语句会在控制台输出
在这里插入图片描述
语句执行完毕,打开navicat看一波
在这里插入图片描述
表在
在这里插入图片描述
数据在

邮递男孩postman返回
在这里插入图片描述
我的DataResponse类返回的数据就是这些

这段代码可以用来学习sql语句、执行sql,可以直接cv下来用,传入的参数在face中注释掉了,对简单单表可直接使用,由于字段使用hashmap存储的,目前只能确保id是在第一列,其他的就得看hashcode值了,后续我会继续更新这一块的内容,让代码更加完善。有问题可以留言交流哦。

我是飞扬,专注于写bug的程序猿

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
博客地址:http://blog.csdn.net/vipbooks 一直以来根据数据库表结构自动生成JavaBean、自动生成MyBaits的Mapper映射配置文件、自动生成数据库设计文档都是一件让人很头痛的事情,既浪费时间又很繁琐,看着几十上百个表的成千上万个字段,真是一件让人痛苦的事情。 我们也想过很多办法解决这个问题,包括用MyEclipse连接数据库生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括表和表字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不干净,配置非常繁琐等等问题。 于是一怒之下,自己动手丰衣足食,于是就自己用Swing写了一个基于数据库自动化生成工具,支持MySQL、Oracle、SQLServce、PostgreSQL四种数据库,支持Window、Linux、MacBook等多个作系统,完美支持JPA注解,可以同时生成Entity和DTO等,可以自动去除表前缀,支持单个和批量生成JavaBean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有注释了。更重要的是还能自动生成数据库设计文档和MyBaits的Mapper映射配置文件,如果有多个数据源还能批量生成,使用非常方便。 所有的配置都保存在本地,只要配置过一次,下次使用的时候完全可以秒生成JavaBean、MyBaits的Mapper映射配置文件和数据库设计文档,并且还集成各种实用工具,使得工作效率瞬间爆棚,生产力瞬间爆表! TableGo v5.8.0更新震撼发布,此次本更新如下: 1、新增自定义文件功能,可以自己编写模板生成任意代码的文件。 2、新增数据源配置自动生成功能,项目分库分表不用愁,一次搞定所有数据源。 3、公共参数界面新增表别名和是否目录直通的配置。 4、生成Bean界面新增是否生成字段注释和重写equals,hashCode,toString方法的配置。 5、MyBatis配置界面新增根据所有字段条件查询数据的选项。 6、新增TableGo使用说明书。 7、更新数据库驱动本,新的驱动可能不支持JDK8以下的本。 8、修复了大量的Bug并进行了一些优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值