反射可以做什么?
1:通用的操作, jdbc 添删改查
class 反射他的属性方法
所有表的添删改查
统一的规范 :
t_user 主键 取序列名 seq_User
User 的属性, 与表的列进行一一对应
eg:
1.有一个Auth类,有 privateintid; privateStringname;privateintparentId;
privateStringurl; privateStringstatus;属性,并在数据库中有符合统一规范的t_auth表及字段与数据
2.以下是userdao接口和UserDaoImpl接口实现以及测试的写法
package com.zt.dao;
import java.io.Serializable;
/*
* BaseDao 封装一个底层的添删改查 方法
* 适用与任意一个符合
* 定义统一 规范 eg:表名为t_User 主键为id 序列值为seq_User
User的属性 与表列 进行一一对应
这个规范的类与表
* */
public interface BaseDao {
// 添删改查 方法
public boolean addObject(Object obj);
public boolean updateObject(Object obj,
Serializable id);
public Object getById(Class clzz,Serializable id);
// 查序列的方法
public int getSeqValue(Object obj);
}
package com.zt.dao.impl;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import com.zt.dao.BaseDao;
import com.zt.db.DBUtls;
public class BaseDaoImpl implements BaseDao {
public boolean addObject(Object obj) {
//反射+规范 获取对象对应的表
Class c=obj.getClass();
String tableName="t_"+c.getSimpleName();
//反射对象里面的属性 对应表的字段
Field fs[]=c.getDeclaredFields();
//获取对象上的每个属性与 属性对应的值
// 封装到集合 property 与 values 中
List property=new ArrayList();
List values=new ArrayList();
for(Field f:fs){
try {
f.setAccessible(true); //打开私有属性
property.add(f.getName());
// 以下用到了Field属性中的一个 get(对象名) 方法,是获取属性对应对象上的值
values.add(f.get(obj));
} catch (Exception e) {
e.printStackTrace();
}
}
//拼凑jdbc操作的sql 根据规范
StringBuffer sb=new StringBuffer("insert into ");
sb.append(tableName);
sb.append("(");
String str="";
for(int i=0;i<property.size();i++){
if(i<property.size()-1){
sb.append(property.get(i)+",");
str+="?,";
}else{
sb.append(property.get(i));
str+="?";
}
}
sb.append(") values(");
sb.append(str);
sb.append(")");
//System.out.println(sb.toString());
Connection conn=null;
PreparedStatement pstmt=null;
boolean result=true;
try{
conn=DBUtls.getConnection();
//注意:StringBuffer必须调用.toString()方法才可以转化为字符串
pstmt=conn.prepareStatement(sb.toString());
for(int i=0;i<values.size();i++){
pstmt.setObject(i+1, values.get(i));
}
pstmt.executeUpdate();
}catch(Exception e){
result=false;
}finally{
DBUtls.close(null, pstmt, conn);
}
return result;
}
@Override
public int getSeqValue(Object obj) {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean updateObject(Object obj, Serializable id) {
// TODO Auto-generated method stub
return false;
}
@Override
public Object getById(Class clzz, Serializable id) {
StringBuffer sql=new StringBuffer("select * from ");
String tableName="t_"+clzz.getSimpleName();
sql.append(tableName);
sql.append(" where id="+id);
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;Object obj=null;
try{
conn=DBUtls.getConnection();
pstmt=conn.prepareStatement(sql.toString());
rs=pstmt.executeQuery();
while(rs.next()){
obj=clzz.newInstance();
Field fs[]= clzz.getDeclaredFields();
for(Field f:fs){
f.setAccessible(true);
// 以下用到了Field属性中的一个set(对象名,value) 方法,是 给对象的属性设置属性值
if(f.getType()==int.class){
f.set(obj, rs.getInt(f.getName()));
}
if(f.getType()==long.class){
f.set(obj, rs.getLong(f.getName()));
}
if(f.getType()==double.class){
f.set(obj, rs.getDouble(f.getName()));
}
if(f.getType()==String.class){
f.set(obj, rs.getString(f.getName()));
}
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
DBUtls.close(rs, pstmt, conn);
}
return obj;
}
}
package com.zt.test;
import com.zt.dao.BaseDao;
import com.zt.dao.impl.BaseDaoImpl;
import com.zt.po.Address;
import com.zt.po.Auth;
public class Test {
public static void main(String[] args) {
// 测试添加方法
Auth auth=new Auth();
auth.setId(50);
auth.setName("aa");
auth.setParentId(1);
auth.setUrl("index");
auth.setStatus("1");
BaseDao dao=new BaseDaoImpl();
boolean f=dao.addObject(auth);
System.out.println(f);
// 测试通过id查找方法
Auth auth1=(Auth)dao.getById(Auth.class, 22);
System.out.println(auth1);
}
}