- SET NAMES utf8mb4;
- SET FOREIGN_KEY_CHECKS = 0;
-
- -- ----------------------------
- -- Table structure for t_student
- -- ----------------------------
- DROP TABLE IF EXISTS `t_student`;
- CREATE TABLE `t_student` (
- `id` int NOT NULL AUTO_INCREMENT,
- `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `age` int NULL DEFAULT NULL,
- PRIMARY KEY (`id`) USING BTREE
- ) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-
- -- ----------------------------
- -- Records of t_student
- -- ----------------------------
- INSERT INTO `t_student` VALUES (1, 'zhangsan', 25);
- INSERT INTO `t_student` VALUES (2, 'lisi', 28);
- INSERT INTO `t_student` VALUES (3, 'wangwu', 23);
- INSERT INTO `t_student` VALUES (4, 'Tom', 21);
- INSERT INTO `t_student` VALUES (5, 'Jck', 55);
- INSERT INTO `t_student` VALUES (6, 'Lucy', 27);
- INSERT INTO `t_student` VALUES (7, 'zhaoliu', 75);
-
- SET FOREIGN_KEY_CHECKS = 1;
- <!--MyBatis整合SpringBoot的起步依赖-->
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>2.0.0</version>
- </dependency>
-
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- </dependency>
-
- <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <version>1.18.18</version>
- <scope>provided</scope>
- </dependency>
- <build>
- <resources>
- <resource>
- <directory>src/main/java</directory>
- <includes>
- <include>**/*.xml</include>
- </includes>
- </resource>
- </resources>
-
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
-
- <!--mybatis代码自动生成插件-->
- <plugin>
- <groupId>org.mybatis.generator</groupId>
- <artifactId>mybatis-generator-maven-plugin</artifactId>
- <version>1.3.6</version>
- <configuration>
- <!--配置文件的位置-->
- <configurationFile>GeneratorMapper.xml</configurationFile>
- <verbose>true</verbose>
- <overwrite>true</overwrite>
- </configuration>
- </plugin>
- </plugins>
- </build>
注:方法二链接:JavaEE——Spring学习笔记05【Mybatis的逆行工程】
https://blog.csdn.net/qq_45037155/article/details/123019074

- <?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 驱动包所在位置,指定到你本机的完整路径 -->
- <classPathEntry location="D:\course\06-Springboot Money\springboot\mysql-connector-java-8.0.27.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/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8"
- userId="root"
- password="root">
- </jdbcConnection>
- <!-- 生成 model 类,targetPackage 指定 model 类的包名, targetProject 指定
- 生成的 model 放在 eclipse 的哪个工程下面-->
- <javaModelGenerator targetPackage="com.bjpowernode.springboot.model"
- targetProject="src/main/java">
- <property name="enableSubPackages" value="false"/>
- <property name="trimStrings" value="false"/>
- </javaModelGenerator>
- <!-- 生成 MyBatis 的 Mapper.xml 文件,targetPackage 指定 mapper.xml 文件的
- 包名, targetProject 指定生成的 mapper.xml 放在 eclipse 的哪个工程下面 -->
- <sqlMapGenerator targetPackage="com.bjpowernode.springboot.mapper"
- targetProject="src/main/java">
- <property name="enableSubPackages" value="false"/>
- </sqlMapGenerator>
- <!-- 生成 MyBatis 的 Mapper 接口类文件,targetPackage 指定 Mapper 接口类的包
- 名, targetProject 指定生成的 Mapper 接口放在 eclipse 的哪个工程下面 -->
- <javaClientGenerator type="XMLMAPPER"
- targetPackage="com.bjpowernode.springboot.mapper"
- targetProject="src/main/java">
- <property name="enableSubPackages" value="false"/>
- </javaClientGenerator>
-
- <!-- 数据库表名及对应的 Java 模型类名 -->
- <table tableName="tb_student" domainObjectName="Student"
- enableCountByExample="false"
- enableUpdateByExample="false"
- enableDeleteByExample="false"
- enableSelectByExample="false"
- selectByExampleQueryId="false"/>
- </context>
- </generatorConfiguration>
路径匹配maven仓库找到的jar包,版本号要对应
名称一一对应

@Mapper作用:mybatis自动扫描数据持久层的映射文件及DAO接口的关系

注意:默认情况下,Mybatis的xml映射文件不会编译到target的class目录下,所以我们需要在pom.xml文件中配置resource

- server.port=9003
- server.servlet.context-path=/003-springboot-mybatis
- #数据库配置
- spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
- spring.datasource.username=root
- spring.datasource.password=root
- public interface StudentService {
-
- /*
- * 根据学生标识获取学生详情
- *
- * @param id
- * @return
- * */
- Student queryStudentById(Integer id);
- }
- @Service
- public class StudentServiceImpl implements StudentService {
-
- @Autowired
- private StudentMapper studentMapper;
-
- @Override
- public Student queryStudentById(Integer id) {
- return studentMapper.selectByPrimaryKey(id);
- }
-
- }
- @Controller
- public class StudentController {
-
- @Autowired
- private StudentService studentService;
-
- @RequestMapping(value = "/springBoot/student")
- public @ResponseBody Object student() {
- System.out.println("-------student-----------");
- Student student = studentService.queryStudentById(4);
-
- return student;
- }
- }






因为SpringBoot不能自动编译接口映射的xml文件,还需要手动在pom文件中指定,所以有的公司直接将映射文件直接放到resources目录下

- #指定Mybatis映射文件的路径
- mybatis.mapper-locations=classpath:mapper/*.xml


Spring Boot 使用事务非常简单,底层依然采用的是Spring本身提供的事务管理
- 在入口类中使用注解 @EnableTransactionManagement 开启事务支持
- 在访问数据库的Service方法上添加注解 @Transactional 即可
spring 自动托管事务: 默认只检测运行时异常
- 异常:提供 程序出现例外情况,通过妥善处理,让程序能够执行下去的 一种机制
- 运行时异常:非受检查异常 由于程序人员考虑不周密,出现的例外情况
- 编译时异常:受检查异常 提醒检查程序
- Error:错误 系统(严重)层面错误
@Transactional
public class StudentServiceImpl implements StudentService {}:该类中所有方法具有事务性
@Transactional(rollbackFor = FileNotFoundException.class)
public int update(Student student) throws FileNotFoundException {}:本方法采用这种事务
事务传播性:一个事务对另外一个事务的影响
案例:卢浩 想买 手机 没有3000元(借父母:2000,借姐姐:1000)
七个事务传播属性
- PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 默认方式
- PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
- PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
- PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。
- PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
隔离级别:一般不修改
- 读未提交(Read uncommitted):这种事务隔离级别下,select语句不加锁。此时,可能读取到不一致的数据,即“读脏 ”。这是并发最高,一致性最差的隔离级别。
- 读已提交(Read committed):可以读取到已经提交的内容,可避免 脏读 的发生。
- 可重复读(Repeatable read):MySql默认隔离级别。可避免 脏读 、不可重复读 的发生。
- 串行化(Serializable ):可避免 脏读、不可重复读、幻读 的发生。
目前几乎没有数据库实现了所有隔离级别
通过SpringBoot +MyBatis实现对数据库学生表的更新操作,在service层的方法中构建异常,查看事务是否生效。(该项目是在前面项目案例的基础上添加新增方法,在新增方法中进行案例的演示)
- @Controller
- public class StudentController {
-
- @Autowired
- private StudentService studentService;
-
- @RequestMapping(value = "/springBoot/student")
- public @ResponseBody Object student() {
- System.out.println("-------student-----------");
- Student student = studentService.queryStudentById(4);
-
- return student;
- }
-
-
- @RequestMapping(value = "/springBoot/update")
- public @ResponseBody Object update() throws FileNotFoundException {
- Student student = new Student();
- student.setId(1);
- student.setName("Mark");
- student.setAge(100);
-
- int updateCount = studentService.update(student);
-
- return updateCount;
- }
- }
- public interface StudentService {
-
- /*
- * 根据学生标识获取学生详情
- *
- * @param id
- * @return
- * */
- Student queryStudentById(Integer id);
-
- /*
- * 根据学生标识更新学生信息
- *
- * @param student
- * @return
- * */
- int update(Student student) throws FileNotFoundException;
- }
- @Service
- @Transactional
- public class StudentServiceImpl implements StudentService {
-
- @Autowired
- private StudentMapper studentMapper;
-
- @Override
- @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
- public Student queryStudentById(Integer id) {
- return studentMapper.selectByPrimaryKey(id);
- }
-
- @Override
- @Transactional(rollbackFor = FileNotFoundException.class, propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
- public int update(Student student) throws FileNotFoundException {
- int num = studentMapper.updateByPrimaryKeySelective(student);
- // int j=100/0;
- // new FileInputStream("");
-
- return num;
- }
- }

可以不加,在Spring2...版本后默认开启




以下的结果:说明事务起作用了
浏览器
控制台
数据库

浏览器报错
控制台报错
数据库更新