开发工具与关键技术:MyEclipse 10、JAVA
作者:曾浩源
撰写时间:2019年05月26日
在javaWeb的开发中,对数据库的操作一般都是在Dao包内,新增、修改、删除都有着重复的代码,所以直接在until工具类包里将它们封装为一个方法来使用。
在until包内,创建一个类,在类里声明三个变量:
private static Connection con = null;
private static PreparedStatement ps = null;
private static ResultSet rs = null;
至于对驱动的加载,Connection 的获取,这三个变量的关闭方法的封装就不说了,直接对增删改进行封装。
创建一个静态方法,因增删改返回的都是改变的行数所以返回值为int,有三个参数:
1、String sql 带参数的新增、修改或删除的sql语句
2、Object o 需要新增,修改的数据(一个需要保存到数据库被new出来的实体类) 当是删除时,传到是 需要删除的id
3、Class<?> 实体类的类型
例如:
public static int contains(String sql, Object o, Class<?> c) {
//所以声明一个int变量num=0初始化,作为返回值
int num = 0;
try {
//获取Connection
con = DbUtil.getConnection();
//获取PreparedStatement 传入参数sql语句
ps = con.prepareStatement(sql);
//分割sql语句,提取sql前六位字符,获取到insert、update或delete
String mode = sql.substring(0, 6);
//声明一个空字符串存储需要改动的实体类的字段
String str = "";
//判断是否是修改
if (mode.equals("update")) {
//使用正则获取sql语句中所需要修改的字段
Pattern p = Pattern.compile("([0-9a-zA-Z])*(\\=\\?)");
Matcher m = p.matcher(sql);
while (m.find()) {
str += m.group(0).substring(0, m.group().length() - 2) + ",";
}
//获取完后因后面会多一个逗号,所以从最后减去一个字符
str = str.substring(0, str.length() - 1);
}
//判断是新增
else if (mode.equals("insert")) {
//使用正则获取sql语句中所需要修改的字段
Pattern p = Pattern.compile("(\\()([0-9a-zA-Z\\.\\/\\=\\,])*(\\))");
Matcher m = p.matcher(sql);
while (m.find()) {
str = m.group(0).substring(1, m.group().length() - 1);
}
//判断是删除
} else if (mode.equals("delete")) {
//直接给id字段赋值
if (Tools.isNum(o.toString())) {
ps.setInt(1, Integer.valueOf(o.toString()));
}
//返回改动行数
return ps.executeUpdate();
}
//获取到字段后,使用逗号分隔
String[] strings = str.split(",");
//声明一个index,用于自增
int index = 1;
//遍历字段,为它们赋值
for (String string : strings) {
// 获取类中的所有定义字段 c为实体类
Field[] fields = c.getDeclaredFields();
// 循环遍历字段,获取字段对应的属性值
for (Field field : fields) {
// 如果不为空,设置可见性,然后返回
field.setAccessible(true);
try {
Object object = field.getType();
// 参数对象转换为字符串类型
object = DbUtil.pareObjToStr(object);
//给var赋值当前实体类里的字段的属性值
String var = (String) field.get(o);
//判断为string类型
if (((String) object).toLowerCase().equals("class java.lang.string")) {
//判断实体类字段与所需要赋值的字段名称是否一致
if (string.equals(field.getName())) {
//判断实体类的字段是否有值
if (!Tools.isNotNull((String) field.get(o))) {
var = ""; //没有值,重新赋值为空字符串
}
//为当前字段赋值
ps.setString(index++, var);
//跳出实体类字段循环,继续循环赋值
break;
}
//判断是否为long类型,以下都一样
} else if (((String) object).toLowerCase().equals(
"long")) {
if (string.equals(field.getName())) {
if (!Tools.isNum((String) field.get(o))) {
var = "0";//整型需要赋值为0
}
ps.setLong(index++, Long.valueOf(var));
break;
}
} else if (((String) object).toLowerCase().equals(
"short")) {
if (string.equals(field.getName())) {
if (!Tools.isNum((String) field.get(o))) {
var = "0";
}
ps.setShort(index++, Short.valueOf(var));
break;
}
} else if (((String) object).toLowerCase()
.equals("int")) {
if (string.equals(field.getName())) {
if (!Tools.isNum((String) field.get(o))) {
var = "0";
}
ps.setInt(index++, Integer.valueOf(var));
break;
}
} else if (((String) object).toLowerCase().equals("date")) {
//判断为时间类型
if (string.equals(field.getName())) {
if (!Tools.isNotNull((String) field.get(o))) {
//若时间没有值,获取当前时间
var=new Date().toString();
}
ps.setString(index++, new java.text.SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"). format((java.util.Date) ((Object) var)));
break;
}
} else if (((String) object).toLowerCase().equals(
"float")) {
if (string.equals(field.getName())) {
if (!Tools.isNum((String) field.get(o))) {
var = "0.0";
}
ps.setFloat(index++, Float.valueOf(var));
break;
}
} else if (((String) object).toLowerCase().equals(
"double")) {
if (string.equals(field.getName())) {
if (!Tools.isNum((String) field.get(o))) {
var = "0.0";
}
ps.setDouble(index++, Double.valueOf(var));
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
num = ps.executeUpdate();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally{
//关闭资源
DbUtil.close(con, ps, rs);
}
return num;
}
三个sql语句:增删改
1、获取前六个字符判断操作类型
2、使用正则获取需要改变的字段
private String deleteById = "delete from pw_staff where StaffID=?";
private String insert = "insert into pw_staff(WareHouseID,PriceAuthorityID,RoleID,StaffUserName,StaffName, PassWord,PhoneNumber,PostCode,Address,StaffState,Sex,InvalidateReceipts,CheckReceipts,CheckClient,Image) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
private String update = "update pw_staff set WareHouseID=?,PriceAuthorityID=?,RoleID=?,StaffUserName=?,StaffName=?, PassWord=?,PhoneNumber=?,PostCode=?,Address=?,StaffState=?,Sex=?,InvalidateReceipts=?,CheckReceipts=?,CheckClient=?,Image=? where StaffID=?";
增删改一句话搞定,如:
public boolean deleteById(int id) {
return DbUtil.contains(deleteById, id, CommodityUnit.class) > 0;
}
public boolean insert(CommodityUnit t) {
return DbUtil.contains(insert, t, CommodityUnit.class) > 0;
}
public boolean update(CommodityUnit t) {
return DbUtil.contains(update, t, CommodityUnit.class) > 0;
}
参数对象转换为字符串类型
public static String pareObjToStr(Object obj) {
if (obj == null)
return null;
if (obj instanceof String)
return obj.toString();
if (obj instanceof Integer)
return ((Integer) obj).toString();
if (obj instanceof Long)
return ((Long) obj).toString();
if (obj instanceof Float)
return ((Float) obj).toString();
if (obj instanceof Double)
return ((Double) obj).toString();
if (obj instanceof java.util.Date)
return new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format((java.util.Date) obj);
return obj.toString();
}