1. 程式人生 > >java使用反射實現對資料庫的增刪改查

java使用反射實現對資料庫的增刪改查

CurrentUtil 是一個分頁工具類  在查詢的時候使用

介面

package com.dao;


import java.util.List;


import com.util.CurrentUtil;


public interface BaseDao<T> {


/**
*@param t
*@return
*@作者Administrator
*@作用 資料庫新增
*@要求 類名與資料庫表名一致,欄位名以及型別與屬性一致
*/
public<T> int add(T t);

/**
*@param t
*@return
*@作者Administrator
*@作用 資料庫修改
*@要求 主鍵Id加註解 註解明為IsId 
*/
public<T> int update(T t);

/**
*@param t
*@return
*@作者Administrator
*@作用 刪除資料
*@要求 主鍵Id加註解 註解明為IsId 且為第一個註解
*/
public<T> int delete(T... t);


/**
*@param cu
*@return
*@作者Administrator
*@作用 根據工具類來獲取當前頁資料
*/
public<T> List<T> query(CurrentUtil cu);



/**
*@param t
*@return
*@作者Administrator
*@作用 根據傳入的類的物件來簡易獲取表裡面的資料條數
*/
public<T> int queryCount(T t);
}     

實現類

package com.dao.impl;


import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


import com.dao.BaseDao;
import com.util.CurrentUtil;
import com.util.JdbcUtil;
import com.util.JdbcUtil2;

public class BaseDaoImpl implements BaseDao{

private Connection con;

/** (non-Javadoc)
* @see com.dao.BaseDao#add(java.lang.Object)
* 新增資料
*/
public int add(Object t) {

PreparedStatement pre=null;
try{
Class<? extends Object> c=t.getClass();
StringBuffer sb=new StringBuffer("insert into ");
String tableName=c.getSimpleName();//獲取類名 即為 表名
sb.append(tableName+" (");

Field[] fields=c.getDeclaredFields();//獲取所有屬性陣列
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
sb.append(fields[i].getName());
if(i!=fields.length-1){
sb.append(",");
}
}
sb.append(") values(");
for (int i = 0; i < fields.length; i++) {
sb.append("?");
if(i!=fields.length-1){
sb.append(",");
}else{
sb.append(")");
}
}
pre = JdbcUtil.getOracleCon().prepareStatement(sb.toString());
for (int i = 0; i < fields.length; i++) {
Object o=fields[i].get(t);//獲取屬性值
String type=fields[i].getType().getSimpleName();//獲取屬性型別
if("String".equals(type)){
if(o==null){
pre.setString((i+1),"");
}else{
pre.setString((i+1), o.toString());
}
}else if("int".equals(type)){
if(o==null){
pre.setInt((i+1),0);
}else{
pre.setInt(i+1, Integer.parseInt(o.toString()));
}
}else if("float".equals(type)){
if(o==null){
pre.setFloat((i+1),0f);
}else{
pre.setFloat(i+1,Float.parseFloat(o.toString()));
}
}else if("Date".equals(type)){
if(o==null){
pre.setDate((i+1),new Date(0));
}else{
pre.setDate(i+1,Date.valueOf(o.toString()));
}
}
}
return pre.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.closeCon(null, pre, null);
}
return 0;
}

/** (non-Javadoc)
* @see com.dao.BaseDao#update(java.lang.Object)
* 修改資料
* 要求 必須在主鍵上加註註解 註解為 IsId
*/
public int update(Object t) {
PreparedStatement pre=null;
try{
Class<? extends Object> c=t.getClass(); //載入反射
StringBuffer sb=new StringBuffer("update ");
String tableName=c.getSimpleName();//獲取類名 即為 表名
sb.append(tableName+" t set ");
String id="";//主鍵Id
String idValue="";//主鍵Id值
String sql="";
Object obj=null;
Field[] fields=c.getDeclaredFields();//獲取屬性列表
for (int j = 0; j < fields.length; j++) {
fields[j].setAccessible(true);
obj=fields[j].get(t);//獲取屬性
String type=fields[j].getType().getSimpleName();//獲取屬性型別
String tname=fields[j].getName();//獲取屬性名
if(obj!=null){
if(fields[j].getDeclaredAnnotations().length<1||!"IsId".equals(fields[j].getAnnotations()[0].annotationType().getSimpleName())){
if("String".equals(type)){
sb.append(tname+"='"+obj+"',");
}else if("Date".equals(type)){
sb.append(tname+"=to_date('"+obj+"','yyyy-mm-dd'),");
}else{
sb.append(tname+"="+obj+",");
}
// else if("int".equals(type)){
// sb.append(tname+"="+obj+",");
// }else if("float".equals(type)){
// sb.append(tname+"="+obj+",");
// }else if("Date".equals(type)){
// sb.append(tname+"="+obj+",");
// }else if("double".equals(type)){
// sb.append(tname+"="+obj+",");
// }
}else{ //判斷如果有註解 則認定此是主鍵Id 獲取到相應的值以便之後使用
idValue=obj.toString();
id=tname;
}
}
}
sb=new StringBuffer(sb.substring(0,sb.lastIndexOf(",")));
sb.append(" where t."+id+"='"+idValue+"'");
sql=sb.toString();
pre=JdbcUtil.getOracleCon().prepareStatement(sql);
return pre.executeUpdate();
}catch(Exception e){
e.printStackTrace();
return 0;
}finally{
JdbcUtil.closeCon(null, pre, null);
}

}


