實體類
package com.dz.vo;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private String name;
private String age;
private Date date;
private String id;
private String version;
private String pageSize;
private String pageIndex;
public User(String id, String name, String age, Date date) {
this.id = id;
this.name = name;
this.age = age;
this.date = date;
}
public User(String name, String age, Date date) {
this.name = name;
this.age = age;
this.date = date;
}
public String getPageSize() {
return pageSize;
}
public void setPageSize(String pageSize) {
this.pageSize = pageSize;
}
public String getPageIndex() {
return pageIndex;
}
public void setPageIndex(String pageIndex) {
this.pageIndex = pageIndex;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
package com.dz;
import com.dz.vo.User;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class JdbcUtil {
public static final String DRIVER = "com.mysql.cj.jdbc.Driver"; //jdbc驅動
public static final String URL = "jdbc:mysql://localhost:3306/demo?&useSSL=false&serverTimezone=UTC";
public static final String USER = "root";
public static final String PWD = "root";
/*
*進行數據庫的鏈接
*/
public static Connection getConnection() {
Connection con = null;
try {
//加載驅動
Class.forName(DRIVER);
//創建鏈接
con = DriverManager.getConnection(URL, USER, PWD);
if (!con.isClosed()) {
System.out.println("數據庫連接成功");
}
} catch (ClassNotFoundException e) {
System.out.println("數據庫驅動沒有安裝");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("數據庫連接失敗");
e.printStackTrace();
}
//返回連接
return con;
}
/*
*數據庫關閉
*/
public static void closeAll(Connection con, PreparedStatement pstmt, ResultSet rs) {
try {
//判斷是否被操作
if (rs != null)
rs.close();
if (pstmt != null)
pstmt.close();
if (con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection con, PreparedStatement pstmt) {
try {
//判斷是否被操作
if (pstmt != null)
pstmt.close();
if (con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static <T> void Test(List<T> objects, String sql) {
int size = objects.size();
int count = 0;
System.out.println("集合大小:" + size);
Connection conn = JdbcUtil.getConnection();
PreparedStatement ps = null;
int num = 0;
int batchCount = 11;
try {
conn.setAutoCommit(false); //設置手動提交
ps = conn.prepareStatement(sql);
long startTime = System.currentTimeMillis();
for (int i = 0; i < objects.size(); i++) {
num++;
Object obj = objects.get(i);//獲取List中的每一個對象
Class<?> c = obj.getClass();//反射形成實際對象
Field[] fields = c.getDeclaredFields();//通過反射獲取對象的屬性數組
int fieldSize = fields.length;
for (Field field : fields) {//過濾不需要屬性
if (field.getName().lastIndexOf("id") != -1 || field.getName().lastIndexOf("version") != -1 || field.getName().lastIndexOf("pageIndex") != -1 || field.getName().lastIndexOf("pageSize") != -1) {
fieldSize = fieldSize - 1;
}
}
for (int j = 0; j < fieldSize; j++) {
Field field = fields[j];//拿到每一個屬性
field.setAccessible(true);// 設置些屬性是可以訪問的
String type = field.getType().toString();// 得到此屬性的類型
if (type.endsWith("String")) {
ps.setString(j + 1, String.valueOf(field.get(obj)));
} else if (type.endsWith("Date")) {
ps.setDate(j + 1, new java.sql.Date(((Date) field.get(obj)).getTime()));
} else {
}
}
ps.addBatch();//添加到批次
if (num > batchCount - 1) {
count++;//計算執行的批次數
ps.executeBatch();//提交批處理
conn.commit();//執行
ps.clearBatch();//清除
System.out.println(num + " 條插入完成! ");
System.gc();//提示釋放GC
num = 0;
}
}
ps.executeBatch();//提交批處理
System.out.println("插入最後 " + (size - count * batchCount + "條成功!"));
conn.commit();//執行
ps.clearBatch();
close(conn, ps);
long endTime = System.currentTimeMillis();
System.out.println("耗時:" + (endTime - startTime) / 1000 + "s");
} catch (SQLException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public static List<User> CreateVo() {
List<User> userList = new ArrayList<User>();
for (int i = 0; i < 100; i++) {
User user = new User("xiaohua", "15", new Date());
userList.add(user);
}
return userList;
}
public static void main(String[] args) {
List<User> userList = CreateVo();
String sql = "insert into user (name,age,date) values(?,?,?)";
JdbcUtil.Test(userList, sql);
System.out.println("測試完成!");
}
}
Mysql建表腳本
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` varchar(11) DEFAULT NULL,
`date` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=301 DEFAULT CHARSET=utf8;
備註:1、實體類裏邊的屬性順序和數據庫保持一致;
2、爲了過了某些屬性需要將其放在後邊,不然反射時會造成類型不匹配,比如說日期類型;