封裝JdbcUtil工具類,實現自動封裝為實體類
阿新 • • 發佈:2019-02-02
根據今天所學,自己寫的JdbcUtil工具類。
其中update操作包含增刪改,使用事務處理
查詢操作分為兩種:
1、需要傳入sql語句(使用預編譯,用?佔位)、引數、需要包裝的實體類的class路徑;返回實體類的list(可以為單個)
2、傳入sql、引數。適用於查詢基本資料型別組成的list (可以為單個)
jdbcUtil.java程式碼:
import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.*; import java.util.ArrayList; import java.util.Properties; /** * Created by srg * * @date 2018/7/14 */ public class JdbcUtil { private static String url = null; private static String username = null; private static String password = null; private static String driverClass = null; private static Connection conn = null; private static PreparedStatement pstm = null; private static ResultSet rs = null; static { try { Properties prop = new Properties(); InputStream in = JdbcUtil.class.getResourceAsStream("/database.properties"); prop.load(in); url = prop.getProperty("url"); username = prop.getProperty("user"); password = prop.getProperty("password"); driverClass = prop.getProperty("driverClass"); Class.forName(driverClass); } catch (Exception e) { e.printStackTrace(); } } /** * 獲取資料庫連結 * @return */ public static Connection getConnection(){ Connection conn = null; try { conn = DriverManager.getConnection(url, username, password); } catch (SQLException e) { e.printStackTrace(); } return conn; } /** * ResultSet的關閉 */ public static void close(Connection conn, PreparedStatement pstm, ResultSet rs){ if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } if(pstm != null){ try { pstm.close(); } catch (SQLException e) { e.printStackTrace(); } } if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 執行插入操作 * @param sql sql語句 * @param param 需要的引數 * @return */ public static boolean executeUpdate(String sql, ArrayList param){ boolean flag = false; conn = JdbcUtil.getConnection(); try { pstm = conn.prepareStatement(sql); for (int i = 0;i < param.size();i++){ pstm.setObject(i + 1, param.get(i)); } pstm.executeUpdate(); flag = true; } catch (SQLException e) { e.printStackTrace(); return flag; } finally { JdbcUtil.close(conn, pstm, rs); } return flag; } /** * 執行更新批處理操作,使用事務處理,成功則提交事務,不成功則回滾 * @param sql * @param param * @return */ public static boolean executeUpdate(String[] sql, ArrayList<ArrayList> param){ boolean flag = false; conn = JdbcUtil.getConnection(); try { //設定為手動提交 conn.setAutoCommit(false); for(int i = 0;i < sql.length;i++){ pstm = conn.prepareStatement(sql[i]); for (int j = 0;j < param.size();j++){ pstm.setObject(j + 1, param.get(i).get(j)); } pstm.addBatch(); } pstm.executeBatch(); //如果執行成功了,就提交 conn.commit(); flag = true; } catch (SQLException e) { e.printStackTrace(); try { //不成功,回滾 conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } return flag; } finally { JdbcUtil.close(conn, pstm, rs); } return flag; } /** * 執行查詢操作 * @param sql sql語句 * @param param 需要的引數 * @param classPath 根據傳入的path,反射為實體類,封裝到list中 * @return 將封裝好的list返回 */ public static ArrayList executeQuery(String sql, ArrayList param, String classPath){ ArrayList result = new ArrayList(); conn = JdbcUtil.getConnection(); try { pstm = conn.prepareStatement(sql); for (int i = 0;i < param.size();i++){ pstm.setObject(i + 1, param.get(i)); } rs = pstm.executeQuery(); Class c = Class.forName(classPath); while(rs.next()){ Object obj = c.newInstance(); Field[] fields = c.getDeclaredFields(); for (Field field : fields){ String ftype = field.getType().getSimpleName(); String fname = field.getName(); //如果不存在,繼續 if(!isExists(rs, fname)){ continue; } Object value = null; if("string".equalsIgnoreCase(ftype)){ value = rs.getString(fname); } else if("int".equalsIgnoreCase(ftype) || "integer".equalsIgnoreCase(ftype)){ value = rs.getInt(fname); } else if("float".equalsIgnoreCase(ftype)){ value = rs.getFloat(fname); } else if("double".equalsIgnoreCase(ftype)){ value = rs.getDouble(fname); } else if("boolean".equalsIgnoreCase(ftype)){ value = rs.getBoolean(fname); } else if("date".equalsIgnoreCase(ftype)){ value = rs.getTimestamp(fname); } //使用setXXX方法 fname = fname.substring(0,1).toUpperCase() + fname.substring(1); String mName = "set" + fname; Method m = c.getDeclaredMethod(mName, field.getType()); m.invoke(obj, value); } //將封裝好的資料依次加入result result.add(obj); } } catch (Exception e) { e.printStackTrace(); result = new ArrayList(); return result; } finally { JdbcUtil.close(conn, pstm, rs); } return result; } /** * 查詢單個數據 * @param sql sql語句 * @param param 需要的引數 * @return 返回值為基本型別或者String的list */ public static ArrayList executeQuery(String sql, ArrayList param){ ArrayList result = new ArrayList(); conn = JdbcUtil.getConnection(); try{ pstm = conn.prepareStatement(sql); for (int i = 0;i < param.size();i++){ pstm.setObject(i + 1, param.get(i)); } rs = pstm.executeQuery(); while (rs.next()){ Object object = rs.getObject(1); result.add(object); } } catch (Exception e){ e.printStackTrace(); return new ArrayList(); } finally { JdbcUtil.close(conn, pstm, rs); } return result; } public static boolean isExists(ResultSet rs,String column) { try { rs.findColumn(column); } catch (SQLException e) { return false; } return true; } }
其中database.properties中儲存資料庫的資訊
url=jdbc:mysql://localhost:3306/gs
user=root
password=
driverClass=com.mysql.jdbc.Driver
由於使用到了反射,所以bean(實體類)裡面的set get函式必須標準命名。
例如:
user.java(僅作為例子)
public class UserBean { private String username; private String password; public UserBean() { } public UserBean(String username, String password) { this.username = username; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
使用例項:(我還沒驗證。。。瞎寫一下)
public User login(String username, String password){ String sql = "select * from user where username=? and password=?"; ArrayList<String> param = new ArrayList<>(); param.add(username); param.add(password); String path = "com.gs.bean.UserBean"; ArrayList userList = JdbcUtil.executeQuery(sql,param,path); User user = new User(); if(userList.size() > 0) { user = (User) userList.get(0); } return user; }