有关昨天的DML封装:DML封装
1、DQL封装
//封装执行DQL语句的方法
public <T> List<T> execute_DQL(Class<T> cls,String sql,Object...objs) throws Exception{
//获取数据库连接
Connection con = DBUtils.getConnection();
//获取操作对象PreparedStatement
PreparedStatement ps = con.prepareStatement(sql);
//设置sql语句参数
setParams(ps,objs);
//获取执行的到的结果集
ResultSet rs = ps.executeQuery();
//获取数据库的所有字段
ResultSetMetaData md = ps.getMetaData();
//设置一个集合来存储数据库存储的结果集
List<T> list = new ArrayList<>();
T t;
String name;
Field field;
while(rs.next()) { //遍历结果集
//通过反射构建一个对象
t = cls.newInstance();
//遍历所有数据库字段
for(int i=0;i<md.getColumnCount();i++) {
name = md.getColumnLabel(i+1); //获取别名
try {
field = cls.getDeclaredField(name);//获取对象的属性,因为可能会找不到对象的属性,所以try捕捉异常
field.setAccessible(true); //打开权限
Object value = rs.getObject(name); //获取该字段的值
if(value==null) { //如果为空,获取下一个字段
continue;
}
field.set(t, value); //设置这个对象的这个属性值
}catch(NoSuchFieldException ex) {
}
}
list.add(t);
}
return list;
}
2、事务
-
什么是事务:保证我们运行多条语句,能够同时成功、同时失败、不会被其他的sql语句影响
-
Java代码实现事务
//JDBC控制事务语句 Connection.setAutoCommit(false); start transaction //开启不自动关闭事务 Connection.rollback(); rollback //事务回滚 Connection.commit(); commit //事务提交
-
事务的4个性质:
Atomicity(原子性)
表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败Consistency(一致性)
表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态.
事务执行前和执行后来源和去向保持平衡。Isolation(隔离性)
事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它
之后的状态,事务不会查看中间状态的数据。并发时每个事务是隔离的,相互不影响。Durability(持久性)
持久性事务完成之后,它对于系统的影响是永久性的。 -
事务的隔离级别
read uncommitted 未提交读
所有事务都可以看到没有提交事务的数据。read committed 提交读
事务成功提交后才可以被查询到。repeatable 重复读
同一个事务多个实例读取数据时,可能将未提交的记录查询出来,而出现幻读。mysql默认级别Serializable可串行化
强制的进行排序,在每个读读数据行上添加共享锁。会导致大量超时现象和锁竞争。要想避免以上现象,通过更改事务的隔离级别来避免:
READ UNCOMMITTED 脏读、不可重复读、虚读有可能发生。
READ COMMITTED 避免脏读的发生,不可重复读、虚读有可能发生。
REPEATABLE READ 避免脏读、不可重复读的发生,虚读有可能发生。
SERIALIZABLE 避免脏读、不可重复读、虚读的发生。
3、项目结构(图片借鉴自课堂)
- 面向接口开发