本文实例讲述了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程序设计有所帮助。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。