代码路径: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,运算后的结果如下: