zoukankan      html  css  js  c++  java
  • JAVA描述的简单ORM框架

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

  • 相关阅读:
    Attach Files to Objects 将文件附加到对象
    Provide Several View Variants for End-Users 为最终用户提供多个视图变体
    Audit Object Changes 审核对象更改
    Toggle the WinForms Ribbon Interface 切换 WinForms 功能区界面
    Change Style of Navigation Items 更改导航项的样式
    Apply Grouping to List View Data 将分组应用于列表视图数据
    Choose the WinForms UI Type 选择 WinForms UI 类型
    Filter List Views 筛选器列表视图
    Make a List View Editable 使列表视图可编辑
    Add a Preview to a List View将预览添加到列表视图
  • 原文地址:https://www.cnblogs.com/m2492565210/p/7127525.html
Copyright © 2011-2022 走看看