代碼路徑:https://github.com/m2492565210/java_orm自行下載
框架的類結構如下,anno包下注解和MODEL類結合用於定義數據庫結構。MyORM類是工具類,獲取工廠SESSIONFACTORY,工廠資源采用單例模式,目前沒有考慮線程安全。使用工廠獲取SESSION,利用SESSION類是數據庫直接執行者,通過傳入MODEL完成數據庫讀寫。時間有限,SESSION方法中只是完成寫數據庫語句,並沒有真正進行數據庫操作。

測試類中有SESSION的使用方法,如下。
@Test public void test() throws ClassNotFoundException, SQLException, IOException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Session ss = MyORM.getSessionFactory("db.properties").openConnection();//db.properties是數據庫URL,密碼等信息, ss.save(new Student(1001, "A", 27)); ss.update(new Student(1001, "A", 27)); ss.delete(new Student(1001, "A", 27)); ss.query(new Student(1001, "A", 27)); ss.close(); }
MyORM:
package m.cnblogs.com.orm; import m.cnblogs.com.orm.conn.Factory; import m.cnblogs.com.orm.conn.Session; public final class MyORM { private static Factory sin = null; private static class SessionFactory implements Factory { private SessionFactory(String path) throws ClassNotFoundException { System.out.println("use the file path provided to init factory"); } public Session openConnection() { return new Session(); } } public static Factory getSessionFactory(String path) throws ClassNotFoundException { if (null == sin) { sin = new SessionFactory(path); } return sin; } }
Student類對應數據表,定義如下:
@Table(name = "STUDENT") public class Student { @ID //框架中定義的注解 @Property(name = "ID", type = "int") private int id; @Property(name = "NAME", type = "varchar") private String name; @Property(name = "AGE", type = "int") private int age; public Student(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public Integer getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
session.java
package m.cnblogs.com.orm.conn; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import m.cnblogs.com.orm.anno.ID; import m.cnblogs.com.orm.anno.Property; import m.cnblogs.com.orm.anno.Table; public class Session { public Session() { System.out.println("SESSION INIT"); } public <T> void save(T obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class<? extends Object> cls = obj.getClass(); StringBuffer sql = new StringBuffer(); sql.append("INSERT INTO "); Table tbl = (Table) cls.getAnnotation(Table.class); if (null != tbl) { sql.append(tbl.name()); } else { sql.append(cls.getName().substring(cls.getName().lastIndexOf(".") + 1)); } sql.append("( "); Field[] fields = cls.getDeclaredFields(); StringBuffer valueSql = new StringBuffer(); for (Field field : fields) { Property proper = field.getAnnotation(Property.class); // 獲得字段第一個字母大寫 String methodFirstLetter = field.getName().substring(0, 1).toUpperCase(); // 轉換成字段的get方法 String getterName = "get" + methodFirstLetter + field.getName().substring(1); Method getMethod = cls.getMethod(getterName, new Class[] {}); // 這個對象字段get方法的值 Object value = getMethod.invoke(obj, new Object[] {}); if (field.getType().getName().equals(java.lang.String.class.getName())) { valueSql.append("'" + value + "'").append(","); } else { valueSql.append(value).append(","); } if (null != proper) { sql.append(proper.name()).append(","); } else { sql.append(field.getName()).append(","); } } valueSql.deleteCharAt(valueSql.length() - 1); sql.deleteCharAt(sql.length() - 1); sql.append(" ) VALUES( "); sql.append(valueSql); sql.append(" )"); System.out.println(sql.toString()); } public <T> void query(T obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class<? extends Object> cls = obj.getClass(); StringBuffer sql = new StringBuffer(); sql.append("SELETE FROM "); Table tbl = (Table)cls.getAnnotation(Table.class); if (null != tbl) { sql.append(tbl.name()); } else { sql.append(cls.getName().substring(cls.getName().lastIndexOf(".")+1)); } Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { if (null != field.getAnnotation(ID.class)) { //獲得字段第一個字母大寫 String methodFirstLetter = field.getName().substring(0,1).toUpperCase(); //轉換成字段的get方法 String getterName = "get" + methodFirstLetter + field.getName().substring(1); Method getMethod = cls.getMethod(getterName, new Class[] {}); //這個對象字段get方法的值 Object value = getMethod.invoke(obj, new Object[] {}); sql.append(" WHERE ").append(field.getName()).append("="); if (field.getType().getName().equals(java.lang.String.class.getName())) { sql.append("'" + value + "'"); } else { sql.append(value); } } } System.out.println(sql.toString()); } public <T> void update(T obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class<? extends Object> cls = obj.getClass(); StringBuffer sql = new StringBuffer(); StringBuffer condition = new StringBuffer(); sql.append("UPDATE "); Table tbl = (Table) cls.getAnnotation(Table.class); if (null != tbl) { sql.append(tbl.name()); } else { sql.append(cls.getName().substring(cls.getName().lastIndexOf(".") + 1)); } sql.append(" SET "); Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { Property proper = field.getAnnotation(Property.class); // 獲得字段第一個字母大寫 String methodFirstLetter = field.getName().substring(0, 1).toUpperCase(); // 轉換成字段的get方法 String getterName = "get" + methodFirstLetter + field.getName().substring(1); Method getMethod = cls.getMethod(getterName, new Class[] {}); // 這個對象字段get方法的值 Object value = getMethod.invoke(obj, new Object[] {}); if (null != field.getAnnotation(ID.class)) { condition.append(" WHERE ").append(field.getName()).append("="); if (field.getType().getName().equals(java.lang.String.class.getName())) { condition.append("'" + value + "'"); } else { condition.append(value); } } else { String tmp = ""; if (field.getType().getName().equals(java.lang.String.class.getName())) { tmp = "'" + value + "'"; } else { tmp = value + ""; } if (null != proper) { sql.append(proper.name()).append("=").append(tmp).append(","); } else { sql.append(field.getName()).append("=").append(tmp).append(","); } } } sql.deleteCharAt(sql.length() - 1); sql.append(condition); System.out.println(sql.toString()); } public <T> void delete(T obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class<? extends Object> cls = obj.getClass(); StringBuffer sql = new StringBuffer(); sql.append("DELETE FROM "); Table tbl = (Table) cls.getAnnotation(Table.class); if (null != tbl) { sql.append(tbl.name()); } else { sql.append(cls.getName().substring(cls.getName().lastIndexOf(".") + 1)); } Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { if (null != field.getAnnotation(ID.class)) { // 獲得字段第一個字母大寫 String methodFirstLetter = field.getName().substring(0, 1).toUpperCase(); // 轉換成字段的get方法 String getterName = "get" + methodFirstLetter + field.getName().substring(1); Method getMethod = cls.getMethod(getterName, new Class[] {}); // 這個對象字段get方法的值 Object value = getMethod.invoke(obj, new Object[] {}); sql.append(" WHERE ").append(field.getName()).append("="); if (field.getType().getName().equals(java.lang.String.class.getName())) { sql.append("'" + value + "'"); } else { sql.append(value); } } } System.out.println(sql.toString()); } public void close() { System.out.println("SESSION CLOSE"); } }
簡易框架模仿hibernate,運算后的結果如下:

