在web项目开发中,增删查改这几个方法用的是最多的了,但难免写多了就会想到,每次都是写的差不多的代码,就不能用写一次之后就不用写了吗?所以就有了封装。
其实封装简单来说就是把相同的代码写成一个工具类里面的方法,这样就能减少servlet中或者实现类里面(dao层)的大量代码。
先来看看servlet层的新增代码
public void Insert(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//创建BodyCheckComboImpl 实现类的对象,用来调用实现类里面的新增方法
BodyCheckComboImpl comboImpl = new BodyCheckComboImpl();
//获取表单提交过来的值,用实po体类对象接收
//RequestHelper这个工具类在之前的文章有发过
BodyCheckDetail combo = RequestHelper.getSingleRequest(request, BodyCheckDetail.class);
//定义一个int来接收新增成功后返回的id
int flag = comboImpl.inset(combo,"SYS_BodyCheckDetail");
if(flog > 0){
System.out.println("新增成功");
}else{
System.out.println("新增失败");
}
}
实现类的新增代码
public class BodyCheckComboImpl {
/**
* 新增
* @param obj po实体类对象
* @param table 新增对象的表名
* @return
*/
public int inset(Object obj,String table){
int flag;
//调用工具类的新增方法
flag = DBUtil.Insert(obj, table);
return flag;
}
}
下面是工具类的新增方法,简单说下这个方法思路,通过反射获取到这个类对象,再用这个类对象去获取字段名称,再通过反射获取到po实体类的getter方法,把值拿到,放到字符串中,再把字符串拼接成sql语句
public static int Insert(Object obj,String table) {
int flag = 0;
try {
//获取类
Class<?> class1 = obj.getClass();
//获取类中声明的所有字段
Field[] fields = class1.getDeclaredFields();
//声明两个变量,用来存放字段和值
String line="";
String val="";
for (int i=0; i < fields.length; i++) {
//获取字段的名字
String name = fields[i].getName();
//获取字段类型
Class<?> type = class1.getDeclaredField(name).getType();
// ---获取getter方法
// 首字母大写
String replace = name.substring(0, ).toUpperCase()+ name.substring(1);
//通过反射的getMethod方法获取到getter方法
Method getMethods = class1.getMethod("get" + replace);
String str = "";
try {
//这里要注意getMethods.invoke(obj).toString()方法,如果获取到的值是空的话就会报错所以要处理一下
str = getMethods.invoke(obj).toString();
if(str != null && "".equals(str)){
//把字段拼接 table(age,name...)
line += replace +",";
//把值拼接 values(‘1’,’2’...)
val += "'" + str + "',";
}
} catch (NullPointerException e) {
str = "";
}
}
//把拼接字段的最后一个逗号去掉
line = line.substring(0, line.length() - 1);
//把拼接值的最后一个逗号去掉
val = val.substring(0, val.length() - 1);
//拼接SQL语句 INSET INTO TABLE(age,name...) VALUES(‘1’,’小明’...)
StringBuffer buffer = new StringBuffer();
buffer.append("INSERT INTO ");
buffer.append(table);
buffer.append("(");
buffer.append(line);
buffer.append(") VALUES(");
buffer.append(val);
buffer.append(")");
System.out.println(buffer.toString());
con = DBUtil.getConnection();
//想要获取到新增之后的id就要在后面加上Statement.RETURN_GENERATED_KEYS
ps = con.prepareStatement(buffer.toString(),
Statement.RETURN_GENERATED_KEYS);
ps.executeUpdate();
rs = ps.getGeneratedKeys();
//遍历rs获取到新增后的id
while (rs.next()) {
flag = Integer.parseInt(rs.getLong(1) + "");
}
System.out.println("新增的id = " + flag);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return flag;
}