java使用JDBC動(dòng)態(tài)創(chuàng)建數(shù)據(jù)表及SQL預(yù)處理的方法

本文實(shí)例講述了java使用JDBC動(dòng)態(tài)創(chuàng)建數(shù)據(jù)表及SQL預(yù)處理的方法。分享給大家供大家參考,具體如下:

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、土默特右旗ssl等。為近1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的土默特右旗網(wǎng)站制作公司

這兩天由于公司的需求,客戶需要自定義數(shù)據(jù)表的字段,導(dǎo)致每張表的字段都不是固定的而且很難有一個(gè)通用的模板去維護(hù),所以就使用JDBC動(dòng)態(tài)去創(chuàng)建數(shù)據(jù)表,然后通過表的字段動(dòng)態(tài)添加數(shù)據(jù),數(shù)據(jù)的來源主要是用戶提供的Excel直接導(dǎo)入到數(shù)據(jù)庫中。

如果考慮到字段的類型,可以通過反射的機(jī)制去獲取,現(xiàn)在主要用戶需求就是將數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫提供查詢功能,不能修改,所以就直接都使用String類型來處理數(shù)據(jù)更加便捷。

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;
  /**
   * 創(chuàng)建表
   * @param tabName 表名稱
   * @param tab_fields 表字段
   */
  public static void createTable(String tabName,String[] tab_fields) {
    conn = getConnection();  // 首先要獲取連接,即連接到數(shù)據(jù)庫
    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)";
          //防止最后一個(gè),
          if(i<length-1){
            sql+=",";
          }
        }
      }
      //拼湊完 建表語句 設(shè)置默認(rèn)字符集
      sql+=")DEFAULT CHARSET=utf8;";
      System.out.println("建表語句是:"+sql);
      ps = conn.prepareStatement(sql);
      ps.executeUpdate(sql);
      ps.close();
      conn.close();  //關(guān)閉數(shù)據(jù)庫連接
    } catch (SQLException e) {
      System.out.println("建表失敗" + e.getMessage());
    }
  }
  /**
   * 添加數(shù)據(jù)
   * @param tabName 表名
   * @param fields 參數(shù)字段
   * @param data 參數(shù)字段數(shù)據(jù)
   */
  public static void insert(String tabName,String[] fields,String[] data) {
    conn = getConnection();  // 首先要獲取連接,即連接到數(shù)據(jù)庫
    try {
      String sql = "insert into "+tabName+"(";
      int length = fields.length;
      for(int i=0;i<length;i++){
        sql+=fields[i];
        //防止最后一個(gè),
        if(i<length-1){
          sql+=",";
        }
      }
      sql+=") values(";
      for(int i=0;i<length;i++){
        sql+="?";
        //防止最后一個(gè),
        if(i<length-1){
          sql+=",";
        }
      }
      sql+=");";
      System.out.println("添加數(shù)據(jù)的sql:"+sql);
      //預(yù)處理SQL 防止注入
      excutePs(sql,length,data);
      //執(zhí)行
      ps.executeUpdate();
      //關(guān)閉流
      ps.close();
      conn.close();  //關(guān)閉數(shù)據(jù)庫連接
    } catch (SQLException e) {
      System.out.println("添加數(shù)據(jù)失敗" + e.getMessage());
    }
  }
  /**
   * 查詢表 【查詢結(jié)果的順序要和數(shù)據(jù)庫字段的順序一致】
   * @param tabName 表名
   * @param fields 參數(shù)字段
   * @param data 參數(shù)字段數(shù)據(jù)
   * @param tab_fields 數(shù)據(jù)庫的字段
   */
  public static String[] query(String tabName,String[] fields,String[] data,String[] tab_fields){
    conn = getConnection();  // 首先要獲取連接,即連接到數(shù)據(jù)庫
    String[] result = null;
    try {
      String sql = "select * from "+tabName+" where ";
       int length = fields.length;
       for(int i=0;i<length;i++){
          sql+=fields[i]+" = ? ";
          //防止最后一個(gè),
          if(i<length-1){
            sql+=" and ";
          }
       }
       sql+=";";
       System.out.println("查詢sql:"+sql);
      //預(yù)處理SQL 防止注入
      excutePs(sql,length,data);
      //查詢結(jié)果集
      ResultSet rs = ps.executeQuery();
      //存放結(jié)果集
      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]);
          }
        }
      //關(guān)閉流
      rs.close();
      ps.close();
      conn.close();  //關(guān)閉數(shù)據(jù)庫連接
    } catch (SQLException e) {
       System.out.println("查詢失敗" + e.getMessage());
    }
    return result;
  }
  /**
   * 獲取某張表總數(shù)
   * @param tabName
   * @return
   */
  public static Integer getCount(String tabName){
    int count = 0;
     conn = getConnection();  // 首先要獲取連接,即連接到數(shù)據(jù)庫
     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();  //關(guān)閉數(shù)據(jù)庫連接
    } catch (SQLException e) {
       System.out.println("獲取總數(shù)失敗" + e.getMessage());
    }
    return count;
  }
  /**
   * 后臺(tái)分頁顯示
   * @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();  // 首先要獲取連接,即連接到數(shù)據(jù)庫
    List<String[]> list = new ArrayList<String[]>();
    try {
      String sql = "select * from "+tabName+" LIMIT ?,? ; ";
       System.out.println("查詢sql:"+sql);
       //預(yù)處理SQL 防止注入
       ps = conn.prepareStatement(sql);
       //注入?yún)?shù)
       ps.setInt(1,pageNo);
       ps.setInt(2,pageSize);
      //查詢結(jié)果集
      ResultSet rs = ps.executeQuery();
      //存放結(jié)果集
      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);
        }
      //關(guān)閉流
      rs.close();
      ps.close();
      conn.close();  //關(guān)閉數(shù)據(jù)庫連接
    } catch (SQLException e) {
       System.out.println("查詢失敗" + e.getMessage());
    }
    return list;
  }
  /**
   * 清空表數(shù)據(jù)
   * @param tabName 表名稱
   */
  public static void delete(String tabName){
      conn = getConnection();  // 首先要獲取連接,即連接到數(shù)據(jù)庫
      try {
        String sql = "delete from "+tabName+";";
        System.out.println("刪除數(shù)據(jù)的sql:"+sql);
        //預(yù)處理SQL 防止注入
        ps = conn.prepareStatement(sql);
        //執(zhí)行
        ps.executeUpdate();
        //關(guān)閉流
        ps.close();
        conn.close();  //關(guān)閉數(shù)據(jù)庫連接
      } catch (SQLException e) {
        System.out.println("刪除數(shù)據(jù)失敗" + e.getMessage());
      }
  }
  /**
   * 用于注入?yún)?shù)
   * @param ps
   * @param data
   * @throws SQLException
   */
   private static void excutePs(String sql,int length,String[] data) throws SQLException{
     //預(yù)處理SQL 防止注入
     ps = conn.prepareStatement(sql);
     //注入?yún)?shù)
     for(int i=0;i<length;i++){
       ps.setString(i+1,data[i]);
     }
   }
   /* 獲取數(shù)據(jù)庫連接的函數(shù)*/
  private static Connection getConnection() {
    Connection con = null;  //創(chuàng)建用于連接數(shù)據(jù)庫的Connection對(duì)象
    try {
        Class.forName(bundle.getString("db.classname"));// 加載MySQL數(shù)據(jù)驅(qū)動(dòng)
        con = DriverManager.getConnection(bundle.getString("db.url"), bundle.getString("db.username"), bundle.getString("db.password"));// 創(chuàng)建數(shù)據(jù)連接
    } catch (Exception e) {
        System.out.println("數(shù)據(jù)庫連接失敗" + e.getMessage());
    }
    return con;  //返回所建立的數(shù)據(jù)庫連接
  }
  /**
   * 判斷表是否存在
   * @param tabName
   * @return
   */
  public static boolean exitTable(String tabName){
    boolean flag = false;
     conn = getConnection();  // 首先要獲取連接,即連接到數(shù)據(jù)庫
     try {
       String sql = "select id from "+tabName+";";
       //預(yù)處理SQL 防止注入
       ps = conn.prepareStatement(sql);
       //執(zhí)行
       flag = ps.execute();
       //關(guān)閉流
       ps.close();
       conn.close();  //關(guān)閉數(shù)據(jù)庫連接
     } catch (SQLException e) {
       System.out.println("刪除數(shù)據(jù)失敗" + e.getMessage());
     }
    return flag;
  }
  /**
   * 刪除數(shù)據(jù)表
   * 如果執(zhí)行成功則返回false
   * @param tabName
   * @return
   */
  public static boolean dropTable(String tabName){
    boolean flag = true;
     conn = getConnection();  // 首先要獲取連接,即連接到數(shù)據(jù)庫
       try {
         String sql = "drop table "+tabName+";";
         //預(yù)處理SQL 防止注入
         ps = conn.prepareStatement(sql);
         //執(zhí)行
         flag = ps.execute();
         //關(guān)閉流
         ps.close();
         conn.close();  //關(guān)閉數(shù)據(jù)庫連接
       } catch (SQLException e) {
         System.out.println("刪除數(shù)據(jù)失敗" + e.getMessage());
       }
      return flag;
  }
  /**
   * 測(cè)試方法
   * @param args
   */
  public static void main(String[] args) {
    //建表===========================================
    //表名
//    String tabName = "mytable";
    //表字段
//    String[] tab_fields = {"name","password","sex","age"};
    //創(chuàng)建表
//    createTable(tabName, tab_fields);
    //添加===========================================
    //模擬數(shù)據(jù)
//    String[] data1 = {"jack","123456","男","25"};
//    String[] data2 = {"tom","456789","女","20"};
//    String[] data3 = {"mark","aaa","哈哈","21"};
    //插入數(shù)據(jù)
//    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("結(jié)果:\t"+string);
//    }
    //刪除 清空=============================================
//    delete(tabName);
    //是否存在
//    System.out.println(exitTable("mytable"));
    //刪除表
//    System.out.println(dropTable("mytable"));
  }
}

數(shù)據(jù)庫的配置文件 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

更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java+MySQL數(shù)據(jù)庫程序設(shè)計(jì)總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java文件與目錄操作技巧匯總》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》和《Java緩存操作技巧匯總》

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

分享標(biāo)題:java使用JDBC動(dòng)態(tài)創(chuàng)建數(shù)據(jù)表及SQL預(yù)處理的方法
當(dāng)前網(wǎng)址:http://muchs.cn/article14/ihgege.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、定制網(wǎng)站、軟件開發(fā)、虛擬主機(jī)網(wǎng)站設(shè)計(jì)、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)