• 05_SpingBoot 集成MyBatis【逆向工程】


    一、MyBatis逆向工程

    1. 创建新的数据库springboot,指定数据库字符编码为utf-8

    1. SET NAMES utf8mb4;
    2. SET FOREIGN_KEY_CHECKS = 0;
    3. -- ----------------------------
    4. -- Table structure for t_student
    5. -- ----------------------------
    6. DROP TABLE IF EXISTS `t_student`;
    7. CREATE TABLE `t_student` (
    8. `id` int NOT NULL AUTO_INCREMENT,
    9. `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
    10. `age` int NULL DEFAULT NULL,
    11. PRIMARY KEY (`id`) USING BTREE
    12. ) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
    13. -- ----------------------------
    14. -- Records of t_student
    15. -- ----------------------------
    16. INSERT INTO `t_student` VALUES (1, 'zhangsan', 25);
    17. INSERT INTO `t_student` VALUES (2, 'lisi', 28);
    18. INSERT INTO `t_student` VALUES (3, 'wangwu', 23);
    19. INSERT INTO `t_student` VALUES (4, 'Tom', 21);
    20. INSERT INTO `t_student` VALUES (5, 'Jck', 55);
    21. INSERT INTO `t_student` VALUES (6, 'Lucy', 27);
    22. INSERT INTO `t_student` VALUES (7, 'zhaoliu', 75);
    23. SET FOREIGN_KEY_CHECKS = 1;

    2. 在项目pom.xml中添加相关jar依赖

    1. <!--MyBatis整合SpringBoot的起步依赖-->
    2. <dependency>
    3. <groupId>org.mybatis.spring.boot</groupId>
    4. <artifactId>mybatis-spring-boot-starter</artifactId>
    5. <version>2.0.0</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>mysql</groupId>
    9. <artifactId>mysql-connector-java</artifactId>
    10. </dependency>
    11. <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    12. <dependency>
    13. <groupId>org.projectlombok</groupId>
    14. <artifactId>lombok</artifactId>
    15. <version>1.18.18</version>
    16. <scope>provided</scope>
    17. </dependency>
    1. <build>
    2. <resources>
    3. <resource>
    4. <directory>src/main/java</directory>
    5. <includes>
    6. <include>**/*.xml</include>
    7. </includes>
    8. </resource>
    9. </resources>
    10. <plugins>
    11. <plugin>
    12. <groupId>org.springframework.boot</groupId>
    13. <artifactId>spring-boot-maven-plugin</artifactId>
    14. </plugin>
    15. <!--mybatis代码自动生成插件-->
    16. <plugin>
    17. <groupId>org.mybatis.generator</groupId>
    18. <artifactId>mybatis-generator-maven-plugin</artifactId>
    19. <version>1.3.6</version>
    20. <configuration>
    21. <!--配置文件的位置-->
    22. <configurationFile>GeneratorMapper.xml</configurationFile>
    23. <verbose>true</verbose>
    24. <overwrite>true</overwrite>
    25. </configuration>
    26. </plugin>
    27. </plugins>
    28. </build>

    3. 在项目下导入GeneratorMapper.xml

    注:方法二链接:JavaEE——Spring学习笔记05【Mybatis的逆行工程】https://blog.csdn.net/qq_45037155/article/details/123019074

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE generatorConfiguration
    3. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    4. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    5. <generatorConfiguration>
    6. <!-- 指定连接数据库的 JDBC 驱动包所在位置,指定到你本机的完整路径 -->
    7. <classPathEntry location="D:\course\06-Springboot Money\springboot\mysql-connector-java-8.0.27.jar"/>
    8. <!-- 配置 table 表信息内容体,targetRuntime 指定采用 MyBatis3 的版本 -->
    9. <context id="tables" targetRuntime="MyBatis3">
    10. <!-- 抑制生成注释,由于生成的注释都是英文的,可以不让它生成 -->
    11. <commentGenerator>
    12. <property name="suppressAllComments" value="true"/>
    13. </commentGenerator>
    14. <!-- 配置数据库连接信息 -->
    15. <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
    16. connectionURL="jdbc:mysql://localhost:3306/springboot?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=GMT%2B8"
    17. userId="root"
    18. password="root">
    19. </jdbcConnection>
    20. <!-- 生成 model 类,targetPackage 指定 model 类的包名, targetProject 指定
    21. 生成的 model 放在 eclipse 的哪个工程下面-->
    22. <javaModelGenerator targetPackage="com.bjpowernode.springboot.model"
    23. targetProject="src/main/java">
    24. <property name="enableSubPackages" value="false"/>
    25. <property name="trimStrings" value="false"/>
    26. </javaModelGenerator>
    27. <!-- 生成 MyBatis 的 Mapper.xml 文件,targetPackage 指定 mapper.xml 文件的
    28. 包名, targetProject 指定生成的 mapper.xml 放在 eclipse 的哪个工程下面 -->
    29. <sqlMapGenerator targetPackage="com.bjpowernode.springboot.mapper"
    30. targetProject="src/main/java">
    31. <property name="enableSubPackages" value="false"/>
    32. </sqlMapGenerator>
    33. <!-- 生成 MyBatis 的 Mapper 接口类文件,targetPackage 指定 Mapper 接口类的包
    34. 名, targetProject 指定生成的 Mapper 接口放在 eclipse 的哪个工程下面 -->
    35. <javaClientGenerator type="XMLMAPPER"
    36. targetPackage="com.bjpowernode.springboot.mapper"
    37. targetProject="src/main/java">
    38. <property name="enableSubPackages" value="false"/>
    39. </javaClientGenerator>
    40. <!-- 数据库表名及对应的 Java 模型类名 -->
    41. <table tableName="tb_student" domainObjectName="Student"
    42. enableCountByExample="false"
    43. enableUpdateByExample="false"
    44. enableDeleteByExample="false"
    45. enableSelectByExample="false"
    46. selectByExampleQueryId="false"/>
    47. </context>
    48. </generatorConfiguration>

    路径匹配maven仓库找到的jar包,版本号要对应

    名称一一对应

    4. 双击执行mybatis-generator:generate生成所需

    5. 在Mybatis反向工程生成的StudentMapper接口上加一个Mapper注解

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

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

    二、在逆向工程基础上实现案例 

    1. 配置application.properties文件

    1. server.port=9003
    2. server.servlet.context-path=/003-springboot-mybatis
    3. #数据库配置
    4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    5. spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
    6. spring.datasource.username=root
    7. spring.datasource.password=root

    2.创建StudentService接口

    1. public interface StudentService {
    2. /*
    3. * 根据学生标识获取学生详情
    4. *
    5. * @param id
    6. * @return
    7. * */
    8. Student queryStudentById(Integer id);
    9. }

    3.创建StudentServiceImpl实现类

    1. @Service
    2. public class StudentServiceImpl implements StudentService {
    3. @Autowired
    4. private StudentMapper studentMapper;
    5. @Override
    6. public Student queryStudentById(Integer id) {
    7. return studentMapper.selectByPrimaryKey(id);
    8. }
    9. }

    4.创建StudentController实现类

    1. @Controller
    2. public class StudentController {
    3. @Autowired
    4. private StudentService studentService;
    5. @RequestMapping(value = "/springBoot/student")
    6. public @ResponseBody Object student() {
    7. System.out.println("-------student-----------");
    8. Student student = studentService.queryStudentById(4);
    9. return student;
    10. }
    11. }

    4. 启动Application应用,浏览器访问测试运行

     

    三、 DAO其它开发方式

    1. 在运行的主类上添加注解包扫描@MapperScan()

    (1)注释掉StudentMapper接口上的@Mapper注解,添加@Repository注解

    (2)在运行主类Application上加 @MapperScan("com.suke.springboot.mapper")

    或 @MapperScan(basePackages = "com.suke.springboot.mapper")

    (3)启动Application应用,浏览器访问测试运行

    2. 将接口和映射文件分开

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

    (1)在resources目录下新建目录mapper存放映射文件,将StudentMapper.xml文件移到resources/mapper目录下

    (2)在application.properties配置文件中指定映射文件的位置,这个配置只有接口和映射文件不在同一个包的情况下,才需要指定

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

    (3)启动Application应用,浏览器访问测试运行

    四 、Spring Boot 事务支持

    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 ):可避免 脏读、不可重复读、幻读 的发生。

    目前几乎没有数据库实现了所有隔离级别

    1. 案例思路

    通过SpringBoot +MyBatis实现对数据库学生表的更新操作,在service层的方法中构建异常,查看事务是否生效。(该项目是在前面项目案例的基础上添加新增方法,在新增方法中进行案例的演示

    2. 实现步骤

    (1)在StudentController中添加更新学生的方法

    1. @Controller
    2. public class StudentController {
    3. @Autowired
    4. private StudentService studentService;
    5. @RequestMapping(value = "/springBoot/student")
    6. public @ResponseBody Object student() {
    7. System.out.println("-------student-----------");
    8. Student student = studentService.queryStudentById(4);
    9. return student;
    10. }
    11. @RequestMapping(value = "/springBoot/update")
    12. public @ResponseBody Object update() throws FileNotFoundException {
    13. Student student = new Student();
    14. student.setId(1);
    15. student.setName("Mark");
    16. student.setAge(100);
    17. int updateCount = studentService.update(student);
    18. return updateCount;
    19. }
    20. }

    ​​​​​​​(2)在StudentService接口中添加更新学生方法

    1. public interface StudentService {
    2. /*
    3. * 根据学生标识获取学生详情
    4. *
    5. * @param id
    6. * @return
    7. * */
    8. Student queryStudentById(Integer id);
    9. /*
    10. * 根据学生标识更新学生信息
    11. *
    12. * @param student
    13. * @return
    14. * */
    15. int update(Student student) throws FileNotFoundException;
    16. }

    ​​​​​​​(3)在StudentServiceImpl接口实现类中对更新学生方法进行实现,并构建一个异常,同时在该方法上加@Transactional注解

    1. @Service
    2. @Transactional
    3. public class StudentServiceImpl implements StudentService {
    4. @Autowired
    5. private StudentMapper studentMapper;
    6. @Override
    7. @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    8. public Student queryStudentById(Integer id) {
    9. return studentMapper.selectByPrimaryKey(id);
    10. }
    11. @Override
    12. @Transactional(rollbackFor = FileNotFoundException.class, propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
    13. public int update(Student student) throws FileNotFoundException {
    14. int num = studentMapper.updateByPrimaryKeySelective(student);
    15. // int j=100/0;
    16. // new FileInputStream("");
    17. return num;
    18. }
    19. }

    ​​​​​​​(4)在Application类上加@EnableTransactionManagement开启事务支持

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

    (5)启动Application,通过浏览器访问进行测试

     

     (6)设置经典 运行时异常 问题

     以下的结果:说明事务起作用了

    浏览器 

    控制台

    数据库

     ​​​​​​​

    (7)注释掉StudentServiceImpl上的@Transactional测试

    浏览器报错

     控制台报错

     数据库更新

     ​​​​​​​

  • 相关阅读:
    pytorch 多GPU训练
    vue 使用crypto.js解密后,用JSON.parse转义报错非空白格解决办法
    手写嵌入式操作系统(基于stm8单片机)
    高标准农田可视化
    MAC版Gradle构建Spring5.X源码阅读环境
    健身器材销售网站的设计与实现(SSH)
    【向题看齐】408之计算机组成原理概念记忆总结
    C语言-基础
    Codeforces Round 908
    Linux编辑器-vim使用
  • 原文地址:https://blog.csdn.net/qq_45037155/article/details/125428458