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; } }}
阅读全文
0 0
- javaWeb-javaBean+内省机制+模拟Hibernate的CRUD操作
- javaBean的内省机制
- JAVABean的内省操作
- javaBean的内省操作
- javaBean的内省操作
- javaBean的内省操作
- javaBean的内省操作
- JavaBean的内省操作
- JavaBean的内省操作
- javabean的内省操作
- JAVABean的内省操作
- 《JavaBean》-----Java的内省机制
- JavaBean的简单内省操作
- 内省 操作javabean的属性
- JavaBean的复杂内省操作
- 内省操作javabean的属性
- 内省操作javabean的属性
- JavaBean内省:认识JavaBean与内省、对JavaBean的内省操作、Beanutils工具包
- Spring黑马笔记入门六
- 从零开始的刷机(烧录系统到开发板)
- [Python] Python与Excel--只读|只写|读写|创建图表
- This application’s application-identifier entitlement does not match that of the installed applicati
- DSP程序死机(跑飞)的一些情况-软件原因
- javaWeb-javaBean+内省机制+模拟Hibernate的CRUD操作
- python-nmap 帮助文档
- LeetCode 215. Kth Largest Element in an Array
- PTA 2.4
- 接下来要做的事
- 自定义控件View的使用
- 《CSS Mastery》 Chapter 1 问题解决
- CSS(十) 设置超链接样式
- java高级工作流,程序调优,负载均衡,Solr集群与应用,主从复制,中间件,全文检索