spring boot配置mybatis和事务管理

一、spring boot与mybatis的配置

1.首先,spring boot 配置mybatis需要的全部依赖如下:

<!-- Spring Boot 启动父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
</parent>
<!--以上内容放在dependencies标签外,如果你有已经有父标签,那将以上部分粘贴到父项目中-->
<!-- spring boot 项目启动必须引入的web依赖,以下内容放在dependency即可 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.1.RELEASE</version>
</dependency>
<!-- Spring Boot Mybatis 依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!-- oracle的数据库驱动包 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4.0-atlassian-hosted</version>
</dependency>

  这里主要说一下上边的数据库驱动包,oracle和mysql引入不同的依赖,千万不要忘记。如果忘记引入,会报找不到驱动类异常。 
2.然后,在application.properties 配置文件里添加如下内容:

##数据库连接信息
spring.datasource.url=jdbc:oracle:thin:@//192.168.1.171:1521/orcl
spring.datasource.username=znxd
spring.datasource.password=znxd
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
##指向mapper的xml文件位置
mybatis.mapper-locations=classpath:mapper/*Mapper.xml

  上边以spring.datasource 开头的内容其实有很多,具体,在application.properties 文件里输入后看看能点出的内容就知道了。 
  springboot默认会把spring.datasource开头的信息收纳,进行DataSource对象的配置,进而进行sqlSessionFactory的配置等相关数据库连接的配置,所以其他很多人会说写什么配置类,那些我感觉没有必要的。(配置druid需要配一个@Bean,下一篇会说到) 
  当然如果是特别详细的,而在application.properties文件里又通过spring.datasource 点不出相关的配置,那可能需要配置类什么的。 
  mybatis.mapper-locations 所指向的位置是从src/main/resource开始的,前边需要加上classpath,它指向的是你的mapper.xml文件放置的位置。 
3.我是mybatis通过数据库表逆向工程生成的实体类、mapper等,先把项目具体的放置结构贴出来如下:

对于上图的解释如下:

  1. 启动类必须放在项目中相对其他类的最高处,前边文章说过,spring boot没有传统的spring 项目配置的<bean> 标签,它扫描bean的方式就是从启动类依次向下扫描进默认的内置tomcat容器的。
  2. 上图service放置的位置比其实现类放置的位置高,如果有两个service A和B,实现类里有Aimpl和Bimpl,如果有Aimpl调用B的情况,有可能会在启动容器报“a field named ‘B’ not found”貌似这种错误,说明容器扫描顺序有误。
  3. 这种情况的最好的解决办法,就应该像我将service放在高处,容器启动先扫描进service,然后再扫描impl,这样在实现类扫描的时候就肯定能找到service,也就不会出现这种错误了。
  4. 另一种解决办法是在引入service时多添加一个注解:@Lazy 
    @Autowired 
    @Lazy //这样就会延迟加载,上图不需要,这里只是解释这注解 
    LogsUserActiveMapper logsUserActiveMapper;
  5. 总之,如果出现调用与被调用关系,一定要记得,被调用者要首先被扫描进spring boot内置容器,也就是被调用者的包位置要放的较高一些(位置至少也待相平)。

  4.service实现类上需要加一个@Service 注解。这个可能不需要,我一直没有试试。 
  5.spring boot+mybatis除了这些要求,还需要在启动类处添加一个注解@MapperScan,如下:

package cloud.kafka;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement; @SpringBootApplication
@EnableTransactionManagement //如果mybatis中service实现类中加入事务注解,需要此处添加该注解
@MapperScan("cloud.kafka.mapper") //扫描的是mapper.xml中namespace指向值的包位置
public class KafkaLogApplication {
public static void main(String[] args){
SpringApplication.run(KafkaLogApplication.class, args);
}
}

如下是我的mapper.xml里namespace的值

<mapper namespace="cloud.kafka.mapper.LogsUserActiveMapper" >

**这样就完成mybatis的配置了。

二、事务的配置,就是在mybatis的基础上加上两个注解。 
1、需要的注解为@EnableTransactionManagement 和@Transactional 两个,它们来自于下边这个包:

spring-tx.jar

该包其实在前边配置mybatis引入依赖时,已自动引入,就是下边这个:

 <!-- Spring Boot Mybatis 依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>

所以只要上边的依赖引入进来,那事务就不需要再引入包了, 
2.首先,找到你的service实现类,加上@Transactional 注解,如果你加在类上,那该类所有的方法都会被事务管理,如果你加在方法上,那仅仅该方法符合具体的事务。当然我们一般都是加在方法上。因为只有增、删、改才会需要事务。 
比如下边的一个插入数据的方法添加事务:

@Override
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,timeout=36000,rollbackFor=Exception.class)
public Integer add(Cbf_jtcy t) {
return cbf_jtcyMapper.insert(t);
}

如果不知道里边都是什么东西,可以查看这篇文章,spring,mybatis事务管理配置与@Transactional注解使用

3.配置完后,spring boot启动类必须要开启事务,而开启事务用的注解就是@EnableTransactionManagement,如下:

@SpringBootApplication
@EnableTransactionManagement
@MapperScan("microservice.qssj.mapper")//必须加这个,不加报错,如果不加,也可以在每个mapper上添加@Mapper注释,并且这里还要多填一个注释,那个我忘了,我一直用这个注解
public class QssjServiceApplication {
public static void main(String[] args) {
SpringApplication.run(QssjServiceApplication.class, args);
}
}

这样就完成了事务的配置。

下一篇写spring boot + druid配置。

spring boot配置mybatis和事务管理的更多相关文章

  1. Spring+JTA+Atomikos+mybatis分布式事务管理

    我们平时的工作中用到的Spring事务管理是管理一个数据源的.但是如果对多个数据源进行事务管理该怎么办呢?我们可以用JTA和Atomikos结合Spring来实现一个分布式事务管理的功能.了解JTA可 ...

  2. 关于Spring Boot 多数据源的事务管理

    自己的一些理解:自从用了Spring Boot 以来,这近乎零配置和"约定大于配置"的设计范式用着确实爽,其实对零配置的理解是:应该说可以是零配置可以跑一个简单的项目,因为Spri ...

  3. spring boot 使用 mybatis 开启事务回滚 的总结

    1.前言 以前没有使用mybatis,可以关闭自动提交,然后做sql操作,对操作进行catch捕获异常, 如果没有异常则commit 提交 ,有异常则 rollback 回滚,新增的数据则删除 ,修改 ...

  4. Spring Boot配置Mybatis

    在pom里加了mybatis的依赖后,在application.properties加上: mybatis.config-location=classpath:mybatis-config.xml m ...

  5. spring boot系列(六)spring boot 配置mybatis(xml简化版)

    orm框架的本质是简化编程中操作数据库的编码,发展到现在基本上就剩两家了,一个是宣称可以不用写一句SQL的hibernate,一个是可以灵活调试动态sql的mybatis,两者各有特点,在企业级系统开 ...

  6. Spring boot 配置 mybatis xml和动态SQL 分页配置

    更新时间 2018年4月30日23:27:07 1.pom.xml <?xml version="1.0" encoding="UTF-8"?> & ...

  7. spring boot 配置mybatis plus 控制台打印sql

    spring boot 版本2.1.5 mybatis plus 版本3.1.1 aplication.properties中添加 logging.level.com.demo.system.mapp ...

  8. spring boot快速入门 5: 事务管理

    事务管理: 新增两名女生: 第一步:创建 GirlRespository package com.payease.service; import com.payease.entity.Girl; im ...

  9. spring boot + druid + mybatis + atomikos 多数据源配置 并支持分布式事务

    文章目录 一.综述 1.1 项目说明 1.2 项目结构 二.配置多数据源并支持分布式事务 2.1 导入基本依赖 2.2 在yml中配置多数据源信息 2.3 进行多数据源的配置 三.整合结果测试 3.1 ...

随机推荐

  1. coding style 的两点

    通俗介绍coding style两点建议: 模块划分 这个如果做得不好,简直不能忍.有的代码非常莫名其妙,有些东西本身不复杂,非要将其拆成好几个部分,然后做成一个一个碎散的模块,这样并不好.举个例子, ...

  2. css怎么设置2个div同行,第一个固定宽度,第二个占满剩余的部分

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. h5调用手机摄像头/相册

    <!DOCTYPE HTML><html><head> <title>上传图片</title> <meta charset=" ...

  4. 【转】Jmeter变量参数化及函数应用

    我们在使用Jmeter录制脚本后,经常会对已录制的脚本进行修改,需要把一些参数使用一些变量替代,Jmeter是支持这些功能的,不过是通过函数实现的.下面举一个简单的例子,使用随机数替代一个参数: 打开 ...

  5. 记录关于ubuntu无线上网只能ping通5~7个数据包的问题

    问题是这样的,我的笔记本(ubuntu desktop)连接上wifi后,信号很好,但是上网上不了,ping网关也不通,ping外网仅仅只有当笔记本刚刚连接上wifi的时候能ping通5至6个包,然后 ...

  6. 线程queue、线程进程池、异步回调机制

    1. 线程 queue queue is especially useful in threaded programming when information must be exchanged sa ...

  7. Python的urllib和urllib2模块

    Python的urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功能.他们两个最显着的差异如下: urllib2可以接受一个Request对象,并以此可以来设置一个URL的h ...

  8. python+selenium+Firefox+pycharm版本匹配

    window(2018-05-29)最新 python:3.6.1    地址https://www.python.org/downloads/release/python-361/ selenium ...

  9. django之管理静态文件

    管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义静态内容 STATIC_URL = '/static/' STATICFILES_DIRS = [ o ...

  10. 前端Blob对象的使用

    最近移动端界面给后台传数据时用到Blob,它可以看做是存放二进制数据的容器: //上传图片数据封装 function uploadPhotoData(data,fileName){ var imgAr ...