新增/修改数据时,字段比较多时,便要写很多设置SQL语句的值,所以为了方便,便写了个工具
/**新增/修改:省略写设置新增/修改的值(即:ps.set某类型(1,值)等等所有的set)。
* 在ps=con.prepareStatement() 和ps.executeUpdate()中间调用该方法
* @param t po类对象
* @param ps PreparedStatement对象
* @param str sql语句
* @param it0 等于0时,代表传进的是新增语句,否则为修改语句
* @提示 1.新增语句格式,例:"insert into bas_driver(driverName,sex,phone) values(?,?,?)"
* @提示 2.修改语句格式,例:"update bas_driver set driverName=?,sex=? where driverID=?"
* @提示 3.数据库字段名必须和po类的变量名一样。
* */
public static <T> void insert(T t,PreparedStatement ps,String str,int it0){
String[] strs;
if(it0==0){//新增
int it=str.indexOf("(");
int it2=str.indexOf(")");
//截取"("与")"之间的字符串
String string=str.substring(it+1,it2);
//分割字符串
strs=string.split(",");
}else{//修改
int it=str.lastIndexOf(" ",str.indexOf("="));
str=str.substring(it+1);
str=str.replace(",", "");
str=str.replace(" where ", "");
str=str.replace("?", "");
strs=str.split("=");
}
int i=0;
//遍历字段名,若字段名和对象里的变量名相同,则把把该变量的值设置进sql语句的"?"号里
for (String name : strs) {
i++;
try {
name=name.substring(0,1).toUpperCase()+name.substring(1);
//反射获取变量的值
Class cla=t.getClass();
PropertyDescriptor pd=new PropertyDescriptor(name,cla);
Method method=pd.getReadMethod();
Object object=method.invoke(t);
ps.setObject(i, object);//把值设置进去(若Date类型没有值,则object等于null,能设置进去,若是B/boolean类型,默认值为true)
} catch (SecurityException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IntrospectionException e) {
e.printStackTrace();
}
}
}