JAVA反射機制自定義框架測試程式碼,留著以後複習用!
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;
}
}
相關文章
- ssh三大框架,三層架構 整合測試!完整分頁程式碼,JdbcTemplate等測試,儲存過程呼叫,留著以後複習吧框架架構JDBC儲存過程
- 單元測試&反射機制(未完結)反射
- Java學習十七—反射機制:解鎖程式碼的無限可能Java反射
- java反射機制的學習心得Java反射
- Java 反射機制學習資料Java反射
- Java學習之反射機制及應用場景Java反射
- Java反射機制Java反射
- Java 反射機制應用實踐Java反射
- Java反射機制應用實踐Java反射
- java框架基礎技術之--------反射機制Java框架反射
- 軟體測試學習教程——Python實現反射機制Python反射
- C語言[工程專案應用]gtest測試框架編寫以及自定義測試框架C語言框架
- Java 反射測試Java反射
- JAVA的反射機制==>用反射分析類的實現Java反射
- 從Java反射機制到Android註解框架Java反射Android框架
- Java核心反射機制Java反射
- java利器——反射機制Java反射
- Java的反射機制Java反射
- Java反射機制(轉)Java反射
- Java反射機制研究Java反射
- SQLServer錯誤程式碼及解釋(留著備用)SQLServer
- 讀懂框架設計的靈魂—Java反射機制框架Java反射
- 用Java反射機制模擬hibernateJDBC操作Java反射JDBC
- Java反射機制那些事Java反射
- Java 中的 反射機制Java反射
- Java反射機制簡答Java反射
- 說說 Java 反射機制Java反射
- JAVA(五)反射機制/AnnotationJava反射
- Java 反射機制分析指南Java反射
- Java 反射機制詳解Java反射
- SQL Server錯誤程式碼及解釋(留著備用)SQLServer
- 反射機制及應用反射
- 跟著辛星用PHP的反射機制來實現外掛PHP反射
- Java自定義Annotation,通過反射解析AnnotationJava反射
- Java中的類反射機制Java反射
- Java筆記-反射機制(一)Java筆記反射
- java進階(41)--反射機制Java反射
- 淺析java的反射機制Java反射