java使用JDBC动态创建数据表及SQL预处理的方法
程序员文章站
2024-02-20 12:29:52
本文实例讲述了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
更多关于java相关内容感兴趣的读者可查看本站专题:《java+mysql数据库程序设计总结》、《java数据结构与算法教程》、《java文件与目录操作技巧汇总》、《java操作dom节点技巧总结》和《java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。