Java对数据库的增删改一条数据的封装

开发工具与关键技术: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();
	}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值