之前使用Hibernate時,覺得很不錯,但是自己平時做一些練習時都是一些小項目,所以自己想能不能自嘗試寫一個類似Hibernate的簡單功能呢?當然,本人水平不足,所以現在只能求形似。如果說的有錯希望給位前輩批評並指教。
以下是我的測試結果:
數據插入:
User user = new User(); user.setName("HHZoog"); user.setPwd("HHZoog"); user.setMusic_box("12"); HibernateDao.save(user);
測試結果:
數據修改:
User user = new User(); user.setId(22); user.setName("HHZoog"); user.setPwd("OOOOOO"); user.setMusic_box("12");
HibernateDao.update(user);
測試結果:
數據刪除:
User user = new User(); user.setId(22); user.setName("HHZoog"); user.setPwd("OOOOOO"); user.setMusic_box("12"); HibernateDao.delete(user);
測試結果:刪除成功
數據查找:get方法
User user = (User)HibernateDao.get(User.class, 23); System.out.println(user.getId() + " | " +user.getName() + " | " +user.getPwd());
測試結果:
數據查找:find方法
String sql = "select * from user where id = 23"; List<Object> lists = HibernateDao.find(sql, User.class); for(int i = 0 ; i < lists.size(); i++) { User user = (User)lists.get(i); System.out.println(user.getId() + " | " +user.getName() + " | " +user.getPwd()); }
測試結果:
下面介紹一下各個類的功能:
ResultSetToObject類事件數據庫操作返回的ResultSet結果集轉為List<Object>對象;
BaseOperatorDao類是基本的數據操作類,執行傳遞過來的Sql語句;
HibernateDao提供類似Hibernate簡單操作的功能;
User對應的實體類;
FunctionUtils類提供一些常用的方法;
ConnectDB類是連接數據庫的操作類:
***********************************************************************
一下是各個類的源代碼:
HibernateDao.java

