JDBC 利用反射批量插入數據(傳入SQL)

實體類
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、爲了過了某些屬性需要將其放在後邊,不然反射時會造成類型不匹配,比如說日期類型;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章