A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 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里有提交事务方法和回滚方法;






0 个回复

您需要登录后才可以回帖 登录 | 加入黑马