zoukankan      html  css  js  c++  java
  • java基础知识学习(三)

    1. 谈谈你对hibernater的理解

    	1. 面向对象设计的软件内部运行过程可以理解成就是在不断的创建对象,建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质都是要得到一个结果,程序上一个时刻和下一个时刻的运行结果的差异就表现在内存中的对象状态发生了变化
    	2. 为了在关机和 内存不够的状况下,保持程序的运行状态,需要将内存中的对象状态保存到持久化设备和持久化设备恢复出对象的状态,通常都是保存到关系数据库来保存大量对象信息,对java程序的运行功能上来讲,保存对象状态的功能相比系统运行的其他功能来说,应该是一个很不起眼的附属功能,java采用jdbc来实现这个功能,这个不起眼的功能却要编写大量的代码,而做的事情仅仅是保存对象和恢复对象,并且那些大量的jdbc代码并没有什么技术含量,基本上是采用一套例行公事的标准代码模板来编写,是一种苦活和重复性的工作。
    	3. 通过数据库保存java程序运行时产生的对象和恢复对象,其实就是实现了java对象与关系型数据库记录的映射关系,称为ORM,人们可以通过封装JDBC代码来实现了这种功能,封装出来的产品称之为ORM框架,hibernater就是其中的一种
    	4. 使用hibernater的基本流程是:配置Configuration对象,长生sessionFactory,创建session对象,启动事务,完成等CURD操作,提交事物,关闭session
    	5. 使用hibernater时,先要配置hibernater.cfg.xml文件,其中配置数据库连接信息和方言等,还要为每个实体配置相应的hbm.xml文件
    	6. 在应用hibernater时,最重要的是session缓存原理,级联,延迟加载和hql语句
    

    2.对spring的理解

    	1. spring实现了工场模式的工厂类,这个类名为BeanFactory(实际上是一个接口),在程序中通常BeanFactory的子类ApplicationContext.spring相当于一个大的工厂类,再其配置文件中配置用于创建实例对象的类名和实例对象的属性
    	2. spring提供了对IOC良好的支持,IOC也称为DI(依赖注入),什么叫DI
    	    Class Programmer
    	Computer computer = null;
    	public void code{
    	//Computer computer = new IBMComputer();
    	//Computer computer = beanFactory.getComputer();
    	computer.writer();
    	}
     	public void setComputer(Computer computer){
    	this.computer = computer;
    	}
    }
    	另外两种方式都由依赖,第一个直接依赖于目标类,第二个把依赖转移到工厂上,第三个彻底与目标和工厂解耦了。
    	3. Spring提供了对AOP技术的良好封装,AOP称为面向切面编程,就是系统中有很多不相干的类的方法,在这些众多方法中要加入某种系统功能的代码,例如:日志,权限判断,异常处理,这种应用称之为AOP,采用AOP功能采用的是代理技术,客户端程序不再调用目标,而是调用代理类,代理类和目标类对外具有相同的方法声明,有两种方式实现相同的方法声明,一是实现相同的接口,而是作为目标的子类,JDK采用Proxy类产生动态代理的方式为某个接口生成实现类,如果要为某个类生成子类,则可以采用CGLIB.在生成实现类的方法中加入系统功能和调用目标类的响应方法,系统功能的代理以Advice对象进行提供,显然要创建出代理对象,显然要创建出代理对象,至少需要目标类和Advice类,Spring提供了这种支持,只需要spring的配置文件中配置这两个元素即可实现代理和aop功能 
    

    3. hibernater中的update()和saveOrUpdate()的区别,session的load()和get()的区别

    1. 程序在第一个session中加载对象,接session关闭 
    该对象被传递到表现层 
    对象发生了一些改动 
    该对象被返回到业务逻辑层最终到持久层 
    程序创建第二session调用第二个session的update()方法持久这些改动
    2. get方法会在调用之后立即向数据库发出sql语句(不考虑缓存的情况下),返回持久化对象;而load方法会在调用后返回一个代理对象,该代理对象只保存了实体对象的id,直到使用对象的非主键属性时才会发出sql语句。
    	查询数据库中不存在的数据时,get方法返回null,load方法抛出异常:org.hibernate.ObjectNotFoundException。
    

    4. hibernater的inverse属性的作用?

    指定哪一方来维护之间的关联关系
    

    5. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决

    1. 按照Object[]数据取出数据,然后自己组bean
    2. 对每个表的bean写构造函数,比如表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1 filed1,type2 field2) ,然后在hql里面就可以直接生成这个bean了
    
    1. hibernater的二级缓存
      思路:- 首先说清楚什么是缓存
      - 再说有了hibernater的session就是一级缓存,既有了一级缓存,为什么还要有二级缓存
      - 再说如何配置hibernater的二级缓存
      1. 缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似Hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。下面是缓存的伪代码:
      Dao{
         	HashMap hashaMap = new map();
         	User getUser(int id){
         	User user = map.get(id);
         		if (user == null) {
         			user = session.get(id);
         			map.put(id,user);
         		}
         		return user;
         	}
         }
        
         Dao{
         	Cache cache = null;
         	setCache(Cache cache){
         		this.cache = cache;
         	}
         	User getUser(int id){
         		if (cache != null) {
         			User user = cache.get(id);
         			if (user == null) {
         				user = session.get(id);
         				cache.put(id,user);
         			}
         			return user;
         		}
         		return session.get(id);
         	}
         }
    2. hibernater的session就是一种缓存,通常我们称之为一级缓存,当使用session从数据库中查询一个对象时,session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己的内部,由于session代表一次会话过程,一个session与一个数据库连接相关联,所以session最好不要长时间保持打开,通常仅用于一个事务当中,当事物结束就应该关闭了.并且session是线程不安全的,被多个线程共享时容易出现问题.通常只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值,因此hibernater的session这一级缓存的作用并不明显,应用价值不大.hibernater的二级缓存就是要为hibernater配置一种全局缓存,让多个线程和多个事务可以共享这个缓存我们希望一个人使用过其他人也可以使用,session没有这种效果
    3. 二级缓存是独立与hibernater的软件部件,属于第三方的产品.在hibernater中使用二级缓存,首先要在配置文件中配置使用那个厂家的产品,然后配置该产品在即的配置文件,最后要配置hibernater中哪些实体要纳入二级缓存的管理中,一个sessionFactory可以关联一个二级缓存,即一个二级缓存只能负责缓存一个数据库中过的数据,当使用hibernater的二级缓存后,注意不要有其他的应用或sessionFatory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致 .
  • 相关阅读:
    【力扣】767. 重构字符串
    【力扣】976. 三角形的最大周长
    【力扣】164. 最大间距
    【力扣】454. 四数相加 II
    JS中,输出1-10之间的随机整数
    web移动端浮层滚动阻止window窗体滚动JS/CSS处理
    禁止网站F12和查看源码
    苹果浏览器移动端click事件延迟300ms的原因以及解决办法
    jQuery下锚点的平滑跳转
    js实现placehoider效果
  • 原文地址:https://www.cnblogs.com/zddsblog/p/7452914.html
Copyright © 2011-2022 走看看