当前位置: 移动技术网 > IT编程>开发语言>Java > java使用JDBC动态创建数据表及SQL预处理的方法

java使用JDBC动态创建数据表及SQL预处理的方法

2019年07月19日  | 移动技术网IT编程  | 我要评论

本文实例讲述了java使用jdbc动态创建数据表及sql预处理的方法。分享给大家供大家参考,具体如下:

这两天由于公司的需求,客户需要自定义数据表的字段,导致每张表的字段都不是固定的而且很难有一个通用的模板去维护,所以就使用jdbc动态去创建数据表,然后通过表的字段动态添加数据,数据的来源主要是用户提供的excel直接导入到数据库中。

如果考虑到字段的类型,可以通过反射的机制去获取,现在主要用户需求就是将数据导入到数据库提供查询功能,不能修改,所以就直接都使用string类型来处理数据更加便捷。

import java.sql.connection;
import java.sql.drivermanager;
import java.sql.preparedstatement;
import java.sql.resultset;
import java.sql.sqlexception;
import java.util.arraylist;
import java.util.list;
import java.util.propertyresourcebundle;
import java.util.resourcebundle;
public class databasesql {
 //配置文件 读取jdbc的配置文件
 private static resourcebundle bundle = propertyresourcebundle.getbundle("db");
 private static connection conn;
 private static preparedstatement ps;
  /**
   * 创建表
   * @param tabname 表名称
   * @param tab_fields 表字段
   */
  public static void createtable(string tabname,string[] tab_fields) {
    conn = getconnection();  // 首先要获取连接,即连接到数据库
    try {
      string sql = "create table "+tabname+"(id int auto_increment primary key not null";
      if(tab_fields!=null&&tab_fields.length>0){
        sql+=",";
        int length = tab_fields.length;
        for(int i =0 ;i<length;i++){
          //添加字段
          sql+=tab_fields[i].trim()+" varchar(50)";
          //防止最后一个,
          if(i<length-1){
            sql+=",";
          }
        }
      }
      //拼凑完 建表语句 设置默认字符集
      sql+=")default charset=utf8;";
      system.out.println("建表语句是:"+sql);
      ps = conn.preparestatement(sql);
      ps.executeupdate(sql);
      ps.close();
      conn.close();  //关闭数据库连接
    } catch (sqlexception e) {
      system.out.println("建表失败" + e.getmessage());
    }
  }
  /**
   * 添加数据
   * @param tabname 表名
   * @param fields 参数字段
   * @param data 参数字段数据
   */
  public static void insert(string tabname,string[] fields,string[] data) {
    conn = getconnection();  // 首先要获取连接,即连接到数据库
    try {
      string sql = "insert into "+tabname+"(";
      int length = fields.length;
      for(int i=0;i<length;i++){
        sql+=fields[i];
        //防止最后一个,
        if(i<length-1){
          sql+=",";
        }
      }
      sql+=") values(";
      for(int i=0;i<length;i++){
        sql+="?";
        //防止最后一个,
        if(i<length-1){
          sql+=",";
        }
      }
      sql+=");";
      system.out.println("添加数据的sql:"+sql);
      //预处理sql 防止注入
      excuteps(sql,length,data);
      //执行
      ps.executeupdate();
      //关闭流
      ps.close();
      conn.close();  //关闭数据库连接
    } catch (sqlexception e) {
      system.out.println("添加数据失败" + e.getmessage());
    }
  }
  /**
   * 查询表 【查询结果的顺序要和数据库字段的顺序一致】
   * @param tabname 表名
   * @param fields 参数字段
   * @param data 参数字段数据
   * @param tab_fields 数据库的字段
   */
  public static string[] query(string tabname,string[] fields,string[] data,string[] tab_fields){
    conn = getconnection();  // 首先要获取连接,即连接到数据库
    string[] result = null;
    try {
      string sql = "select * from "+tabname+" where ";
       int length = fields.length;
       for(int i=0;i<length;i++){
          sql+=fields[i]+" = ? ";
          //防止最后一个,
          if(i<length-1){
            sql+=" and ";
          }
       }
       sql+=";";
       system.out.println("查询sql:"+sql);
      //预处理sql 防止注入
      excuteps(sql,length,data);
      //查询结果集
      resultset rs = ps.executequery();
      //存放结果集
      result = new string[tab_fields.length];
      while(rs.next()){
          for (int i = 0; i < tab_fields.length; i++) {
            result[i] = rs.getstring(tab_fields[i]);
          }
        }
      //关闭流
      rs.close();
      ps.close();
      conn.close();  //关闭数据库连接
    } catch (sqlexception e) {
       system.out.println("查询失败" + e.getmessage());
    }
    return result;
  }
  /**
   * 获取某张表总数
   * @param tabname
   * @return
   */
  public static integer getcount(string tabname){
    int count = 0;
     conn = getconnection();  // 首先要获取连接,即连接到数据库
     try {
      string sql = "select count(*) from "+tabname+" ;";
       ps = conn.preparestatement(sql);
       resultset rs = ps.executequery();
       while(rs.next()){
         count = rs.getint(1);
        }
       rs.close();
       ps.close();
       conn.close();  //关闭数据库连接
    } catch (sqlexception e) {
       system.out.println("获取总数失败" + e.getmessage());
    }
    return count;
  }
  /**
   * 后台分页显示
   * @param tabname
   * @param pageno
   * @param pagesize
   * @param tab_fields
   * @return
   */
  public static list<string[]> queryforpage(string tabname,int pageno,int pagesize ,string[] tab_fields){
    conn = getconnection();  // 首先要获取连接,即连接到数据库
    list<string[]> list = new arraylist<string[]>();
    try {
      string sql = "select * from "+tabname+" limit ?,? ; ";
       system.out.println("查询sql:"+sql);
       //预处理sql 防止注入
       ps = conn.preparestatement(sql);
       //注入参数
       ps.setint(1,pageno);
       ps.setint(2,pagesize);
      //查询结果集
      resultset rs = ps.executequery();
      //存放结果集
      while(rs.next()){
         string[] result = new string[tab_fields.length];
          for (int i = 0; i < tab_fields.length; i++) {
            result[i] = rs.getstring(tab_fields[i]);
          }
         list.add(result);
        }
      //关闭流
      rs.close();
      ps.close();
      conn.close();  //关闭数据库连接
    } catch (sqlexception e) {
       system.out.println("查询失败" + e.getmessage());
    }
    return list;
  }
  /**
   * 清空表数据
   * @param tabname 表名称
   */
  public static void delete(string tabname){
      conn = getconnection();  // 首先要获取连接,即连接到数据库
      try {
        string sql = "delete from "+tabname+";";
        system.out.println("删除数据的sql:"+sql);
        //预处理sql 防止注入
        ps = conn.preparestatement(sql);
        //执行
        ps.executeupdate();
        //关闭流
        ps.close();
        conn.close();  //关闭数据库连接
      } catch (sqlexception e) {
        system.out.println("删除数据失败" + e.getmessage());
      }
  }
  /**
   * 用于注入参数
   * @param ps
   * @param data
   * @throws sqlexception
   */
   private static void excuteps(string sql,int length,string[] data) throws sqlexception{
     //预处理sql 防止注入
     ps = conn.preparestatement(sql);
     //注入参数
     for(int i=0;i<length;i++){
       ps.setstring(i+1,data[i]);
     }
   }
   /* 获取数据库连接的函数*/
  private static connection getconnection() {
    connection con = null;  //创建用于连接数据库的connection对象
    try {
        class.forname(bundle.getstring("db.classname"));// 加载mysql数据驱动
        con = drivermanager.getconnection(bundle.getstring("db.url"), bundle.getstring("db.username"), bundle.getstring("db.password"));// 创建数据连接
    } catch (exception e) {
        system.out.println("数据库连接失败" + e.getmessage());
    }
    return con;  //返回所建立的数据库连接
  }
  /**
   * 判断表是否存在
   * @param tabname
   * @return
   */
  public static boolean exittable(string tabname){
    boolean flag = false;
     conn = getconnection();  // 首先要获取连接,即连接到数据库
     try {
       string sql = "select id from "+tabname+";";
       //预处理sql 防止注入
       ps = conn.preparestatement(sql);
       //执行
       flag = ps.execute();
       //关闭流
       ps.close();
       conn.close();  //关闭数据库连接
     } catch (sqlexception e) {
       system.out.println("删除数据失败" + e.getmessage());
     }
    return flag;
  }
  /**
   * 删除数据表
   * 如果执行成功则返回false
   * @param tabname
   * @return
   */
  public static boolean droptable(string tabname){
    boolean flag = true;
     conn = getconnection();  // 首先要获取连接,即连接到数据库
       try {
         string sql = "drop table "+tabname+";";
         //预处理sql 防止注入
         ps = conn.preparestatement(sql);
         //执行
         flag = ps.execute();
         //关闭流
         ps.close();
         conn.close();  //关闭数据库连接
       } catch (sqlexception e) {
         system.out.println("删除数据失败" + e.getmessage());
       }
      return flag;
  }
  /**
   * 测试方法
   * @param args
   */
  public static void main(string[] args) {
    //建表===========================================
    //表名
//    string tabname = "mytable";
    //表字段
//    string[] tab_fields = {"name","password","sex","age"};
    //创建表
//    createtable(tabname, tab_fields);
    //添加===========================================
    //模拟数据
//    string[] data1 = {"jack","123456","男","25"};
//    string[] data2 = {"tom","456789","女","20"};
//    string[] data3 = {"mark","aaa","哈哈","21"};
    //插入数据
//    insert(tabname, tab_fields, data1);
//    insert(tabname, tab_fields, data2);
//    insert(tabname, tab_fields, data3);
    //查询=============================================
//    string[] q_fileds ={"name","sex"};
//    string[] data4 = {"jack","男"};
//
//    string[] result = query(tabname, q_fileds, data4, tab_fields);
//    for (string string : result) {
//      system.out.println("结果:\t"+string);
//    }
    //删除 清空=============================================
//    delete(tabname);
    //是否存在
//    system.out.println(exittable("mytable"));
    //删除表
//    system.out.println(droptable("mytable"));
  }
}

数据库的配置文件 db.properties

db.username=root
db.password=root
db.classname=com.mysql.jdbc.driver
db.url = jdbc:mysql://localhost:3306/test?useunicode=true&characterencoding=utf-8&zerodatetimebehavior=converttonull

更多关于java相关内容感兴趣的读者可查看本站专题:《java+mysql数据库程序设计总结》、《java数据结构与算法教程》、《java文件与目录操作技巧汇总》、《java操作dom节点技巧总结》和《java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网