Java如何使用JDBC动态创建数据表及SQL预处理的示例
本文实例讲述了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
Atas ialah kandungan terperinci Java如何使用JDBC动态创建数据表及SQL预处理的示例. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas





Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4

Java ialah bahasa pengaturcaraan popular yang boleh dipelajari oleh pembangun pemula dan berpengalaman. Tutorial ini bermula dengan konsep asas dan diteruskan melalui topik lanjutan. Selepas memasang Kit Pembangunan Java, anda boleh berlatih pengaturcaraan dengan mencipta program "Hello, World!" Selepas anda memahami kod, gunakan gesaan arahan untuk menyusun dan menjalankan program, dan "Hello, World!" Pembelajaran Java memulakan perjalanan pengaturcaraan anda, dan apabila penguasaan anda semakin mendalam, anda boleh mencipta aplikasi yang lebih kompleks.
