知识点
1. 反射:类在运行期间,把类中成员抽取为其他类的过程就是反射。
2. 应用场景: 设计框架。
3. 反射类Class的获取方式:[1]类名.class [2]Class.forName("类路径")[3]对象.getClass()
4. Class类中常用的方法:
[1]获取类的实例 clazz.newInstance()
[2]获取类上的注解对象: clazz.getAnnotation(注解.class)
[3]获取类的名称: clazz.getSimpleName()
5. Method类对象的获取:
[1]clazz.getMethods():获取本类以及父类中所有Public修饰的方法
[2]clazz.getMethod("方法名",Class...参数类型):获取本类以及父类中指定的public修饰的方法
[3]clazz.getDeclaredMethods():获取本类中所有的方法
[4]clazz.getDeclaredMethod("方法名",Class...参数类型):获取本类中指定的方法
6. Method类中常用的方法。
[1]method.invoke(Object o,参数值):执行该方法
[2]method.getName():获取方法名
[3]method.getAnnotation(注解.class):获取方法上的注解
7. Field对象的获取
[1]clazz.getFields():获取本类以及父类中所有Public修饰的属性
[2]clazz.getField("属性名"):获取本类以及父类中指定的public修饰的属性
[3]clazz.getDeclaredFields():获取本类中所有的属性
[4]clazz.getDeclaredField("属性名"):获取本类中指定的属性
8. 常用的方法:
[1]field.setAccessible(true):设置允许访问私有成员
[2]field.set(Object o,值):为属性赋值
[3]field.getAnnotation(注解.class):获取属性上的注解
[4]field.getName():获取属性名
通用添加
通用添加功能:sql语句 insert into 表名(列名...) values(值...)
public int insert(T t) throws Exception{
StringBuffer sql = new StringBuffer("insert into ");//创建sql数组
Class<?> aClass = t.getClass();//获取反射类class
String simpleName = aClass.getSimpleName();//获取类的名称
TableName annotation = aClass.getAnnotation(TableName.class);//获取类上的注解对象
if (annotation!=null){
simpleName=annotation.value();
}
sql.append(simpleName);
ArrayList<Object> objects = new ArrayList<>();//创建一个储存对象
ArrayList<Object> objects1 = new ArrayList<>();
Field[] declaredFields = aClass.getDeclaredFields();//获取本类中的所有属性
for (Field field:declaredFields){
field.setAccessible(true);//设计允许访问私有成员
String name = field.getName();//获取属性名
TableId annotation1 = field.getAnnotation(TableId.class);//获取属性上的注解
TableField annotation2 = field.getAnnotation(TableField.class);
if (annotation1!=null){
continue;
}
if (annotation2!=null){
name=annotation2.value();
}
Object o = field.get(t);
objects.add(name);
objects1.add("'"+o+"'");
}
//组合完整sql语句
String replace = objects.toString().replace("[", "(").replace("]", ")");
String replace1 = objects1.toString().replace("[", "(").replace("]", ")");
sql.append(replace+" values "+replace1);
//运行sql语句
Connection connection = DbUtil.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(sql.toString());
int i = preparedStatement.executeUpdate();
return i;
}
通用修改
通用update语句 update 数据表名称 set 数据列=新数据值,.... where 主键
public int update(T t) throws Exception{
//创建新数组
StringBuffer sql = new StringBuffer("update ");
//获取反射类
Class<?> aClass = t.getClass();
//获取类名称
String simpleName = aClass.getSimpleName();
//获取类注释对象
TableName annotation = aClass.getAnnotation(TableName.class);
if (annotation!=null){
simpleName=annotation.value();
}
sql.append(simpleName+" set ");
String where=" where ";
//获取类所有属性
Field[] declaredFields = aClass.getDeclaredFields();
for (Field field:declaredFields){
//允许访问私有成员
field.setAccessible(true);
//获取属性名
String name = field.getName();
//获取属性注解
TableField annotation1 = field.getAnnotation(TableField.class);
TableId annotation2 = field.getAnnotation(TableId.class);
//获取类中的值
Object o = field.get(t);
if (annotation1!=null){
name=annotation1.value();
}
if (annotation2!=null){
String value = annotation2.value();
where+=value+"='"+o+"'";
continue;
}
sql.append(name+"='"+o+"',");
}
//删去数组中最后一个“,”标点后添加数组
sql.deleteCharAt(sql.length()-1).append(where);
Connection connection = DbUtil.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(sql.toString());
System.out.println(sql);
int i = preparedStatement.executeUpdate();
return i;
}
通用查询(id)
public T selectById(Object id) throws Exception{
StringBuffer sql=new StringBuffer("select * from ");
//获取表名
String tableName=clazz.getSimpleName();
TableName annotation = clazz.getAnnotation(TableName.class);
if(annotation!=null){
tableName=annotation.value();
}
sql.append(tableName+" where ");
//获取主键列名
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field:declaredFields){
TableId tableId = field.getAnnotation(TableId.class);
if(tableId!=null){
sql.append(tableId.value()+"="+id);
break;
}
}
//执行sql语句
Connection conn = DbUtil.getConnection();
PreparedStatement ps = conn.prepareStatement(sql.toString());
ResultSet rs = ps.executeQuery();
//封装数据到实体类
while(rs.next()){
T t=clazz.newInstance();
for (Field field:declaredFields){
field.setAccessible(true);
TableField tableField = field.getAnnotation(TableField.class);
TableId tableId = field.getAnnotation(TableId.class);
//获取属性名
String name = field.getName();
if(tableId!=null){
name=tableId.value();
}
if(tableField!=null){
name=tableField.value();
}
//获取数据库中指定列的值
Object v = rs.getObject(name);
//为指定对象的属性赋值
field.set(t,v);
System.out.println(v);
}
System.out.println(t);
return t;
}
return null;
}
通用查询(全部)
public List<T> selectAll()throws Exception{
List<T> list=new ArrayList<>();
StringBuffer sql=new StringBuffer("select * from ");
//获取表名
String tableName=clazz.getSimpleName();
TableName annotation = clazz.getAnnotation(TableName.class);
if(annotation!=null){
tableName=annotation.value();
}
sql.append(tableName);
//执行sql语句
Connection conn = DbUtil.getConnection();
PreparedStatement ps = conn.prepareStatement(sql.toString());
ResultSet rs = ps.executeQuery();
Field[] declaredFields = clazz.getDeclaredFields();
//封装数据
while (rs.next()){
T t=clazz.newInstance();
//为实体类的属性赋值
for (Field field:declaredFields){
field.setAccessible(true);
TableField tableField = field.getAnnotation(TableField.class);
TableId tableId = field.getAnnotation(TableId.class);
//获取属性名
String name = field.getName();
if(tableId!=null){
name=tableId.value();
}
if(tableField!=null){
name=tableField.value();
}
//获取数据库中指定列的值
Object v = rs.getObject(name);
//为指定对象的属性赋值
field.set(t,v);
}
list.add(t);
}
System.out.println(list);
return list;
}