Java Spring+Spring MVC+MyBatis整合
一:
依赖Spring、Spring MVC、MyBatis所需jar和整合所需jar
二:
创建Spring的配置文件:
1)、配置数据源(这里用的是DBCP1):
2)、创建
创建SqlSessionFactory,关联mybatis配置文件
mybatis-config.xml
3)、配置事务,以及指定该事务的传播特性和切点(对哪个类,哪个方法起作用)(事务的配置,在前两篇中写的比较详细,这里只是做简单说明):
四:
创建POJO和Mapper接口以及对应的Service接口,并实现创建的Service接口:
1)创建POJO(普通的Java类,对应数据库中的一张表的所有列,其中是要生成get和set方法的)
2):创建Mapper接口和Mapper的映射XML,并在mybatis-config.xml中注册Mapper的映射XML,Mapper的映射XML中的增删改查名字须和Mapper接口中的方法名一致
在mybatis-config.xml中注册Mapper的映射XML(关联POJO,并起别名,方便在Mapper的映射XML中引用):
Mapper的映射XML:里面的namespace是映射的Mapper接口全路径,id是Mapper接口中的方法名,paramType可以是POJO文件的全路径也可以是在mybatis-config.xml中关联了POJO文件的别名。
制定一个该逻辑的Service接口:
然后是实现上面的Service接口,并在里面做相关的业务逻辑操作:
(我们没有在Spring中创建UserInfoMapper的实例化,为什么可以用Resource注解?原因:最后一步会在Spring的配置文件个Mapper的自动扫描装置,会自动完成该Mapper并设置别名,我们只需要将首字母小写或使用AutoWirte注解即可)
最后(填前面挖的一个坑),在Spring的配置XML中配置Mapper接口的自动扫描,mybatis整合包中提供的有MapperScannerConfigurer类,设置扫描哪个包下的所有Mapper接口
最后的最后,后面的删除、修改、查询、也是同样的道理,其中,POJO、Mapper、Service是可以用mybatis generator工具完成的,详情请看后面篇章!
END 刚学的可能会觉得Service层有点多余,为什么不用Controller直接去调用DAO(Mapper)层?
原因:Controller层是连接层,主要做与外界的交互
Service层主要做业务逻辑的控制
DAO层主要做和数据库的相关操作
如果把业务逻辑也交给Controller层做,那么会显得Controller层过于复杂,后期不好维护,这是其一,其二是事物处理操作一般在Service层做处理(也可以改,改切点,但不建议这么做),若放在Controller层会无法抓到事物或者代码过于复杂(纯属个人理解)。
正常的调用结构:Request->Controller->Service->DAO->Service->Controller->Response
可以Service去调用Service,但绝不能Controller直接去调用DAO(这也算是业界一个不成文的规定吧)
事物回滚:
默认Spring 事务只在发生未被捕获的 RuntimeExcetpion时才回滚。
Spring Aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样Aop代理才能捕获到方法的异常,才能进行回滚,默认情况下Aop只捕获RuntimeExcetpion的异常,但可以通过 配置来捕获特定的异常并回滚换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new RuntimeExcetpion(),这样程序异常时才能被Aop捕获进而回滚。
解决方案:
方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeExcetpion()语句,以便让Aop捕获异常再去回滚,并且在service上层(webservice客户端,Controller)要继续捕获这个异常并处理。
方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常(推荐)。