本帖最后由 小石姐姐 于 2018-5-30 10:18 编辑
MVC的反射和事物
反射: ✔获得.class对象
Person.java--[编译]--Person.class--[类加载器]--虚拟机中--Class对象
三种方式:
(类名)Person.class
(Person的对象)person.getclass()
Class.forName("com.itheima.Person")
反射获得类中:
构造方法: Constructor
属性: Field
方法: Method ✔
"==": 比较的是地址值;
无参构造:
Person person = (Person)clazz.newInstance()
有参构造:
Constructor c = clazz.getConstructor(String.class,Integer.class)
Person p = (Person) c.newInstance("张三",38);
syso(p.name);syso(p.age);
公有属性:
clazz.getField("属性名");
clazz.getFields();
私有属性:
Field field = clazz.getDeclaredField("属性名");
field.setAccessible(true);
Constructor c = clazz.getConstructor(String.class,Integer.class)
Person p = (Person) c.newInstance("张三",38);
方法:
Method m = clazz.getDeclaredMethod("方法名",属性类型.class);
m.setAccessible(true);
m.invoke(clazz.newInstance(),"要传入的参数");//p.run()让方法执行
API: 搜索Method--关于reflect
反射: 获得Method对象,然后让方法执行 invoke
内省: javabean的编写规则,重写构造方法后,需要加上无参构造;
java中的内省
(了解)内省:用来获得JavaBean的属性及属性的get和set方法;
JavaBean就是一个满足了特定格式的Java类;
一个JavaBean属性是由get和set方法确定的;
事务
事务: 逻辑上的一组操作,组成这组操作的各个逻辑单元,要么都成功,要么都失败;
JDBC中的事物管理:✔
Connection:
setAutoCommit(false)开启事务
业务逻辑
commit()提交事务
rollback()回滚
事物管理的核心思想:
Dao中的多个方法使用的是同一个Connection对象!
如何保证使用同一个Connection:
方式一:在service中创建connection对象作为参数传递给Dao;
方式二:把conn绑定到当前线程,使用时,再从本地线程拿get();
servlet以多线程的方式访问service每个人访问都会创建一个新的线程
ThreadLocal本地线程
service:
1.getConnection(); 获得Connection对象;
2.setAutoCommit(false); 关闭自动提交,开启事务;
事务的ACID性: 原子,一致,持久,隔离
脏读:
一个事务读到另一个事务还没有提交的数据;
不可重复读:
一个事务读到了另一个事务已经提交的update的数据,导致多次查询结果不一致;
虚读/幻读:
一个事务读到了另一个事务已经提交的insert的数据,导致当前的事物中多次查询的结果不一致;
隔离级别:
read uncommitted(读都有可能产生)
read committed
repeatable read(mysql默认的隔离级别)
serializable
现阶段使用DBUtils进行事务管理来保证Dao中的conn为同一个;
没有事务管理的话Dao中:
QueryRunner()传入连接池
有事务管理:
QueryRunner()不传连接池,在service里获得连接
DbUtils里有提交事务方法和回滚方法;
|
|