首页>>后端>>Spring->spring配置mybatis(spring配置mybatis数据源)

spring配置mybatis(spring配置mybatis数据源)

时间:2023-12-02 本站 点击:0

SpringBoot入门实战-2.建表,建实体类,配置MyBatis

一、建库和建表语句

二、创建实体类

三、修改pom.xml,引入mysql的驱动,MyBatis,C3p0连接池

四、创建MyBatis配置文件

spring-mybatis 怎么配置

数据访问层的控制,applicationContext-dao.xml的配置:

配置加载数据连接资源文件的配置,把数据库连接数据抽取到一个properties资源文件中方便管理。

配置为:

!-- 加载数据库连接的资源文件 --

context:property-placeholder location="/WEB-INF/classes/jdbc.properties"/

其中jdbc.properties文件的内容如下:

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/database

jdbc.username=root

jdbc.password=1234

配置数据库连接池,这里使用的是dbcp,别忘了添加jar包!

!-- 配置数据源 dbcp数据库连接池 --

bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"

property name="driverClassName" value="${jdbc.driver}"/

property name="url" value="${jdbc.url}"/

property name="username" value="${jdbc.username}"/

property name="password" value="${jdbc.password}"/

/bean

spring+mybatis实现事务的配置

    1、xml文件头部需要添加spring的相关支持:

    2、配置事务管理器

    3、配置需要加入事务的方法规则,或者说是一个切面

!-- 定义事务管理器 -- 

bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager" 

  property name="dataSource" ref="dataSource" / 

/bean 

!--使用注释事务 -- 

tx:annotation-driven  transaction-manager="transactionManager" /

事物配置中有哪些属性可以配置

(1)事务的传播性:@Transactional(propagation=Propagation.REQUIRED) 

      如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)

(2)事务的超时性:@Transactional(timeout=30) //默认是30秒 

      注意这里说的是事务的超时性而不是Connection的超时性,这两个是有区别的

(3)事务的隔离级别:@Transactional(isolation = Isolation.READ_UNCOMMITTED)

      读取未提交数据(会出现脏读, 不可重复读) 基本不使用

(4)回滚:

指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。

(5)只读:@Transactional(readOnly=true)

该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。

例如:

@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class,timeout=1,isolation=Isolation.DEFAULT) 

public void saveUser(MapString, String map) throws Exception { 

    System.out.println("方法开始"); 

    for (int i = 0; i 500000; i++) { 

            System.out.println("*"); 

        } 

    System.out.println("进入保存"); 

    userDao.saveUser(map); 

    System.out.println("退出保存"); 

解释说明

事务的传播级别定义的是事务的控制范围,主要是父子事务之间的相互影响关系;事务的隔离级别定义的是事务读写的控制范围,主要是两个事务之间的相互影响关系。

传播级别:

1)、REQUIRED

如果当前方法已经在事务中,那么就以父事务执行,不需要新建事务;如果当前方法不在事务中,那么就为当前方法新建事务。回滚情况:父子方法中任何地方出现问题,都会全部回滚。

2)、SURPPORTED

如果当前方法已经在事务中,那么就以当前事务执行;如果当前方法不再事务中,那么就以非事务方式运行。如果运行在事务中,那么只要出现异常都会回滚。

3)、NOT_SURPPORTED

如果当前方法已经在事务中,那么就挂起当前事务,以非事务方式运行,方法执行完毕后,恢复事务;如果当前方法不再事务中,那么就以非事务方式执行。

4)、MANDATORY

强制以事务方式执行,如果当前方法不在事务中,那么会抛出异常。

5)、NEVER

与MANDATORY相反,强制以非事务方式执行,如果当前方法在事务中,那么会抛出异常。

6)、REQUIRED_NEW

与REQUIRED不同的是,无论该方法当前是不是在事务中,都会为自己新建一个事务。如果当前已经在事务中,那么会挂起父事务,为自己新建一个事务。父事务不影响它子事务的提交和回滚。

7)、NESTED

嵌套事务。理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。而Nested事务的好处是他有一个savepoint。

例如:

ServiceA {

/**

* 事务属性配置为 PROPAGATION_REQUIRED

*/

void methodA() {

try {

//savepoint

ServiceB.methodB(); //PROPAGATION_NESTED 级别

} catch (SomeException) {

// 执行其他业务, 如 ServiceC.methodC();

}

}

}

也就是说ServiceB.methodB失败回滚,那么ServiceA.methodA也会回滚到savepoint点上,ServiceA.methodA可以选择另外一个分支,比如ServiceC.methodC,继续执行,来尝试完成自己的事务。

原文链接:


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Spring/9954.html