java减少代码书写——数据访问层Wrapper—更新数据源码—反射2
----------------------------------------------------使用效果:-------------------------------------
get、set直接不需写,省下很多时间啊
----------------------------------------------------源码:-------------------------------------
package com.fendou.DBUtil;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
/**
* 2012-9-18
* @author 牟云飞
* 添加数据
*/
public class WrapperUpdateDao<T> {
/**
* 添加数据
* 实体类第一个必须是id,注意使用时更改序列名
* 如果不是需要修改
* @param 实体类的完整路径
* @param 对象
* @return
*/
public boolean updateBatch(String classpath,T t,int id){
boolean flag = false;
try {
Class classType = Class.forName(classpath);
// 获得对象的所有属性
Field fields[] = classType.getDeclaredFields();
String classname=classType.getName().toLowerCase().substring(classType.getName().toLowerCase().lastIndexOf(".")+1, classType.getName().toLowerCase().length());
//形成sql语句
String sql="update "+classname+" set ";
//sql语句的值
ArrayList<Object> list = new ArrayList<Object>();
String idName="";
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
//得到成员名
String fieldName = field.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase();
if(i==0){
//得到第一列,即id
idName=fieldName;
}else{
if(i==1){
sql=sql+fieldName+"=?";
}else{
sql=sql+","+fieldName+"=?";
}
}
}
sql=sql+" where "+idName+"=?";
////打印sql语句
//System.out.println(sql);
//将sql语句进行赋值并执行
int count =excute(classpath,t,sql,id);
if(count>0){
flag=true;
}else{
flag=false;
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
public int excute(String classpath,T t, String sql,int id){
int count =0;
try {
Class classType = Class.forName(classpath);
// 获得对象的所有属性
Field fields[] = classType.getDeclaredFields();
String classname=classType.getName().toLowerCase().substring(classType.getName().toLowerCase().lastIndexOf(".")+1, classType.getName().toLowerCase().length());
DButil<T> util = new DButil<T>();
//打开连接
util.open();
//得到PreparedStatement
PreparedStatement ps= util.getPreparedStatement(sql);
//System.out.println(sql);
for (int i = 1; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String type=field.getType().getName();
type = type.substring(type.lastIndexOf(".")+1,type.length());
// 获得和属性对应的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1);
// 获得和属性对应的getXXX()方法
Method getMethod = classType.getMethod(getMethodName,new Class[] {});
// 调用原对象的getXXX()方法:指定调用的对象和方法的参数值列表
Object value = getMethod.invoke(t, new Object[] {});
//判断成员变量的类型,并将其进行匹配
if(type.toString().toLowerCase().equals("int")){
if(value!=null){
ps.setInt(i,Integer.valueOf( value.toString()));
}else{
ps.setInt(i,0);
}
}
//如果是String
if(type.toString().toLowerCase().equals("string")){
if(value!=null){
ps.setString(i,value.toString());
}else{
ps.setString(i,null);
}
}
//如果是Date类型用com.sql.TimeStamp
if(type.toString().toLowerCase().equals("date")){
if(value!=null){
Date tt = (Date)value;
long s= tt.getTime();
ps.setTimestamp(i, new java.sql.Timestamp(s));
}else{
ps.setDate(i,null);
}
}
//如果是Double类型
if(type.toString().toLowerCase().equals("double")){
if(value!=null){
ps.setDouble(i, Double.valueOf(value.toString()));
}else{
ps.setDouble(i,0.0);
}
}
}
ps.setInt(fields.length, id);
count =ps.executeUpdate();
//关闭所有连接
ps.close();
util.close();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return count;
}
}