1.事务隔离
之前在学习MySQL的时候记得,有学到过关于设置READ_COMITTED
避免对数据库进行脏读,幻读以及不可重复读
2.xml的方式来配置tx
有<tx>的node来配置事务
3.spring整合hibernate
首先要知道,具体整合哪些东西:
IOC会创建一个hibernate的SessionFactory,这样我们每次需要进行DAO操作的时候,就从这个factory里面拿一个session绑定到当前的线程
4.整合步骤
先加入hibernate,再加入spring-->添加完jar包以后,这里需要给hibernate写一个cfg.xml配置文件,然后这里还需要为hibernate写一个映射文件,hbm.xml这个配置文件的目的,就是起到了数据库到java的类的桥梁
在hibernate的配置文件里面先配置ioc,然后这个数据源配给IOC,所以hibernate直接找ioc拿就可以了,这里就不用给hibernate配置数据源了,所以datasource实际上之后会给hibernate
还有配置hibernate的一些基本属性,比如方言,sql,显示格式化,生成数据表的策略,以及二级缓存
5.mapping数据库
在*.hbm.xml必须声明的<generator>子元素是一个Java类的名字,用来为该持久化类的实例生成唯一的标识
本demo里面,使用的是native,表示用的是数据库里面的一个参数作为这个持久化实例的唯一标识符.
什么意思呢
这里就是说,比如我数据库里面有一个主键,然后在hibernate的hbm.xml的映射文件中配置好,那么数据库就可以成功的用hibernate建立起连接
6.方言
dialect就是“方言”,因为hibernate是要把Java对象转换成关系数据库来描述的,而关系数据库虽然有一些统一的标准,如SQL-92等,但是实际上各数据库如Oracle, MySQL, MS SQL Server等等为了提高性能或增加功能都提供了一些额外的标准或语法,因此,hibernate为了更好适配各种关系数据库,针对每种数据库都指定了一个方言dialect
也就是说,这里就是一个adaptor,协调了不同版本的sql数据库语言,这样方便hibernate统一操作
7.加入spring包
jar包加入完以后;加入spring的配置文件;配置spring的声明事务,分为:配置事务管理器txManager + 配置事务的属性 +配置事务切点,并把事务和切点关联起来
8.具体配置spring
还是跟以前几乎一样
1.配置dataosource...db.properties等
2.配置hibernate的session-factory-->在这里配置了一个sessionfactory的bean,同时还要往里面导入3个文件:
datasource + hibernate的cfg.xml文件 + hibernate的映射文件hbm.xml
3.配置sring的声明式事务:txManager( 这里注意,这里的事务管理器后面的class选的跟之前不一样,这里选的是一个HibernateTransaction) + 配置事务属性 + AOP
9.实际代码test
1.在DAO层的实现接口的impl类,通过hibernate来操作数据库
2.在DAO层的impl实现类注解要加@Repository,表示一个直接跟数据库挂钩的数据持久类,(获取跟当前线程绑定的session.
这个session是从ioc里面的sessionfactory拿的,
3.在DAO里面的impl类,你既然已经接入了hibernate,肯定在这里操作数据库的时候,不能再用jdbc,template那一套啊,不然接入hibernate干嘛呢,这里应该用hibernate的api
4.这里用hibernate,用到的hql语句,我开始以为操作数据库,可以直接封装java类...原来这个封装到时候要自己写额
10.正确开启spring事务流程
1.在方法开始之前,获取session
2.把session与当前线程绑定,这样就可以在DAO中获得这个session
3.开启事务,若方法正常结束,即没有出现异常,则:提交事务;使和当前线程绑定的session解除绑定;关闭session,若方法出现异常,就回滚事务,然后关闭session
11.cfg.xml
配置hibernate的时候,这个xml的配置文件是可以被取代的,就是说这个可以在spring里面要用hibernateProperties的属性节点来进行配置
12.举例整合struts2
在web应用中,应该在应用被服务器加载的时候就创建IOC:这个时候就是有一个监听器:ServletContextListener
在contextInitialized(ServletContextEvent sce)这个方法中创建IOC.
在创建IOC后,可以把其放在servletContext(即application域)的一个属性中
实际上,spring的配置文件的名字和位置,应该也是可配置的,将其配置到当前WEB应用初始化参数中较为合适.
这里是在web.xml里面配置的:
1.这里有一个默认的listener节点,这里放的struts2的一个包,应该是之前系统生成的-->启动IOC容器的ServletContextListener
2.然后在这里自然也是可以对spring配置文件进行相关配置的-->通过<context-param>节点来配置
16.具体操作
这里新建class文件的时候,有一个选项:Lifecycle接口,其会实现一个ServletContextListener的子接口
在这里我们发现有一个方法:
public void contextInitialized(ServletContextEvent arg0)
我们在这个方法里面:
1.创建IOC
2.然后把IOC放在ServleContext的一个属性中
servletContext.setAttribute("ApplicationContext",ctx);
这里创建servlet,直接有一个可选的doGet()方法
步骤:
1.从application域对象中得到IOC的 引用-->ref https://blog.csdn.net/qq_37838782/article/details/8087496
这里有讲什么是域对象
2.获取ServletContext
3.从servletContext里面获得之前set了的IOC
4.从IOC拿bean,运行方法
17.struts2
struts2与spring的整合目的,就是为了让IOC可以管理struts2的action
这里大概看了一下,struts2的配置文件主要就是<filter>的node
这里,也要有映射的map文件,这里稍微注意一下,struts2的action是非单例的,一个请求一个action
还是学习springMVC,之后struts再说吧...先把一个学会
总结:
Spring的整个作为服务器的一个流程已经搞完了,其实很简单,只不过组成部分有点多:
前端,无论浏览器还是app,都会给我们的servlet发送信息,我们的控制层,也就是springMVC这一层,在接收到前端发送过来的消息以后,就要把这些消息传给spring的核心业务层,也就是service层,这里的service层便可以用写好了的事务,来操作DAO层的impl类,来直接操作数据库,并且操作完数据库以后,提交事务,完成这个流程,把结果又通过service返回给springMVC的控制层,最终返回给浏览器和app,这就是完整的流程,而关于具体的代码如何书写,事务如何优化,确实需要写代码才能搞明白...5月份把spirngMVC弄完,把mybatis弄完.关于后面的三期分布式视频,我觉得可以暂时缓一缓阿.因为整个spring还不是很熟练,自己找2个demo写一下,6月份把ssm和maven搞完了,再搞后面的分布式的技术...真的是巨多阿,7月底,就要把东西全部搞完,剩下半年时间,全部拿来实战