hibernate是对jdbc轻量级封装的反射为基础的orm(object relation mapping 对象关系映射)框架,充当项目的持久层。
保存数据 save,update 查询load (xx.class ,id) ,get()(区别下面会讲到) 删除delete
,所操作的类必须有序列。序列式文件传送的标识。
pojo类1是和一张表对应的,2一般我们放在com.xxx.model(domain)里
3pojo需要一个主键属性(用于标示一个pojo对象)4除了主键属性外,它应当还有其属性是private
5提供set/get方法 6他应当有一个无参的构造方法,用于hibernate反射
通过SessionFatory获取Session的2个方法openSession、getCurrentSession();
openSession每次获得全新的Session
getCurrentSession获取和当前线程绑定的Session,利于事务的控制。(如果希望使用getCurrentSession需要配置hibernate.cfg.xml里配置<property name="current_session_context.class">thread</property>)
如何选择
getCurrentSession()会自动关闭 openSession要自动关闭 但我们最好都手动关闭
getCurrentsession获取的Session进行的查询需要事务提交
Session接口的功能
1.Session一个实例代表与数据库的一次操作(一次操作可以crud组合)
2.Session实例通过SessionFactory获取,用完需要关闭
3.Session是线程不同步的(不安全),因此要保证在同一线程中使用,可以用getCurrentSession()
4Session可以看做做持久化管理器,他是与持久化操作相关的接口
get和load区别
1.如果查询不到数据,get返回null ,load会报错 objectNotFundException
2.使用get去查询数据,会立即向db发出查询请求select, load 查询数据查到的是代理对象,如果后面没有使用查询结果,它不会真的向数据库发Select,当程序员使用查询结果的时候才真的发出Select,即懒加载(通过配置文件可以取消懒加载(class name="xxx"lazy="false" table="Xxx")) 确定有某个对象最后用懒加载.get先在Session里找,然后2级缓存 ,在Db , load会先到Session里找,然后到二级缓存里找,如果找到就放到一级缓存,然后等待