数据库之JDBC-DQL封装、事务

本文主要介绍了JDBC中如何进行DQL的统一封装,利用反射技术提高代码复用性。接着深入探讨了Java中事务的管理,包括开启、提交和回滚事务的代码示例。同时,阐述了事务的ACID特性以及不同隔离级别的概念,如原子性、一致性、隔离性和持久性,并列举了各种隔离级别可能导致的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1: JDBC之统一DQL封装 ; + 反射

// 解决了我们的实体类里面,没有数据库查询过来的字段的问题;
	public static <T> List<T> executeDQL(Class<T> cls, String sql, Object... params) throws Exception {

		// 获取连接
		Connection connection = DBUtils.getConnection();

		// 获取我们的预处理对象
		PreparedStatement ps = connection.prepareStatement(sql);

		// 完成了设置参数的过程
		setParams(ps, params);

		// 执行查询,获取结果集
		ResultSet rs = ps.executeQuery();

		// 获取我们查询结果的表(字段)信息
		ResultSetMetaData md = ps.getMetaData();

		// 将查询的数据,封装到List里面来;
		List<T> list = new ArrayList<T>();

		T obj;
		while (rs.next()) { // 遍历我们的记录行

			obj = cls.newInstance();

			for (int i = 1; i <= md.getColumnCount(); i++) {
				String name1 = md.getColumnLabel(i);// 就是我们的字段名称;

				try {
					Field field = cls.getDeclaredField(name1); // 如果发生了异常,表示我们实体类里面,没有这个字段
					field.setAccessible(true);
					Object value = rs.getObject(name1);

					if (value == null) { // 不能一刀切;

						int type = md.getColumnType(i); // 这个方法会返回我们当前列的类型;

						// 如果符合我们的某个类型
						if (checkType(type)) {
//							value = 0;
							continue;
						}
					}

					//给对象的字段设置值
					field.set(obj, value);
				} catch (NoSuchFieldException e) {

				}
			}

			list.add(obj); // 将我们一个实例,添加到集合里面
		}

		return list;
	}

	// 判断type是其中的某一个类型
	private static boolean checkType(int type) {

		return Types.INTEGER == type || Types.FLOAT == type || Types.DECIMAL == type || Types.DOUBLE == type
				|| Types.REAL == type;

	}

2: 事务

2.1 Java代码如何实现事务

开启事务:start transaction
提交事务:commit;
回滚事务:rollback
JDBC控制事务语句
Connection.setAutoCommit(false); start transaction
Connection.rollback(); rollback
Connection.commit(); commit

2.2 事务的ACID

Atomicity(原子性)
表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败
Consistency(一致性)
表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态.
事务执行前和执行后来源和去向保持平衡。
Isolation(隔离性)
事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它
之后的状态,事务不会查看中间状态的数据。并发时每个事务是隔离的,相互不影响。
Durability(持久性)
持久性事务完成之后,它对于系统的影响是永久性的。

2.3 事务的隔离级别

事务的隔离级别:
属于事务的。都已开启了事务为前提。
不考虑事务的隔离级别,会出现以下错误的情况
(1)read uncommitted 未提交读
所有事务都可以看到没有提交事务的数据。
(2)read committed 提交读
事务成功提交后才可以被查询到。
(3)repeatable 重复读
同一个事务多个实例读取数据时,可能将未提交的记录查询出来,而出现幻读。mysql默认级别
(4)Serializable可串行化
强制的进行排序,在每个读读数据行上添加共享锁。会导致大量超时现象和锁竞争。
要想避免以上现象,通过更改事务的隔离级别来避免:
READ UNCOMMITTED 脏读、不可重复读、虚读有可能发生。
READ COMMITTED 避免脏读的发生,不可重复读、虚读有可能发生。
REPEATABLE READ 避免脏读、不可重复读的发生,虚读有可能发生。
SERIALIZABLE 避免脏读、不可重复读、虚读的发生。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值