开发实用小工具-通过类自动创建数据库表,从此摆脱手动建表麻烦

Posted 沉默着忍受

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发实用小工具-通过类自动创建数据库表,从此摆脱手动建表麻烦相关的知识,希望对你有一定的参考价值。

通过类自动创建数据库表,从此摆脱手动建表麻烦

当我们在做java项目的时候当我们创建好一个类的时候,如果要创建对应的数据库存储多条信息,如果这个类的属性很多,怎么才能避免创建表的时候不会失误,或者减少工作量?我最近开发了一个自动创建类对应的数据库小工具 CreateTableUtil,源码见下面文章。下面我重点讲讲怎么使用。


文章目录


工具使用背景

项目数据库存储类信息,但是该类的属性有几十条之多,sql脚本建表,可以会发生错误,代码编写量很多,数据库连接工具建表,可以会缺少属性或数据类型错误,一个对应类,用户自定义生成数据库的小工具就显得十分重要。对于学生党来说,在毕业设计时,使用这个小工具 CreateTableUtil,可以极大的减少创建表时的出错概率。最重要的是节省时间!

一、引入CreateTableUtil需要的jdbc依赖

友情推荐我的文章:JDBC技术浅谈

1.1 使用Spring框架集成CreateTableUtil方式;

在pom.xml中引入如下依赖:

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
       <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

我们的工具主要是使用jdbc进行数据库连接。

1.1.1 在项目目录里创建util工具包;


1.在util工具包创建Createtableutil包
2.在Createtableutil包下创建Config类;

package com.vaccine.mywork.util.Createtableutil;

import lombok.Data;

@Data
public class Config 
    private int id;
    private String driverClassName="com.mysql.cj.jdbc.Driver";
    private String url="jdbc:mysql://localhost:3306/yourdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" ;
    private String username="root";
    private String password="root";
    

注意:我这里使用了lombok工具,如果你在使用的时候没有lombok工具,记得手动构建类

3.创建CreateTable实现类;

package com.vaccine.mywork.util.Createtableutil;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;

public class Createtable 
    //支持map通过K-v获取值
    private  List getClassInfo(Object o) 

        Field[] fields = o.getClass().getDeclaredFields();

        String[] fieldNames = new String[fields.length];

        List list = new ArrayList();

        Map infoMap = null;

        for (int i = 0; i < fieldNames.length; i++) 
            infoMap = new HashMap();

            infoMap.put("type", fields[i].getType().toString());

            infoMap.put("name", fields[i].getName());

            list.add(infoMap);
        
        return list;

    
    //获取类的属性名称
    private  String[] getClassdatatype(Object o)
        Field[] fields = o.getClass().getDeclaredFields();

        String[] fieldtypes = new String[fields.length];


        for (int i = 0; i < fieldtypes.length; i++) 
            fieldtypes[i] = fields[i].getType().toString();
        
        return fieldtypes;
    

    //获取类的属性类型
    private  String[] getClassdataName(Object o)
        Field[] fields = o.getClass().getDeclaredFields();

        String[] fieldNames = new String[fields.length];


        for (int i = 0; i < fieldNames.length; i++) 
            fieldNames[i] = fields[i].getName();
        
        return fieldNames;
    

    //自动生成sql语句
    public String createTablesql(String tablename,Object obs)
        //判断是否符合规范
        if(tablename.isEmpty()||obs==null)
            return "参数不完整";
        
        //获得类的属性名称
        String[] name = getClassdataName(obs);
        String[] type = getClassdatatype(obs);
        String sql ="create table if not exists "+tablename+"(";
        //转换数据类型
        for(int i = 0;i<type.length;i++)
            if(type[i].equals("class java.lang.String"))
                type[i] = "varchar(255)";
            
        
        for(int i = 0;i<name.length-1;i++)
            sql=sql+name[i]+" "+type[i]+",";
        
        sql=sql+name[name.length-1]+" "+type[name.length-1]+")";

      return sql;
    

    public static String createTable(Config config, String sql,String tablename) throws ClassNotFoundException, SQLException 
        Class.forName(config.getDriverClassName());
        String url = config.getUrl();
        String user=config.getUsername();
        String password = config.getPassword();
        Connection conn = DriverManager.getConnection(url, user, password);
        Statement st = conn.createStatement();
        //4. 执行sql
        st.executeUpdate(sql);//创建表
        String sql1 = "select * from "+tablename;
        int res =0;
        if(st.executeQuery(sql1)!=null)
            res=1;
        
        //5. 释放资源
        st.close();
        conn.close();
        return  res>0? "创建成功":"创建失败";
    

    public String createTableUtils(Object obs,String tablename) throws SQLException, ClassNotFoundException 
        if(obs!=null)
            Config config = new Config();
            Createtable con = new Createtable();
            String sql =  con.createTablesql(tablename,obs);
            System.out.println(sql);
            System.out.println(createTable(config,sql,tablename));
        
        return null;
    