public class HibernateDao { /** * 保存對象 * @param object */ public static void save(Object object) { Class<?> objClass = object.getClass(); Field[] fields = objClass.getDeclaredFields(); /*構建SQL語句*/ StringBuffer sql = new StringBuffer("insert into "); StringBuffer values = new StringBuffer("values("); /*數據庫名稱*/ Field tableName = null; try { /*根據實體類中的tableName屬性獲得數據庫名稱*/ tableName = objClass.getDeclaredField("tableName"); /*拼接SQL語句*/ sql.append(tableName.get(object)); sql.append("("); /*根據傳入的object對象獲取到屬性的值,並拼接到SQL語句中*/ for(int i = 0 ; i < fields.length ; i++) { /*但object的屬性名為tableName,id,primaryKey時,則不將其拼接到SQL語句中*/ if(fields[i].getName().equals("tableName") || fields[i].getName().equals("id") || fields[i].getName().equals("primaryKey")) { }else { sql.append(fields[i].getName()); sql.append(","); /*獲得object對應屬性的字段名的getXxxx()方法*/ Method method = objClass.getDeclaredMethod ("get"+FunctionUtils.upInitial(fields[i].getName())); /*獲得此objec字段的值*/ Object value = method.invoke(object); /*如果值為空,則SQL語句中的值則為空*/ if(value == null) { values.append("null"); values.append(","); } /*獲得此字段對應的數據類型*/ else if(fields[i].getType() == java.lang.String.class) { values.append("'"); values.append(value); values.append("'"); values.append(","); }else { values.append(value); values.append(","); } } } } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } /*刪除末尾一個逗號*/ sql.delete(sql.length()-1, sql.length()); sql.append(")"); sql.append(" "); values.delete(values.length()-1, values.length()); values.append(")"); /*拼接成一條完整的SQL語句*/ String resultSql = sql.toString() + values.toString(); /*執行SQL語句操作*/ BaseOperatorDao.delOrSaveOrUpdateData(resultSql); System.out.println(resultSql); } /** * 根據提供的SQL和實體類查找數據並返回List<Object> * @param sql * @param objClass * @return */ public static List<Object> find(String sql,Class<?> objClass) { return ResultSetToObject.turnToObject(BaseOperatorDao.selectData(sql),objClass); } /*根據主鍵查找數據*/ public static Object get(Class<?> objClass,Object key) { StringBuffer sql = new StringBuffer("select * from "); Object object = null; try { Field tableName = objClass.getDeclaredField("tableName"); Field primaryKey = objClass.getDeclaredField("primaryKey"); /*拼接數據庫名到SQL語句中*/ sql.append(tableName.get(objClass)); /*獲得主鍵數據類型,如果是string類型則加單引號*/ if(primaryKey.getType().equals("java.lang.String.class")) { sql.append(" where "+primaryKey.get(objClass)+" ='"+key.toString()+"'"); }else { sql.append(" where "+primaryKey.get(objClass)+" ="+key.toString()); } System.out.println(sql.toString()); /*執行SQL語句后返回List對象*/ List<Object> listObjects = ResultSetToObject.turnToObject(BaseOperatorDao.selectData(sql.toString()),objClass); /*取得第一條記錄,即查找到數據*/ object = listObjects.get(0); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return object; } /** * 刪除記錄 * @param object */ public static void delete(Object object) { StringBuffer sql = new StringBuffer("delete from "); /*獲得對象的Class類型*/ Class<?> objClass = object.getClass(); /*對象申明的屬性*/ Field filed; /*對象申明的方法*/ Method method = null; try { /*獲得主鍵名稱*/ Field primaryKey = objClass.getDeclaredField("primaryKey"); String keyName = (String) primaryKey.get(objClass); /*將keyName首字母轉為大寫,並獲得主鍵的get方法*/ method = objClass.getDeclaredMethod("get"+FunctionUtils.upInitial(keyName)); /*獲得數據名稱,並拼接到SQL語句中*/ filed = objClass.getDeclaredField("tableName"); sql.append(filed.get(objClass)); if(primaryKey.getType().equals("java.lang.String.class")) { sql.append(" where "+keyName+" = '"+method.invoke(object)+"'"); }else { sql.append(" where "+keyName+" = "+method.invoke(object)); } BaseOperatorDao.delOrSaveOrUpdateData(sql.toString()); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } System.out.println(sql.toString()); } /** * 根據SQL刪除記錄 * @param sql * @return */ public static int delete(String sql) { return BaseOperatorDao.delOrSaveOrUpdateData(sql); } /** * 更新記錄 * @param object */ public static void update(Object object) { /*獲得對象的類型*/ Class<?> objClass = object.getClass(); /*待拼接SQL語句*/ StringBuffer sql = new StringBuffer("update "); StringBuffer whereSql = new StringBuffer(" where "); /*獲得申明的屬性*/ Field[] fields = objClass.getDeclaredFields(); try { Field tableName = objClass.getDeclaredField("tableName"); Field primaryKey = objClass.getDeclaredField("primaryKey"); /*獲得主鍵的名稱*/ String keyName = (String)primaryKey.get(objClass); /*將主鍵拼接到SQL語句中*/ whereSql.append(keyName); whereSql.append("= "); sql.append(tableName.get(objClass)); sql.append(" set "); for(int i = 0 ; i < fields.length; i++) { /*如果屬性名稱為tableName,primaryKey時則不拼接到SQL中*/ if(fields[i].getName().equals("tableName") || fields[i].getName().equals("primaryKey")) { }else { /*獲得對應屬性的get方法*/ Method method = objClass.getDeclaredMethod("get"+FunctionUtils.upInitial(fields[i].getName())); sql.append(fields[i].getName()); sql.append("="); /*獲得對應屬性的數據類型,如果是String類型則加單引號*/ if(fields[i].getType() == java.lang.String.class) { sql.append("'"); sql.append(method.invoke(object)); sql.append("'"); sql.append(","); }else { sql.append(method.invoke(object)); sql.append(","); } /*如果此屬性為主鍵*/ if(fields[i].getName().equals(keyName)) { if(primaryKey.getType().equals("java.lang.String.class")) { whereSql.append("'"); whereSql.append(method.invoke(object)); whereSql.append("'"); }else { whereSql.append(method.invoke(object)); } } } } /*刪除多余的逗號*/ sql.delete(sql.length()-1, sql.length()); /*執行操作,並返回作用的行數*/ int count = BaseOperatorDao.delOrSaveOrUpdateData(sql.toString()+whereSql.toString()); if(count == 0) { System.out.println("請確定數據庫中是否由此記錄"); } System.out.println(sql.toString()+whereSql.toString()); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
FunctionUtils.java

public class FunctionUtils { /** * 將首字母變為大寫 * * @param str * @return */ public static String upInitial(String str) { char[] chars = str.toCharArray(); chars[0] = Character.toUpperCase(chars[0]); return new String(chars); } /** * 字段的數據類型 * * @param str * @return */ public static Class<?> paraTypeClass(String str) { if (str.equals("java.lang.String")) { return java.lang.String.class; } else if (str.equals("java.lang.Integer")) { return java.lang.Integer.class; } else if (str.equals("java.lang.Character")) { return java.lang.Character.class; } else if (str.equals("java.lang.Double")) { return java.lang.Double.class; } else if (str.equals("java.lang.Short")) { return java.lang.Short.class; } else if (str.equals("java.lang.Byte")) { return java.lang.Byte.class; } else if (str.equals("java.lang.Float")) { return java.lang.Float.class; } else if (str.equals("java.lang.Boolean")) { return java.lang.Boolean.class; } else if (str.equals("java.util.Date")) { return java.util.Date.class; } return null; } }
ConnectionDB.java

public class ConnectDB { /** 數據庫用戶名 */ private static String DB_uName = "root"; /** 數據庫用戶密碼 */ private static String DB_uPwd = "mysqladmin"; /** 數據庫驅動 */ private static String DB_Driver = "com.mysql.jdbc.Driver"; /** 數據庫連接路徑 */ private static String DB_Url = "jdbc:mysql://localhost:3306/Pluto"; /**數據庫連接對象*/ public static Connection conn = null; private ConnectDB() { } /** * 加載數據庫驅動 */ static { try { Class.forName(DB_Driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 連接數據庫,並返回數據庫連接對象 * @return */ public static Connection connToDB() { try { conn = DriverManager.getConnection(DB_Url, DB_uName, DB_uPwd); } catch (SQLException e) { e.printStackTrace(); } return conn; } /** * 關閉數據庫,釋放資源 * @param resultSet * @param statement * @param conn */ public static void releaseDB(ResultSet resultSet, Statement statement, Connection conn) { try { if (resultSet != null) { resultSet.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if(statement != null) { statement.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
User.java

public class User { /**用戶編號*/ private Integer id; /** 用戶名 */ private String name; /** 用戶密碼 */ private String pwd; /** 用戶音樂盒子 */ private String music_box; /**對應數據庫名稱*/ public static String tableName = "user"; /**數據對應的主鍵*/ public static String primaryKey = "id"; /** * get,set方法 * @return */ public String getName() { return name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getMusic_box() { return music_box; } public void setMusic_box(String musicBox) { music_box = musicBox; } }
ResultSetToObject.java
public class ResultSetToObject { public static List<Object> turnToObject(ResultSet resultSet, Class<?> objClass) { /** 存儲轉化后的實體類 */ List<Object> listObjs = new ArrayList<Object>(); /** resultSet數據表中的字段名稱 */ String[] columnNames = null; /** resultSet數據表中對應字段的數據類型 */ String[] columnTypes = null; try { if (resultSet == null) { return listObjs; } else { ResultSetMetaData metaResult = resultSet.getMetaData(); int length = metaResult.getColumnCount(); columnNames = new String[length]; columnTypes = new String[length]; for (int i = 0; i < columnNames.length; i++) { columnNames[i] = metaResult.getColumnName(i + 1); columnTypes[i] = metaResult.getColumnClassName(i + 1); } while (resultSet.next()) { try { //實例化實體類 Object obj = objClass.newInstance(); //根據字段名調用實體類中的set方法 for (int j = 0; j < columnNames.length; j++) { Method method = objClass.getDeclaredMethod("set" + FunctionUtils.upInitial(columnNames[j]), FunctionUtils.paraTypeClass(columnTypes[j])); method.invoke(obj, resultSet .getObject(columnNames[j])); } listObjs.add(obj); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } //關閉結果集 ConnectDB.releaseDB(resultSet, null, ConnectDB.conn); } catch (SQLException e) { e.printStackTrace(); } return listObjs; } }
BaseOperatorDao.java
public class BaseOperatorDao { private static Statement statement = null; /** * 使用Statement對象對數據操作 * 主要是查詢 * @param sql * @return */ public static ResultSet selectData(String sql) { ResultSet resultSet = null; try { Connection conn = ConnectDB.connToDB(); statement = conn.createStatement(); resultSet = statement.executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } return resultSet; } /** * 使用Statement對象操作數據 * 主要針對數據的增刪改 * @param sql * @return */ public static int delOrSaveOrUpdateData(String sql) { int resultRow = 0; try { statement = ConnectDB.connToDB().createStatement(); resultRow = statement.executeUpdate(sql); ConnectDB.releaseDB(null, statement, ConnectDB.conn); } catch (SQLException e) { e.printStackTrace(); } return resultRow; } }
********************************************************
以下是此用法的使用一些限制:
1,此方法不適合復合主鍵
2,實體類的屬性名稱必須要與數據的字段名一致
3,此方法的對應實體類必須有public static tableName ="XXX" //代表的對應的數據庫名
public static primaryKey = "XXX" //代表對應的主鍵名稱
4,由於我進行測試的時候使用的主鍵是“id”且自增長,所以如果不是則需要做一下修改。
本人聯系方式qq:982925115 , 郵箱:zhong678@yeah.net
User user = new User(); user.setId(22); user.setName("HHZoog"); user.setPwd("OOOOOO"); user.setMusic_box("12"); HibernateDao.delete(user);