JAVA反射机制自定义框架测试代码,留着以后复习用!
所有测试代码下载:http://download.csdn.net/detail/liangrui1988/5766647
主要重点代码
package accp.DaoImple;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.SortedMap;
import javax.servlet.jsp.jstl.sql.Result;
import javax.servlet.jsp.jstl.sql.ResultSupport;
import accp.ddlUtil.Constr;
import accp.ddlUtil.JDBCHeiper;
import accp.ddlUtil.OperaterType;
import accp.utli.IDMapping;
import accp.utli.MappingMapManager;
import accp.utli.PropertyMapping;
import accp.utli.UserMapManager;
import accp.vo.Users2;
public class BaseDao<T> implements IBaseDao<T> {
public Connection conn=null;
public ResultSet rs=null;
public CallableStatement cs=null;
public PreparedStatement ps=null;
public Statement st=null;
private UserMapManager xmlMapObj;//得到映射类
private IDMapping idMapping;//得到映射id
private Class clas;
/**
* 初始构造方法时得到使用类的类型
*/
public BaseDao(){
//加载配制文件mapping 静态块中的代码 得到Map集合
try {
Class.forName("accp.xml.LoadMappingXML");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 得到泛型的类
// 即 BaseDaoImpl<Users> 得到Users
//类的超类>>>现在类型的 论据
Type type=((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0];
clas=(Class<T>)type;
//得到映射类
System.err.println("clas: "+clas+" 得到映射类: "+clas.getName());
this.xmlMapObj=MappingMapManager.getMappingUserObject(clas.getName());
this.idMapping=xmlMapObj.getIdMaping();//得到映射id
}
/**
* 保存DAO
* 获得对象类路径 反射成对象
* 获得对象所有字段
* sql 语句的拼接
* sql 条件的赋值
*
*/
public boolean save(T obj) throws Exception{
boolean b=false;
//Class clas=obj.getClass();//反射生成类对象
//String tableName=clas.getSimpleName(); //得对对象名=表名;
String tableName=xmlMapObj.getTableMapping().getTabless();
//获取对象所有的字段
Field[] fields=clas.getDeclaredFields();
//列名
StringBuffer columnName=new StringBuffer();
//值
StringBuffer valuesColumnName= new StringBuffer();
//? 的值
//Object[] values= new Object[fields.length];
List<Object> valueList=new ArrayList<Object>();
//循环得值,给值
//int j=0;
for(int i=0;i<fields.length;i++){
Field f=fields[i];//字段值
//得到字段名 附加SQL语名
columnName.append(f.getName()+",");
//如是当前字段是主健
//否则加?
String idM=idMapping.getIdName();
if(idM.equalsIgnoreCase(f.getName())&&
null==f.getName()&&idMapping.getGenClass().equals("sequence"))
{
valuesColumnName.append(Constr.PubSquence_id);
}else{
//加入?
valuesColumnName.append("?,");
f.setAccessible(true);
//得到字段的值
//values[j]=f.get(obj);
valueList.add(f.get(obj));
//j++;
}
}
//拼接sql
System.out.println("columnName:"+columnName);
//去掉后面的,
String newcolumnName=columnName.substring(0, columnName.lastIndexOf(","));
StringBuffer sql=new StringBuffer();
sql.append("insert into "+tableName+"(");
sql.append(newcolumnName);
sql.append(") values(");
//要插入的值
String newvalueSql=valuesColumnName.substring(0,valuesColumnName.length()-1);
sql.append(newvalueSql+")");
System.out.println("SQL:"+sql.toString());
//执行sql
//把集合转为数组
Object[] objValue=new Object[valueList.size()];
for(int i=0;i<valueList.size();i++){
objValue[i]=valueList.get(i);
}
//System.out.println("objValue.length:)"+objValue.length);
b=executeUpdate(OperaterType.PreparedStatement, sql.toString(), objValue);
return b;
}
/**
* 跟据对象ID 删除
* 得到对象 反射
* 得到表名
* sql拼接
*/
public boolean deleteID(T obj) throws Exception{
//得到classMapping类的关联映射
//根据类路径(Key) 得到类的集合相关所有属性
//UserMapManager userMap=MappingMapManager.getMappingUserObject(obj.getClass().toString());
//String tableName=obj.getClass().getSimpleName();
//boolean b=false;
String tableName=xmlMapObj.getTableMapping().getTabless();//得到表名
System.out.println("tableName:"+tableName);
StringBuffer sql=new StringBuffer();
//条件
String ColumnID=idMapping.getIdColumn();
sql.append("delete "+tableName+" where "+ColumnID+" =?");
//反射得到字段的值
//Class clas=obj.getClass();
//得到id
Field field=clas.getDeclaredField(idMapping.getIdName());
field.setAccessible(true);
//得到id
Object Oid=field.get(obj);
//执行sql
boolean b=executeUpdate(OperaterType.PreparedStatement, sql.toString(), Oid);
return b;
}
/**
* executeUpdate执行语句方法
*/
public boolean executeUpdate(OperaterType oper,String sql,Object...objs) {
//OperaterType判断是何种SQL操作
boolean b=false;
try {
//获得连接
conn=JDBCHeiper.getConnections();
if(conn==null){
System.out.println("conn is null....");
return false;
}
//statemnt
if(OperaterType.Statement.equals(oper)){
st=conn.createStatement();
int count=st.executeUpdate(sql);
if(count>0)b=true;
}
//prepareStatement
if(OperaterType.PreparedStatement.equals(oper)){
ps=conn.prepareStatement(sql);
//条件赋值
if(null!=objs&&objs.length>0){
for(int i=0;i<objs.length;i++){
System.out.println("objs:"+i+": "+objs[i]);
ps.setObject(i+1, objs[i]);
}
}
int count=ps.executeUpdate();
if(count>0)b=true;
}
//callableSatement存储过程
if(OperaterType.CallAbleSatment.equals(oper)){
cs=conn.prepareCall(sql);
//处理存储过程
}
} catch (Exception e) {
System.err.println("SQL执行语句出错!");
e.printStackTrace();
}finally{
JDBCHeiper.getCloseConn(conn, rs, cs, ps, st);
}
return b;
}
//查询x
public List getQuery(T obj) throws Exception{
/**
* 得到表名
* 行
*/
List list=new ArrayList();
//String tableName=obj.getClass().getSimpleName();
String tableName=xmlMapObj.getTableMapping().getTabless();
System.out.println("tableName: "+tableName);
//Class clas=obj.getClass();
Field[] fileds=clas.getDeclaredFields();//得到所有的字段
List<Object> valueList=new ArrayList<Object>(0);
/**
* 如有子段不为空,就在Where 后面加上and 字段名=?
* 用valueList来存储
* 否则就一需要加
*/
StringBuffer columnName=new StringBuffer();
for(int i=0;i<fileds.length;i++){
Field field=fileds[i];
field.setAccessible(true);
Object obje=field.get(obj);
if(obje==null){
obje="";}
/**
* 根据属性名得到字段名
*/
String colName=getColumnNameByFieldName(field,idMapping.getIdName());
if(null!=obje&&!"".equals(obje)){
System.out.println(obje);
System.out.println("object对象不为空!!!!!!!!");
columnName.append(" and "+colName+"=?");
valueList.add(obje);//加入值
}
}
//sqlexecte
StringBuffer sql=new StringBuffer();
sql.append("select * from "+tableName+" where 1=1 ");
//and 条件
sql.append(columnName);
System.out.println(sql.toString());
//赋值反回
/*
* 离线式数据集 ,在我们的数据库关闭之后,数据不会丢失
* 在线式数据集,在关闭后会丢失
*/
Object ojbS=clas.newInstance();//对象的实列
Result rst=JDBCHeiper.executeQuery(sql.toString(),valueList);
int count=rst.getRowCount(); //多少行
System.out.println("行:"+count);
SortedMap[] sMap=rst.getRows();// 获得每一行的数据
//读取每一行的数据;
for(int i=0;i<sMap.length;i++){
//读取数据
Object resultObj=clas.newInstance();//得到的对象
SortedMap sm=sMap[i];
System.out.println("BaseDao.getQuery()"+sm);
//得到对象所有的字段=每列的字段
Field[] fs=clas.getDeclaredFields();
for(int j=0;j<fs.length;j++){
Field f=fs[j];
f.setAccessible(true);
//设置值
//System.out.println("xxxxxxxxxxxxx");
setValue(resultObj,f,sm.get(f.getName()));
}
list.add(resultObj);
}
return list;
}
//类型判断换
private void setValue(Object o,Field field,Object value) throws Exception{
if(value!=null){
String type = field.getType().getSimpleName();
if(type.equals("Integer")){
if(value instanceof BigDecimal) {
BigDecimal bd = (BigDecimal)value;
field.set(o, new Integer(bd.intValue()));
}
if(value instanceof Long){
Long l = (Long)value;
field.set(o, new Integer(l.intValue()));
}
if(value instanceof Integer) {
field.set(o,value);
}
}
if(type.equals("long")){
if(value instanceof BigDecimal){
BigDecimal bd = (BigDecimal)value;
field.set(o, new Long(bd.longValue()));
}
if(value instanceof Integer){
Integer intt = (Integer)value;
field.set(o, new Long(intt.longValue()));
}
if(value instanceof Long){
field.set(o, value);
}
}
if(type.equals("Float")){
//field.set(o, Float.parseFloat(value.toString()));
/*if(value instanceof BigDecimal) {
BigDecimal bd = (BigDecimal)value;
field.set(o, new Float(bd.intValue()));
}
if(value instanceof Long){
Long l = (Long)value;
field.set(o, new Float(l.intValue()));
}
if(value instanceof Integer) {
Integer intv = (Integer)value;
field.set(o, new Float(intv.intValue()));
}
if(value instanceof Integer) {
Integer intv = (Integer)value;
field.set(o, new Float(intv.intValue()));
}*/
//System.out.println("Float的类型");
field.set(o, Float.parseFloat(value.toString()));
}
if(type.endsWith("Timstamp")){
//method.invoke(o,new Object[]{(Timestamp)value});
field.set(o, new Date(((Timestamp)value).getTime()));
}
if(type.endsWith("Date")){
if(value instanceof Timestamp){
//method.invoke(o,new Object[]{new Date(((Timestamp)value).getTime())});
field.set(o, new Date(((Timestamp)value).getTime()));
}else if(value instanceof Date){
field.set(o, (Date)value);
}
}
if(type.equals("double")){
//method.invoke(o,new Object[]{(Double)value});
field.set(o, value);
}
if(type.endsWith("String")){
//method.invoke(o,new Object[]{(String)value});
field.set(o, value.toString());
}
}
}
//修改
@Override
public boolean update(T obj) {
// TODO Auto-generated method stub
return false;
}
/**
* 根据属性名得到字段名
*/
public String getColumnNameByFieldName(Field field,String colN){
String colName="";
if(field.getName().equals(colN)){
colName=colN;
}else{
// 得到所有的属性映射
PropertyMapping proM=xmlMapObj.getMap(field.getName());
// 如该字段在hbm.xml 中有配置则得到字段名
// 否则默认为属性名
if(proM!=null){
colName=proM.getProColumn();
}else{
colName=field.getName();
}
}
return colName;
}
}