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 避免脏读、不可重复读、虚读的发生。