javaWeb-javaBean+内省机制+模拟Hibernate的CRUD操作

来源:互联网 发布:mac怎么强制退出软件 编辑:程序博客网 时间:2024/06/04 23:35

《一:javaBean》

1.类的要求:必须是public修饰的类,且存在公共无参构造器。2.属性的要求:Field:成员变量,必须用private修饰,property:为了外界方便操作字段而提供的一个东西,getter/setter决定的、3.属性的读取和写入规范:    读取(getter):public修饰.有返回.方法名以get/is作为前缀,无参数    写入(setter):   public修饰,无返回,方法名以set作为前缀,有参数

《二:内省机制》

//获取指定JavaBean信息,stopClass(常写Object)中不获取,但只要满足了get/set规范,父类中的也会获取,public static BeanInfo getBeanInfo(Class<?> beanClass, Class<?>stopClass);//获取JavaBean所有的属性描述器PropertyDescriptor[] getPropertyDescriptors();

利用内性机制,获取User类中的所有属性:

BeanInfo beanInfo = Introspector.getBeanInfo(User.class,Object.class);PropetyDescriptor[] pds = beanInfo.getPropertyDescriptors();    for(PropertyDescriptor pd: pds){       String propertyName = pd.getName();//获取属性名       Object val = pd.getReadMethod().invoke(obj);//调用getter方法,obj调用    }

《三:利用内省机制模拟Hibernate的CRUD操作》

package com._520it.hibernateMock;import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.Field;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import com._520it.dao.IResultSetHandler;import com._520it.domain.Student;import com._520it.hibernateMock.annotation.Id;import com._520it.hibernateMock.annotation.Table;import com._520it.util.template.JdbcTemplate;/** * 模拟HibernateCRUD操作 *  * @author lq *  */@SuppressWarnings("all")public class HibernateMock {    /**     * 保存指定的学生对象     *      * @param stu     *            需要保存的学生对象     * @param obj     *            保存的对象     */    // @SuppressWarnings("unchecked")    public int save(Object obj) {        //insert into table_name (name) value (...)        try {                                                                                           //sql语句中的骨干固定部分(视不同方法而定)            StringBuilder sql = new StringBuilder();                                                    //sql语句中对应表的列的属性名(内省机制+obj得到)            StringBuilder columnSql = new StringBuilder();                                              //sql语句中的占位符?(内省机制+属性计数)            StringBuilder placeHolderSql = new StringBuilder();                                         //sql语句中的参数(内省机制+obj得到)            List<Object> params = new ArrayList<>();                                                    //tableName是根据对象类名或者注解得到的真实数据库中的表名(类中附有相对应表名的注解)            String tableName = obj.getClass().getSimpleName();                                          Table table = obj.getClass().getAnnotation(Table.class);                if (table != null) {                //若有注解,获取对象真正映射的表名                tableName = table.value();                                                              }            //拼表名            sql.append("INSERT INTO ").append(tableName).append(" ");                                   String primaryName = " ";            Field[] fields = obj.getClass().getDeclaredFields();            for (Field field : fields) {                if (field.isAnnotationPresent(Id.class)) {                      //获取主键值                    primaryName = field.getAnnotation(Id.class).value();                                        }            }            //获取传入的对象的属性信息            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass(),                    Object.class);             //获取属性描述器数组            PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();                               for (PropertyDescriptor pd : pds) {                String propertyName = pd.getName();                if (!primaryName.equals(propertyName)) {                    columnSql.append(propertyName).append(",");                    placeHolderSql.append("?").append(",");                    params.add(pd.getReadMethod().invoke(obj));                }            }            columnSql.deleteCharAt(columnSql.length() - 1);            placeHolderSql.deleteCharAt(placeHolderSql.length() - 1);            //拼列名            sql.append("(").append(columnSql).append(") value(");                       //拼占位符            sql.append(placeHolderSql).append(")");                                                     return JdbcTemplate.newInstance().update(sql.toString(),                    params.toArray());        } catch (Exception e) {            e.printStackTrace();        }        return 0;    }    /**     * 删除指定id的学生对象     *      * @param id     *            指定删除学生的id     */    public int delete(Class objClass, Long id) {        // delete from table_name where id = ?        try {            StringBuilder sql = new StringBuilder();            String tableName = objClass.getSimpleName();            Table table = (Table) objClass.getAnnotation(Table.class);            if (table != null) {                tableName = table.value();            }            sql.append("DELETE FROM ").append(tableName).append(" WHERE ");            String primaryName = "";            Field[] fields = objClass.getDeclaredFields();            for (Field field : fields) {                if (field.isAnnotationPresent(Id.class)) {                    primaryName = field.getAnnotation(Id.class).value();                }            }            sql.append(primaryName).append(" = ").append("?");            return JdbcTemplate.newInstance().update(sql.toString(), id);        } catch (Exception e) {            e.printStackTrace();        }        return 0;    }    /**     * 更新指定学生对象     *      * @param newStu     *            新的学生对象(id)与原来学生相同     */    public int update(Object newObj) {        // update student set name = ?, age= ? where id = ?        try {            StringBuilder sql = new StringBuilder();            List<Object> params = new ArrayList<>();            String tableName = newObj.getClass().getSimpleName();            Table table = newObj.getClass().getAnnotation(Table.class);            if (table != null) {                tableName = table.value();            }            sql.append("UPDATE ").append(tableName).append(" SET ");            String primaryName = "";            String primary = "";            Field[] field = newObj.getClass().getDeclaredFields();            for (Field f : field) {                if(f.isAnnotationPresent(Id.class)){                    primaryName = f.getAnnotation(Id.class).value();                }            }            BeanInfo beanInfo = Introspector.getBeanInfo(newObj.getClass(), Object.class);            PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();            for (PropertyDescriptor pd : pds) {                String propertyName = pd.getName();                if(!propertyName.equals(primaryName)){                    String name = pd.getName();                    Object val = pd.getReadMethod().invoke(newObj);                    sql.append(name).append(" = ").append("?, ");                    params.add(val);                }else{                    primary = pd.getReadMethod().invoke(newObj).toString();                }            }            params.add(primary);            sql.deleteCharAt(sql.length() - 2);            sql.append("WHERE ").append(primaryName).append(" = ?");            return JdbcTemplate.newInstance().update(sql.toString(), params.toArray());        } catch (Exception e) {            e.printStackTrace();        }        return 0;    }    /**     * 查询指定id的学生对象     *      * @param id     *            需要查询的学生id     * @return 如果该id对应的学生存在则返回,否则返回null     */    public List<Student> get(Class objClass, Long id) {        try {            //SELECT * FROM student WHERE id = ?            StringBuilder sql = new StringBuilder();            String tableName = objClass.getSimpleName();            Table table = (Table) objClass.getAnnotation(Table.class);            if(table != null){                tableName = table.value();            }            sql.append("SELECT * FROM ").append(tableName).append(" WHERE ");            String primaryName = "";            Field[] fields = objClass.getDeclaredFields();            for (Field field : fields) {                if(field.isAnnotationPresent(Id.class)){                    primaryName = field.getAnnotation(Id.class).value();                }            }            sql.append(primaryName).append(" = ").append("?");            return JdbcTemplate.newInstance().query(sql.toString(), new ResultSetHandler(), id);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 查询所有的学生对象     *      * @return 返回所有学生对象集合,若没有学生对象,则返回一个空集     */    public List<Student> getAll(Class objClass) {        //SELECT * FROM student        StringBuilder sql = new StringBuilder();        String tableName = objClass.getSimpleName();        Table table = (Table) objClass.getAnnotation(Table.class);        if(table != null){            tableName = table.value();        }        sql.append("SELECT * FROM ").append(tableName);        return JdbcTemplate.newInstance().query(sql.toString(),new ResultSetHandler());    }    /**     * 处理学生结果集的结果集处理器类     * @author lq     *     */    class ResultSetHandler implements IResultSetHandler<List<Student>>{        public List<Student> handle(ResultSet rs) throws Exception {            List<Student> list = new ArrayList<>();            while (rs.next()){                Student stu = new Student();                list.add(stu);                stu.setId(rs.getLong("id"));                stu.setName(rs.getString("name"));                stu.setAge(rs.getInt("age"));            }            return list;        }    }}