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();语句,手动回滚,这样上层就无需去处理异常(推荐)。

 

posted @ 2017-09-18 23:50  猴子1  阅读(191)  评论(0编辑  收藏  举报