• 五、Spring Boot 整合持久层技术(2)


    本章概要

    • 整合 MyBatis

    5.2 整合 MyBatis

    MyBatis 是一款优秀的持久层框架,原名 iBatis ,2010年迁移到 Goole Code 并改名为 MyBatis ,2013年迁移到 GitHub 上。MyBatis 支持定制化 SQL 、存储过程及高级映射。MyBatis 几乎避免了所有的 JDBC 代码手动设置参数以及获取结果集。在传统的 SSM 框架整合中,使用 MyBatis 需要大量的 XML 配置,而在 Spring Boot 中,MyBatis 提供了一套自动化配置方案,可以做到 MyBatis 开箱即用。
    在这里插入图片描述

    1. 创建项目

    创建 Spring Boot 项目,添加 MyBatis 依赖、数据库驱动依赖以及数据库连接池依赖,如下:

    <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-webartifactId>
      <exclusions>
        
        <exclusion>
          <groupId>com.fasterxml.jackson.coregroupId>
          <artifactId>jackson-databindartifactId>
        exclusion>
      exclusions>
    dependency>
    
    <dependency>
      <groupId>com.alibabagroupId>
      <artifactId>fastjsonartifactId>
      <version>1.2.78version>
    dependency>
    <dependency>
      <groupId>org.mybatis.spring.bootgroupId>
      <artifactId>mybatis-spring-boot-starterartifactId>
      <version>1.3.2version>
    dependency>
    <dependency>
      <groupId>com.alibabagroupId>
      <artifactId>druidartifactId>
      <version>1.1.9version>
    dependency>
    <dependency>
      <groupId>mysqlgroupId>
      <artifactId>mysql-connector-javaartifactId>
      <scope>runtimescope>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    2. 创表、实体类等

    CREATE TABLE `book` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(128) DEFAULT NULL,
      `author` varchar(128) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    实体类 Book

    public class Book {
        private Integer id;
        private String name;
        private String author;
        @Override
        public String toString() {
            return "Book{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", author='" + author + '\'' +
                    '}';
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    数据库连接配置 application.properties

    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.url=jdbc:mysql://localhost:3306/weirdo?useUnicode=true&characterEncoding=utf8&useSSL=true
    spring.datasource.username=root
    spring.datasource.password=root
    
    • 1
    • 2
    • 3
    • 4

    3. 创建数据库访问层

    创建 BookMapper

    @Mapper
    public interface BookMapper {
        int addBook(Book book);
        int deleteBookById(Integer id);
        int updateBookById(Book book);
        Book getBookById(Integer id);
        List<Book> getAllBooks();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    代码解释:

    • 在项目的根包下面创建一个子包 Mapper ,在 Mapper 中创建 BookMapper
    • 有两种方式指明该类是一个 Mapper:第一种如前面的代码所示,在 BookMapper 上添加 @Mapper 注解,表名该接口是一个 MyBatis 中的 Mapper ,这种方式需要在每一个 Mapper 上都添加注解;还有一种简单的方式是在配置类上添加 @MapperScan(“com.sang.mapper”) 注解,表示扫描 com.sang.mapper 包下的所有接口作为 Mapper ,这样就不需要在每个接口上配置 @Mapper 注解了

    4. 创建 BookMapper.xml

    
    DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.sang.mapper.BookMapper">
        <insert id="addBook" parameterType="com.sang.model.Book">
        INSERT INTO book(name,author) VALUES (#{name},#{author})
        insert>
        <delete id="deleteBookById" parameterType="int">
            DELETE FROM book WHERE id=#{id}
        delete>
        <update id="updateBookById" parameterType="com.sang.model.Book">
            UPDATE book set name=#{name},author=#{author} WHERE id=#{id}
        update>
        <select id="getBookById" parameterType="int" resultType="com.sang.model.Book">
            SELECT * FROM book WHERE id=#{id}
        select>
        <select id="getAllBooks" resultType="com.sang.model.Book">
            SELECT * FROM book
        select>
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    代码解释:

    • 针对 BookMapper 接口中的每一个方法都在 BookMapper.xml 中列出了实现
    • #{} 用来代替接口中的参数,实体类中的属性可以直接通过 #{实体类属性名} 获取

    5. 创建 Service 和 BookController

    @Service
    public class BookService {
        @Autowired
        BookMapper bookMapper;
        public int addBook(Book book) {
            return bookMapper.addBook(book);
        }
        public int updateBook(Book book) {
            return bookMapper.updateBookById(book);
        }
        public int deleteBookById(Integer id) {
            return bookMapper.deleteBookById(id);
        }
        public Book getBookById(Integer id) {
            return bookMapper.getBookById(id);
        }
        public List<Book> getAllBooks() {
            return bookMapper.getAllBooks();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    @RestController
    public class BookController {
        @Autowired
        BookService bookService;
        @GetMapping("/bookOps")
        public void bookOps() {
            Book b1 = new Book();
            b1.setName("西厢记");
            b1.setAuthor("王实甫");
            int i = bookService.addBook(b1);
            System.out.println("addBook>>>" + i);
            Book b2 = new Book();
            b2.setId(1);
            b2.setName("朝花夕拾");
            b2.setAuthor("鲁迅");
            int updateBook = bookService.updateBook(b2);
            System.out.println("updateBook>>>"+ JSON.toJSONString(updateBook));
            Book b3 = bookService.getBookById(1);
            System.out.println("getBookById>>>"+JSON.toJSONString(b3));
            int delete = bookService.deleteBookById(2);
            System.out.println("deleteBookById>>>"+ JSON.toJSONString(delete));
            List<Book> allBooks = bookService.getAllBooks();
            System.out.println("getAllBooks>>>"+JSON.toJSONString(allBooks));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    6. 配置 pom.xml 文件

    在 Maven 工程中,XML 配置文件建议写在 resources 目录下,但是上文的 Mapper.xml 文件写在包下,Maven 在运行时会忽略包下的 XML 文件,因此需要在 pom.xml 文件中重新指明资源文件位置,配置如下:

    <build>
      <resources>
        <resource>
          <directory>src/main/javadirectory>
          <includes>
            <include>**/*.xmlinclude>
          includes>
        resource>
        <resource>
          <directory>src/main/resourcesdirectory>
        resource>
      resources>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在浏览器中数据 http://localhost:8081/bookOps 查看日志:

    addBook>>>1
    updateBook>>>1
    getBookById>>>{"author":"鲁迅","id":1,"name":"朝花夕拾"}
    deleteBookById>>>0
    getAllBooks>>>[{"author":"鲁迅","id":1,"name":"朝花夕拾"},{"author":"王实甫","id":3,"name":"西厢记"},{"author":"王实甫","id":4,"name":"西厢记"}]
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    dockerfile 配置 JVM配置
    【网安AIGC专题10.19】论文6:Java漏洞自动修复+数据集 VJBench+大语言模型、APR技术+代码转换方法+LLM和DL-APR模型的挑战与机会
    SpringCloud 学习笔记总结 (六)
    PG数据库内核源码分析——执行计划EXPLAIN
    C#位运算符
    离线强化学习(Offline RL)系列7: (状态处理) OfflineRL中的状态空间的数据增强(7种增强方案)
    嵌入式分享合集94
    树上差分基础
    pdf转cad怎么弄?教你这几种快速转换cad的方法
    【JavaEE进阶序列 | 从小白到工程师】JavaEE中的二维数组详细介绍与应用
  • 原文地址:https://blog.csdn.net/GXL_1012/article/details/125977898