1. 程式人生 > >JDBC 動態建立資料表 及 SQL預處理

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