1.Spring框架中的事务:51
1)管理事务对象:事务管理器(接口、接口有很多实现类)
例如:使用JDBC或mybatis访问数据库,使用事务管理器:DataSourceTransactionManager
2)声明事务:在xml配置文件或使用注释解释事务控制的内容
控制事务:隔离等级,传播行为,超时
1.1事务处理方式:在Spring框架中@Transactional
aspectj框架可以在xml配置文件中声明事务控制的内容
2.使用mybatis代码自动生成插件(mybatis逆向工程)52-532.1在pom.添加-mybatis代码自动生成插件52该插件的功能可以帮助我们根据数据库表中的结构生成相应的物理类别、接口和sql映射文件
<!--处理资源目录--><resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> </includes> </resource></resources><plugins><!--mybatis代码自动生成插件 52 该插件的功能可以帮助我们根据数据库表中的结构生成相应的实体类--><plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.6</version> <configuration> <!--配置文件的位置: 在项目根目录下,与src平等--> <configurationFile>GeneratorMapper.xml</configurationFile> <verbose>true</verbose> <overwrite>true</overwrite> </configuration></plugin>
2.2在项目根路径下(即course9目录下)添加Generatormaper.xml53<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration> <!-- 指定JDBC驱动包连接数据库的位置,并指定您机器的完整路径 53--> <classPathEntry location="E:\java\tools\mysql-connector-java-8.0.30.jar"/> <!-- table表信息内容体配置,targetruntime指定Mybatis3版本 --> <context id="tables" targetRuntime=“MyBatis3”> <!-- 抑制产生注释,因为产生的注释都是英文的,它不能生成 --> <commentGenerator> <property name="suppressAllComments" value="true" /> </commentGenerator> <!-- 配置数据库连接信息 --> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/springdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8" userId="root" password="lzl"> </jdbcConnection> <!-- 生成model类,targetPackage指定model类包名, targetproject指定生成的model放在eclipse的哪个项目下?--> <javaModelGenerator targetPackage="com.bjpowernode.model" targetProject="E:\java学习SpringBoot\course\course9src\main\java"> <property name="enableSubPackages" value="false" /> <property name="trimStrings" value="false" /> </javaModelGenerator> <!-- Mapper生成MyBatis.xml文件,targetPackage指定mapper.xml文件的包名, targetproject指定生成的mapper.eclipse下放置xml的哪个项目? --> <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- Mapper接口类文件生成MyBatis,targetPackage指定Mapper接口类包名, targetproject指定的Mapper接口放在eclipse下面的哪个项目? --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.bjpowernode.dao" targetProject="src/main/java"> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- 数据库表名及相应的Java模型类名 --> <table tableName="student" domainObjectName="Student" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> </context></generatorConfiguration>
打开双击
生成成功的dao接口、实体类、mybatissql映射文件
这里生成的StudentMaper提示.xml必须检查以下内容,不要生成更多
3.在SpringBoot中使用事务:52在Spring框架中@Transactional
aspectj框架可以在xml配置文件中声明事务控制的内容
以上两种方法都可以。
3.1例52我们的实体类、dao接口、dao接口对应的mybatissqql映射文件都是逆向工程实现的
1)将其添加到业务方法中@Transactional,添加注释后,该方法具有事务功能。
2)明确加入主启动类@EnableTransactionManager
application.properties#设置端口 54server.port=9002#context-pathserver.servlet.context-path=/mytrans#Springg配置数据库.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/springdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8spring.datasource.username=rootspring.datasource.password=lzl#配置mybatis 指定mapper文件的位置配置mybatis.mapper-locations=classpath:mapper/*.xml#开启日志mybatistis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
StudentServicent业务层接口package com.bjpowernode.service;import com.bjpowernode.model.Student;///业务层接口 55public interface StudentService { int addStudent(Student student);}
业务层接口实现StudentServiceimplimplepackage com.bjpowernode.service.impl;import com.bjpowernode.dao.StudentMapper;import com.bjpowernode.model.Student;import com.bjpowernode.service.StudentService;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;///业务接口实现类 55@Servicepublic class StudentServiceImpl implements StudentService { @Resource private StudentMapper studentDao; /** * @Transactional: 表示方法有事务支持 55 * 默认:使用图书馆的隔离级别, REQUIRED 传播行为; 超时时间 -1 * 抛出运行时异常,回滚事务 */ @Transactional //添加事务 @Override public int addStudent(Student student) { System.out.println(“业务方法addstudent”; int rows = studentDao.insert(student); System.out.println(执行sql语句); //抛出一个操作异常, 目的是回滚事务 //int m = 10 / 0 ; return rows; }}
表示层package com.bjpowernode.controller;import com.bjpowernode.model.Student;import com.bjpowernode.service.StudentService;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.Resource;//表示层 56@Controllerpublic class StudentController { @Resource private StudentService service; @RequestMapping("/addStudent") @ResponseBody public String addStudent(String name,Integer age){ Student s1 = new Student(); s1.setName(name); s1.setAge(age); ///调用业务层增加方法 int rows = service.addStudent(s1); return “加学生:”+rows; }}
Course9aplication测试package com.bjpowernode;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 //启动事务管理器 56@MapperScan(basePackages = "com.bjpowernode.dao)/自动生成dao接口,实现publicic class Course9Application { public static void main(String[] args) { SpringApplication.run(Course9Application.class, args); }}
输入浏览器http://localhost:9002/mytrans/addStudent?name=李想&age=26
报错意味着控制了事务
我们注释了StudentServiceimpl的业务层接口异常,并成功添加了它