1.2 无框架集成CreateTableUtil方式;

1.准备数据库驱动包,并添加到项目的依赖中:
在项目中创建文件夹lib,并将依赖包mysql-connector-java-5.1.47.jar复制到lib中。再配置该jar
包到本项目的依赖中:右键点击项目Open Module Settings,在Modules中,点击项目,配置
Dependencies,点击+,JARS or Directories,将该lib文件夹配置进依赖中,表示该文件夹下的
jar包都引入作为依赖。
文件目录参考:

mysql-connector-java-5.1.36jar包已经上传至GitHub,拿来即用!

2.需要手动实现Config构造;

package Createtableutil;

public class Config 
    private String driverClassName="com.mysql.cj.jdbc.Driver";
    private String url="jdbc:mysql://localhost:3306/vaccines?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" ;
    private String username="root";
    private String password="318422";

    public String getDriverClassName() 
        return driverClassName;
    

    public String getUrl() 
        return url;
    

    public String getUsername() 
        return username;
    

    public String getPassword() 
        return password;
    



二、使用步骤

2.1 创建一个实例类

为了展示CreateTableUtil功能的强大,我创建一个超多属性的类;

package com.vaccine.mywork.model;

import com.vaccine.mywork.util.Createtableutil.Createtable;
import lombok.Data;
import java.sql.SQLException;
@Data
public class Vaccine 
    private  int id;
    private  String vaccid; //疫苗编号
    private  String name; //疫苗名称
    private  String type; //疫苗种类
    private  String temp1; //存储温度
    private  String temp2; //运输温度
    private  int coldroomid; //冷库id
    private String createtime; //生产时间
    private String keep; //保质期
    private String shop; //生产商
    private String intoroomtime; //入库时间
    private String rootid; //管理员id
    private String guige; //疫苗规格
    private int price; //疫苗价格
    private String desction; //描述
    private String canperson; //接种人群
    private String body; //接种部位
    private String way; //接种流程
    private String usefultime; //有效期
    private String warn; //备注


2.2 在这个类创建main方法,开始调用工具;

  public static void main(String[] args) throws SQLException, ClassNotFoundException 
        Vaccine  vaccine= new Vaccine();//创建需要创建数据库的实体类
        Createtable con = new Createtable(); //创建工具类
        con.createTableUtils(vaccine,"vaccdb");
        //第一个参数是需要创建数据库的类,第二个参数是设置该表的名称;
    

3.3 运行main方法,并且查看数据库中是否创建好表;



自动生成的sql语句:

create table if not exists vaccdb(id int,vaccid varchar(255),name varchar(255),type varchar(255),temp1 varchar(255),temp2 varchar(255),coldroomid int,createtime varchar(255),keep varchar(255),shop varchar(255),intoroomtime varchar(255),rootid varchar(255),guige varchar(255),price int,desction varchar(255),canperson varchar(255),body varchar(255),way varchar(255),usefultime varchar(255),warn varchar(255))
创建成功

总结

该工具主要借助与jdbc和java类的反射机制实现,我只是站在前人的基础上开发出的这个自动生成数据库表的工具;项目还需优化,比如在自动生成sql语句我目前只处理了String转varchar,像Date类型并没有转换,而且没有设置主键和给予项目真实数据长度;需要通过你的项目需求修改; 只需要修改Createtable类中的createTablesql方法即可;
//自动生成sql语句
    public String createTablesql(String tablename,Object obs)
        //判断是否符合规范
        if(tablename.isEmpty()||obs==null)
            return "参数不完整";
        
        //获得类的属性名称
        String[] name = getClassdataName(obs);
        String[] type = getClassdatatype(obs);
        String sql ="create table if not exists "+tablename+"(";
        //转换数据类型
        for(int i = 0;i<type.length;i++)
            if(type[i].equals("class java.lang.String"))
                type[i] = "varchar(255)";
            
        
        for(int i = 0;i<name.length-1;i++)
            sql=sql+name[i]+" "+type[i]+",";
        
        sql=sql+name[name.length-1]+" "+type[name.length-1]+")";

      return sql;
    

以上是关于开发实用小工具-通过类自动创建数据库表,从此摆脱手动建表麻烦的主要内容,如果未能解决你的问题,请参考以下文章

开发实用小工具-通过类自动创建数据库表,从此摆脱手动建表麻烦

自动化部署工具jenkins,从此摆脱重复单调的工作

学会这几个Excel小技巧,加班从此对你说拜拜~

Bootstrap学习-响应式工具

Bootstrap学习-响应式工具

7G Vue.js 教程,55集从基础到2.0,简单灵活易上手,项目开发实用款!