Orm-JDBC(物件關係對映的資料庫查詢) 程式碼更新
阿新 • • 發佈:2021-02-16
Orm-JDBC(物件關係對映的資料庫查詢)
本次更新內容
- 完成多條資料查詢
- 更新資料操作
- 刪除資料的操作
- 以及上個版本bug的修改
測試:
public static void main(String[] args) { //例項化dao CommonDao dao=new CommonDao(); //一行資料查詢 String sql="select * from tb_goods where id=?"; //TbGoods object = dao.findObject(sql, TbGoods.class,2,3); //System.err.println(object); //多行資料查詢 sql="select * from tb_goods"; //List<TbGoods> objectList = dao.findListObject(sql, TbGoods.class); //System.err.println(objectList); //更新資料操作 sql="update tb_goods set name='小丫丫' where id=? or name=?"; //int row = dao.updateObjects(sql, 2,"小雞雞"); //System.err.println(row); sql="delete from tb_goods where id=?"; int row=dao.deleteObjects(sql,2); System.err.println(row); }
CommondDao 程式碼更新
package com.epoint.util; import java.lang.reflect.Method; import java.sql.*; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; public class CommonDao { private static Connection conn = null; static { conn=DruidUtils.getConnection(); } /** * 獲取例項化CommonDao */ public CommonDao getInstance() { CommonDao dao = new CommonDao(); return dao; } /** * 刪除資料 * @param sql sql * @param params 引數 * @return 受影響的行數 */ public int deleteObjects(String sql, Object... params){ return updateOrDelete(sql,params); } /** * 更新資料 * @return 返回受影響的行數 */ public int updateObjects(String sql, Object... params){ return updateOrDelete(sql,params); } private int updateOrDelete(String sql, Object... params){ int row =0; try { //3.通過資料庫的連線操作資料庫,實現增刪改查 PreparedStatement statement = conn.prepareStatement(sql); //獲取需要傳入引數的個數 ParameterMetaData parameterMetaData = statement.getParameterMetaData(); //如果需要傳入的引數個人大於>0則需要設定引數 if (parameterMetaData.getParameterCount() > 0) { for (int i = 1; i <= parameterMetaData.getParameterCount(); i++) { statement.setString(i, params[i - 1].toString()); } } //執行更新操作 row = statement.executeUpdate(); }catch (Exception e){ e.printStackTrace(); } return row; } /** * 查詢多條資料 * @param sql 查詢sql * @param cls 需要對映的物件 * @param params sql中的引數 * @return 返回值List */ public List findListObject(String sql, Class cls, Object... params){ List list=new ArrayList(); Object obj =null; try { //3.通過資料庫的連線操作資料庫,實現增刪改查 PreparedStatement statement = conn.prepareStatement(sql); //獲取需要傳入引數的個數 ParameterMetaData parameterMetaData = statement.getParameterMetaData(); //如果需要傳入的引數個人大於>0則需要設定引數 if(parameterMetaData.getParameterCount()>0){ for (int i = 1; i <= parameterMetaData.getParameterCount(); i++) { statement.setString(i, params[i-1].toString()); } } //4.獲取結果集 ResultSet resultSet =statement.executeQuery(); //6.獲取結果集元資料 ResultSetMetaData metaData = resultSet.getMetaData(); //7.獲取欄位的個數 int columnCount = metaData.getColumnCount(); //是否例項化的開關,保證物件只例項化一次 boolean flag=true; //8.遍歷 建立類物件(來接資料查詢出來的資料) while (resultSet.next()) { if(flag){ obj = cls.getConstructor(null).newInstance(null); flag=false; } for (int i = 1; i <= columnCount; i++) { //9.獲取欄位的名字 String columnName = metaData.getColumnName(i);//id, name ,age //10.獲取對應欄位的資料 Object value = resultSet.getObject(columnName); //11.給指定欄位的資料在類物件中給賦值 setValue(columnName, value, obj, cls); } list.add(obj); } //DruidUtils.closeAll(conn,statement,resultSet); }catch (Exception e){ e.printStackTrace(); } //返回查詢到的物件 return list; } /** * 查詢一條資料 * @param sql 需要查詢的sql * @param cls 對映的物件 * @param params sql中的引數 * @param <T> 泛型 * @return 返回傳入物件型別 */ public <T> T findObject(String sql, Class cls, Object... params) { Object obj =null; try { //3.通過資料庫的連線操作資料庫,實現增刪改查 PreparedStatement statement = conn.prepareStatement(sql); //獲取需要傳入引數的個數 ParameterMetaData parameterMetaData = statement.getParameterMetaData(); //如果需要傳入的引數個人大於>0則需要設定引數 if(parameterMetaData.getParameterCount()>0){ for (int i = 1; i <= parameterMetaData.getParameterCount(); i++) { statement.setString(i, params[i-1].toString()); } } //4.獲取結果集 ResultSet resultSet =statement.executeQuery(); //6.獲取結果集元資料 ResultSetMetaData metaData = resultSet.getMetaData(); //7.獲取欄位的個數 int columnCount = metaData.getColumnCount(); //8.遍歷 建立類物件(來接資料查詢出來的資料) if(resultSet.next()) { obj = cls.getConstructor(null).newInstance(null); for (int i = 1; i <= columnCount; i++) { //9.獲取欄位的名字 String columnName = metaData.getColumnName(i);//id, name ,age //10.獲取對應欄位的資料 Object value = resultSet.getObject(columnName); //11.給指定欄位的資料在類物件中給賦值 setValue(columnName, value, obj, cls); } } //DruidUtils.closeAll(conn,statement,resultSet); }catch (Exception e){ e.printStackTrace(); } //返回查詢到的物件 return (T) obj; } private void setValue(String field, Object value, Object obj, Class cls) throws Exception { //獲取物件中的方法陣列 Method[] method = cls.getMethods(); //加上資料庫欄位加上set String fieldName = "set" + field; for (int n = 0; n < method.length; n++) { //如果匹配到對應的set方法則執行賦值操作 if (method[n].getName().equalsIgnoreCase(fieldName)) { //獲取方法引數資料型別 String[] clsList = method[n].getParameterTypes()[0].getName().split("\\."); String type = clsList[clsList.length - 1]; switch (type) { case "Integer": case "int": method[n].invoke(obj, Integer.parseInt(value.toString()));//給對應的方法引數賦值 break; case "Double": case "double": method[n].invoke(obj, Double.parseDouble(value.toString())); break; case "Long": case "long": method[n].invoke(obj, Long.parseLong(value.toString())); break; case "Float": case "float": method[n].invoke(obj, Float.parseFloat(value.toString())); break; case "Date": method[n].invoke(obj, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value.toString())); break; case "String": method[n].invoke(obj, value.toString()); break; } break; } } } }