本文实例讲述了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
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- Java 中常见的比较操作符有哪些?(Java比较操作符有哪些)
- 在 Java 中,Integer 究竟有哪些作用呢?(java中integer的作用是什么)
- Java 实体类如何进行赋值操作?(java实体类怎么赋值)
- Java 中 switch case 的具体用法有哪些?(switchcase在java中的用法)
- 如何在 Java EMqtt 中实现消息确认机制?(Java EMqtt怎样实现消息确认机制)
- Java 性能调优的有效手段有哪些?(Java性能调优有何有效手段)
- 探讨Uncomtrade数据库的安全防护措施
- Java 如何获取某个接口的实现类?(Java怎么获取某个接口的实现类)
- Java中如何正确使用 collections.shuffle 方法?(Java中collections.shuffle怎么使用)
- Java Swing 中常用的布局有哪些?(java swing常用布局有哪些)
猜你喜欢
AI推送时光机java使用JDBC动态创建数据表及SQL预处理的方法
后端开发2023-05-31
咦!没有更多了?去看看其它编程学习网 内容吧