《一: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;
}
}
}