>  기사  >  Java  >  springboot에서 mybatis 및 트랜잭션 관리를 구성하는 방법

springboot에서 mybatis 및 트랜잭션 관리를 구성하는 방법

WBOY
WBOY앞으로
2023-05-10 19:13:221217검색

1. 스프링 부트와 mybatis 구성

1. 먼저 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>

여기서는 주로 위의 데이터베이스 드라이버 패키지에 대해 소개합니다. 의존성을 잊지 마세요. 도입하는 것을 잊어버린 경우 드라이버 클래스를 찾을 수 없음 예외가 보고됩니다.

2. 그런 다음 application.properties 구성 파일에 다음 내용을 추가합니다. 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
##指向实体类的位置
mybatis.type-aliases-package=cloud.user.models.*

上边以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等,先把项目具体的放置结构贴出来如下:

springboot에서 mybatis 및 트랜잭션 관리를 구성하는 방법

对于上图的解释如下:

启动类必须放在项目中相对其他类的最高处,前边文章说过,spring boot没有传统的spring 项目配置的 标签,它扫描bean的方式就是从启动类依次向下扫描进默认的内置tomcat容器的。

上图service放置的位置比其实现类放置的位置高,如果有两个service A和B,实现类里有Aimpl和Bimpl,如果有Aimpl调用B的情况,有可能会在启动容器报“a field named ‘B’ not found”貌似这种错误,说明容器扫描顺序有误。

这种情况的最好的解决办法,就应该像我将service放在高处,容器启动先扫描进service,然后再扫描impl,这样在实现类扫描的时候就肯定能找到service,也就不会出现这种错误了。另一种解决办法是在引入service时多添加一个注解:@Lazy

@Autowired
@Lazy //这样就会延迟加载,上图不需要,这里只是解释这注解
LogsUserActiveMapper logsUserActiveMapper;

总之,如果出现调用与被调用关系,一定要记得,被调用者要首先被扫描进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.datasource로 시작하는 내용이 많이 있습니다. application.properties 파일에 입력하고 무엇을 클릭할 수 있는지 확인하세요.   

springboot는 기본적으로 spring.datasource로 시작하는 정보를 수집하고 DataSource 객체를 구성한 다음 sqlSessionFactory 및 기타 관련 데이터베이스 연결 구성을 구성하므로 많은 사람들이 어떤 구성 클래스를 작성해야할지 이야기 할 것입니다. 그것들이 불필요하다고 생각하세요. (druid를 구성하려면 @Bean이 필요합니다.)  🎜🎜물론, 특히 상세하고 application.properties 파일의 spring.datasource를 통해 관련 구성을 클릭할 수 없는 경우에는 클래스 등을 구성해야 합니다. 🎜🎜mybatis.mapper-locations 가리키는 위치는 src/main/resource부터 시작하며, 앞에 classpath를 추가해야 합니다. 이는 mapper.xml 파일이 있는 위치를 가리킵니다. 🎜🎜3. 마이바티스는 데이터베이스 테이블의 리버스 엔지니어링을 통해 엔터티 클래스, 매퍼 등을 생성했습니다. 먼저 프로젝트의 구체적인 배치 구조를 다음과 같이 게시했습니다. 🎜🎜🎜🎜위 그림에 대한 설명은 다음과 같습니다.🎜 🎜스타트업 클래스는 프로젝트에 배치되어야 합니다. 이전 기사에서 언급한 것처럼 다른 클래스의 최상위에 비해 스프링 부트에는 스프링 프로젝트에서 구성된 전통적인 태그가 없습니다. 시작 클래스에서 기본 내장 Tomcat 컨테이너로 내려갑니다. 🎜🎜위 그림에서 서비스는 구현 클래스보다 상위에 배치되어 있으며 서비스 A와 B가 있고 구현 클래스에 Aimpl과 Bimpl이 있는 경우 Aimpl이 B를 호출하면 시작 시 ""가 보고될 수 있습니다. 컨테이너를 찾을 수 없습니다.라는 필드는 컨테이너 검색 순서가 잘못되었음을 나타내는 오류인 것 같습니다. 🎜🎜이 상황에 대한 가장 좋은 해결책은 저처럼 서비스를 높은 곳에 배치하는 것입니다. 컨테이너가 시작될 때 서비스를 먼저 스캔한 다음 impl을 스캔하면 구현 시 서비스를 확실히 찾을 수 있습니다. 클래스 스캐닝, 즉 이 오류는 더 이상 발생하지 않습니다. 또 다른 해결책은 서비스를 도입할 때 추가 주석을 추가하는 것입니다: @Lazy🎜rrreee🎜 간단히 말해서 호출과 호출받는 것 사이에 관계가 있는 경우 먼저 호출 수신자를 스프링 부트 내장 컨테이너로 스캔해야 한다는 점을 기억해야 합니다. 즉, 호출자의 패키지 위치가 더 높게 배치되어야 합니다(위치는 최소한 동일해야 함). 🎜🎜4. 서비스 구현 클래스에 @Service 주석을 추가해야 합니다. 이것은 필요하지 않을 수도 있습니다. 아직 시도하지 않았습니다.  🎜🎜5.spring boot+mybatis 이러한 요구 사항 외에도 다음과 같이 시작 클래스에 @MapperScan 주석을 추가해야 합니다.🎜rrreee🎜다음은 내 mapper.xml에 있는 네임스페이스의 값입니다🎜 rrreee🎜**이렇게 하면 Mybatis가 구성되었습니다. 🎜🎜2. Transaction 구성🎜🎜mybatis를 기반으로 2개의 Annotation을 추가하는 것입니다🎜🎜1. 필수 Annotation은 @EnableTransactionManagement@Transactional 둘, 다음 패키지에서 나옵니다: 🎜<blockquote>🎜spring-tx.jar🎜</blockquote>🎜사실 이 패키지는 mybatis가 종속성을 도입하도록 구성되었을 때 자동으로 도입되었습니다. 이는 다음과 같습니다. : 🎜 rrreee🎜위의 종속성이 도입되는 한 트랜잭션을 패키지로 가져올 필요가 없습니다. 🎜🎜2 먼저 서비스 구현 클래스를 찾아 <code>@Transactional 주석을 추가하세요. . 클래스에 추가하면 해당 클래스의 모든 메소드가 트랜잭션에 의해 관리됩니다. 메소드에 추가하면 이 메소드만 특정 트랜잭션을 준수합니다. 물론, 우리는 보통 그것을 메소드에 추가합니다. 추가, 삭제, 수정에만 트랜잭션이 필요하기 때문입니다. 🎜🎜예를 들어 다음과 같은 데이터 삽입 방법은 트랜잭션을 추가합니다. 🎜rrreee🎜 내용을 모르는 경우 이 기사를 참조하세요. spring, mybatis 트랜잭션 관리 구성 및 @Transactional 주석 사용 🎜🎜3. 스프링 부트 시작 클래스는 트랜잭션을 활성화해야 하며 트랜잭션을 활성화하는 데 사용되는 주석은 다음과 같이 @EnableTransactionManagement입니다. 🎜rrreee🎜이렇게 하면 트랜잭션 구성이 완료됩니다. 🎜

위 내용은 springboot에서 mybatis 및 트랜잭션 관리를 구성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제