文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-05-31 07:30

关注

本文实例讲述了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;    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());    }  }    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());    }  }    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;  }    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;  }    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;  }    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());      }  }     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;  //返回所建立的数据库连接  }    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;  }    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;  }    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"));  }}

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