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

发布时间 - 2026-01-11 02:51:36    点击率:

本文实例讲述了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程序设计有所帮助。


# java  # JDBC  # 动态创建  # 数据表  # SQL预处理  # MySQL创建数据库和创建数据表的操作过程  # mysql如何创建数据库并指定字符集  # MongoDB连接和创建数据库的方法讲解  # DataGrip连接Mysql并创建数据库的方法实现  # MySQL创建数据表并建立主外键关系详解  # 在Mysql上创建数据表实例代码  # sqlserver2005自动创建数据表和自动添加某个字段索引  # MySQL创建数据库和创建数据表  # 连接到  # 查询结果  # 配置文件  # 程序设计  # 是否存在  # 清空  # 操作技巧  # 导入到  # 相关内容  # 很难  # 感兴趣  # 数据结构  # 可以通过  # 给大家  # 考虑到  # 分页  # 自定义  # 用户提供  # 这两天  # 更多关于 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python高阶函数应用_函数作为参数说明【指导】  如何快速搭建高效WAP手机网站吸引移动用户?  如何在万网利用已有域名快速建站?  做企业网站制作流程,企业网站制作基本流程有哪些?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Java类加载基本过程详细介绍  如何用PHP工具快速搭建高效网站?  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  如何确认建站备案号应放置的具体位置?  晋江文学城电脑版官网 晋江文学城网页版直接进入  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Android中AutoCompleteTextView自动提示  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  php485函数参数是什么意思_php485各参数详细说明【介绍】  android nfc常用标签读取总结  如何在阿里云部署织梦网站?  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  Laravel如何配置任务调度?(Cron Job示例)  简历没回改:利用AI润色让你的文字更专业  如何在景安云服务器上绑定域名并配置虚拟主机?  高端建站三要素:定制模板、企业官网与响应式设计优化  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  linux写shell需要注意的问题(必看)  Laravel如何配置Horizon来管理队列?(安装和使用)  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  Java垃圾回收器的方法和原理总结  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  网站制作价目表怎么做,珍爱网婚介费用多少?  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  如何解决hover在ie6中的兼容性问题  如何用wdcp快速搭建高效网站?  微信推文制作网站有哪些,怎么做微信推文,急?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  使用Dockerfile构建java web环境  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  详解vue.js组件化开发实践  Swift中swift中的switch 语句  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  JavaScript如何实现类型判断_typeof和instanceof有什么区别  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  JavaScript数据类型有哪些_如何准确判断一个变量的类型  轻松掌握MySQL函数中的last_insert_id()  lovemo网页版地址 lovemo官网手机登录  如何使用 jQuery 正确渲染 Instagram 风格的标签列表