/** (non-Javadoc)
* @see com.dao.BaseDao#delete(T[])
* 資料庫刪除
* 主鍵Id加註解
*/
public int delete(Object... t) {
PreparedStatement pre=null;
try{
Class<? extends Object> c=t[0].getClass();
StringBuffer sb=new StringBuffer("delete ");
String tableName=c.getSimpleName();//獲取類名 即為 表名
sb.append(tableName+" t where t.");
String id="";
String sql="";
boolean isFirst=true;
Object obj=null;
for (int i = 0; i < t.length; i++) {
Class<? extends Object> cs=t[i].getClass();
Field[] fields=cs.getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
fields[j].setAccessible(true);
obj=fields[j].get(t[i]);
if(obj==null){
continue;
}
if(fields[j].getDeclaredAnnotations().length>0&&"IsId".equals(fields[j].getAnnotations()[0].annotationType().getSimpleName())){
id=fields[j].getName();
if(isFirst){
sb.append(id+" in (");
isFirst=false;
}
sb.append("'"+obj+"'");
if(i!=t.length-1){
sb.append(",");
}else{
sb.append(")");
}
}

}
}
sql=sb.toString();
pre=JdbcUtil.getOracleCon().prepareStatement(sql);
return pre.executeUpdate();
}catch(Exception e){
e.printStackTrace();
return 0;
}finally{
JdbcUtil.closeCon(null, pre, null);
}
}


/** (non-Javadoc)
* @see com.dao.BaseDao#query(com.util.CurrentUtil)
* @要求 工具類要有一個Object 屬性,該屬性需初始化要查詢的表的一個物件,如果該物件的String屬性都沒值則會返回該表當前頁的資料
* 預設一頁顯示為全部
*/
public List<?> query(CurrentUtil cu) {
PreparedStatement pre = null;// 定義預編譯語句物件
ResultSet result = null;// 定義一個結果集物件
List list=new ArrayList(); //定義返回集合
String sql="";
Object obj=cu.t;
try{
Class<?> c=obj.getClass(); //根據類名獲取Class物件
String cName=c.getSimpleName(); //獲取簡寫的類名 即為表名
StringBuffer sb=new StringBuffer("select * from (select t.*,rownum r from "+cName+" t where 1=1 ");
Field[] fields=c.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
Object value=fields[i].get(obj);
String type=fields[i].getType().getSimpleName();//獲取屬性型別
String tname=fields[i].getName();//獲取屬性名
if(value!=null){
if("String".equals(type)){
sb.append(" and t."+tname+"='"+value+"'");
}
}
}
sb.append(") a where a.r>="+cu.startPage+" and a.r<="+cu.endPage);
sql=sb.toString();

pre = JdbcUtil.getOracleCon().prepareStatement(sql);
result=pre.executeQuery();
while(result.next()){
Object ins=c.newInstance();
for (int i = 0; i < fields.length; i++) {
String type=fields[i].getType().getSimpleName();//獲取屬性型別
String tname=fields[i].getName();//獲取屬性名
if("String".equals(type)){
fields[i].set(ins, result.getString(tname));
}else if("Date".equals(type)){
fields[i].set(ins, result.getDate(tname));
}else if("int".equals(type)){
fields[i].set(ins, result.getInt(tname));
}else if("double".equals(type)){
fields[i].set(ins, result.getDouble(tname));
}else if("float".equals(type)){
fields[i].set(ins, result.getFloat(tname));
}
}
list.add(ins);
}
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.closeCon(null, pre, null);
}
return list;
}

public int queryCount(Object t) {
PreparedStatement pre = null;// 定義預編譯語句物件
ResultSet result = null;// 定義一個結果集物件
int count =0;
String sql="";
Object obj=t;
try{
Class<?> c=obj.getClass(); //根據類名獲取Class物件
String cName=c.getSimpleName(); //獲取簡寫的類名 即為表名
StringBuffer sb=new StringBuffer("select count(*) count from "+cName+" t where 1=1 ");
//) a where a.r>=? and a.r<=?
Field[] fields=c.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
Object value=fields[i].get(obj);
String type=fields[i].getType().getSimpleName();//獲取屬性型別
String tname=fields[i].getName();//獲取屬性名
if(value!=null){
if("String".equals(type)){
sb.append(" and t."+tname+"='"+value+"'");
}
// else if("Date".equals(type)){
// sb.append(tname+"=to_date('"+obj+"','yyyy-mm-dd'),");
// }else{
// sb.append(tname+"="+obj+",");
// }
}
}
sql=sb.toString();
pre = JdbcUtil.getOracleCon().prepareStatement(sql);
result=pre.executeQuery();
while(result.next()){
count=result.getInt("count");
}
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.closeCon(null, pre, null);
}
return count;

}

}