java操作数据库的通用方法(单表增删改查)

java操作数据库的通用方法(单表增删改查)

这样做的好处就非常大了,不用每次都要写

01.写sql语句

02.获取操作数据库句柄

03.设置参数

04.执行sql语句

05.如果是查询的话还要赋值

这些复杂的操作了,这样对单表的增删改查就非常方便了。

在这里我的每一行都有非常详细的注释,认真看的话应该可以看得懂,里面用到了(反射,jdbc操作数据库,获取元数据,链表,可变参,泛型,类对象等一些用法)

其实每个用法都不是很难,重要的是怎么用,然后组合。

// 通用查询
public static <T> List<T> query(String sql, Class<T> clazz, Object... param) {
	PreparedStatement ps = null;
	ResultSet set = null;
	List<T> result = null;
// 先判断连接
			if (connection == null || connection.isClosed()) {
				getConnection();
			}
			// 获取操作数据库句柄
			ps = connection.prepareStatement(sql);
			// 设置参数
			for (int i = 1; i <= param.length; i++) {
				ps.setObject(i, param[i - 1]);
			}
			// 执行sql语句
			set = ps.executeQuery();
			while (set.next()) {
				// 如果返回的set有下一个则分配一个链表空间准备保存set中的值
				if (result == null) {
					result = new ArrayList<T>();
				}
				// 根据类对象获取构造方法保存到c中
				// 这里就体现了类中定义不带参构造的用处了,可以直接用来调用它不带参的构造,因为不知道带参的构造的参数到底是什么
				// 有不带参的构造就可以直接获取到他的构造方法,就可以用来new对象了
				Constructor<T> c = clazz.getDeclaredConstructor();
				// 拿获取的构造方法新建一个对象(这个类的实例),因为后面设置属性值需要传一个对象(实例)
				T a = c.newInstance();
				// 获取set中保存得元数据(对数据的描述,就是表的一些信息),取出表的字段名,转成类中的属性名
				ResultSetMetaData rsmd = set.getMetaData();
			for (int i = 1; i <= rsmd.getColumnCount(); i++) {
				// 把获取到的字段名全部先转成小写
				// 把以“_”分割出来的字符保存到str字符串数组中(因为mysql中的字段名每个单词之间用“_”分割),分割出每个单词
				String[] str = rsmd.getColumnName(i).toLowerCase().split("_");
				// 定义一个字符串类型的fieldName用来保存转换过的字段名
				String fieldName = "";
				// 循环这个数组中的字符串(以“_”分割出来的单词),转成java中的属性名(小驼峰命名法),第一个单词不用首字母不用大写,之后的每个单词首字母大写
				for (int j = 0; j < str.length; j++) {
					// 判断,如果不是第一个那就字符串截取,截取首字母把他转成大写,再拼接起来
					if (j != 0) {
						str[j] = str[j].substring(0, 1).toUpperCase() + str[j].substring(1);
					}
					// 拼接起来保存到这个变量中,就是类中的属性名(注意这里的必须要保证数据库和java属性名之间的转换规范,把mysql中的字段名转成属性名是见了“_”就去掉“_”然后首字母大写)
					fieldName += str[j];
				}
				// 用类对象获取属性,就可以设置属性的值了
				Field f = clazz.getDeclaredField(fieldName);
				// 设置访问权限,如果这个属性是私有的也可以访问到
				f.setAccessible(true);
				// 设置属性值(第一个属性就是通过上面类对象获取的构造创建的类,意思是设置这个类中这个字段的值),第二个就是把这个字段设为什么值
				f.set(a, set.getObject(fieldName));
				// 设置成功后把这个实例对象加到链表中
				result.add(a);
			}
		return result;
		}
// 通用增删改
public static int update(String sql, Object... param) {
	PreparedStatement ps = null;
	int result = 0;
if (connection == null || connection.isClosed()) {
				getConnection();
			}
			// 获取操作句柄
			ps = connection.prepareStatement(sql);
			// 设置参数
			for (int i = 1; i <= param.length; i++) {
				ps.setObject(i, param[i - 1]);
			}
			result = ps.executeUpdate();
			System.out.println("操作成功,影响了" + result + "行!");

		return result;
注:代码里需要自己捕获异常

例如我再要查user表中的记录就不用写那么多复杂的代码了

List users = Database.query("SELECT * FROM user , User.class);

这样就可以查询出user表中的所有记录了。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值