import java.io.File;
import java.lang.reflect.Field;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicInteger;
public class DBUtill {
private static Connection connection = null;
private static Statement statement = null;
private static String username = "zc";
private static String password = "zc";
public static void beginTransaction(Connection cnn){
if(cnn!=null){
try {
if(cnn.getAutoCommit()){
cnn.setAutoCommit(false);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void commitTransaction(Connection cnn){
if(cnn!=null){
try {
if(!cnn.getAutoCommit()){
cnn.commit();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void rollBackTransaction(Connection cnn){
if(cnn!=null){
try {
if(!cnn.getAutoCommit()){
cnn.rollback();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void setConnection(String path) {
try {
File f = new File(path);
if(!f.exists()){
File file = new File(path);
file.mkdirs();
}
Class.forName("org.sqlite.JDBC");
String url = "jdbc:sqlite:" + path + "\\data.db";
connection = DriverManager.getConnection(url, username, password);
statement = connection.createStatement();
} catch (Exception e) {
throw new RuntimeException("建立Sqlite连接失败");
}
}
public synchronized static void create(String tableName, String className) throws SQLException {
try {
statement.executeUpdate("DROP TABLE IF EXISTS " + tableName + ";");
Field[] fields = Class.forName(className).getDeclaredFields();
StringBuffer sb = new StringBuffer();
String reg = " ";
sb.append("create table " + tableName + " (");
for (Field field : fields) {
field.setAccessible(true);
if (field.getType().getName().equals(java.lang.Long.class.getName())) {
sb.append(reg + field.getName() + " bigint(20) ");
} else if (field.getType().getName().equals(java.lang.String.class.getName())) {
sb.append(reg + field.getName() + " varchar(255) ");
} else if (field.getType().getName().equals(java.util.Date.class.getName())) {
sb.append(reg + field.getName() + " datetime ");
} else {
sb.append(reg + field.getName() + " int(11) ");
}
reg = ",";
}
sb.append(") ; ");
statement.executeUpdate(sb.toString());
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("建表失败,表名称:" + tableName);
}
}
public synchronized static <T> int insert(String tableName, List<T> list) throws SQLException {
StringBuffer declaration = new StringBuffer();
List<String> dataSqlArray = new ArrayList<>();
AtomicInteger count = new AtomicInteger();
beginTransaction(connection);
try {
list.stream().map(t -> {
if (dataSqlArray.size() < 1) {
Field[] fields = t.getClass().getDeclaredFields();
declaration.append(" (");
String reg = "";
for (Field field : fields) {
field.setAccessible(true);
declaration.append(reg + field.getName());
reg = ",";
}
declaration.append(")");
}
return t;
}).forEach((t) -> {
Field[] fields = t.getClass().getDeclaredFields();
StringBuffer oneData = new StringBuffer();
String reg = "";
oneData.append(" (");
for (Field field : fields) {
try {
field.setAccessible(true);
if (null == field.get(t) || "".equals(field.get(t))) {
oneData.append(reg + null);
} else if (field.getType().getName().equals(java.lang.String.class.getName())) {
oneData.append(reg + "\'" + field.get(t) + "\'");
} else if (field.getType().getName().equals(java.util.Date.class.getName())) {
String dd = field.get(t).toString();
SimpleDateFormat sdf1 = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = sdf2.format(sdf1.parse(dd));
oneData.append(reg + "\'" + date + "\'");
} else if (field.getType().getName().equals(java.lang.Integer.class.getName())||field.getType().getName().equals(java.lang.Double.class.getName())){
oneData.append(reg + (field.get(t)==null?0:field.get(t)));
}else {
oneData.append(reg + field.get(t));
}
reg = ",";
} catch (Exception e) {
e.printStackTrace();
}
}
oneData.append(")");
dataSqlArray.add(oneData.toString());
String retSQL = "INSERT INTO " + tableName + declaration.toString()
+ " VALUES " + oneData + ";";
PreparedStatement prep = null;
try {
prep = connection.prepareStatement(retSQL);
count.set(count.get()+prep.executeUpdate());
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(tableName+"表插入数据失败");
}
});
if ("skutm3".equals(tableName)){
statement.executeUpdate("CREATE INDEX index_tm ON skutm3(tm) ; ");
}
commitTransaction(connection);
} catch (Exception e) {
rollBackTransaction(connection);
e.printStackTrace();
throw new RuntimeException(tableName+"表插入数据失败");
}
return count.get();
}
public static void endConnection() {
try {
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}