ETJava Beta | Java    注册   登录
  • 搜索:
  • 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)

    发表于      阅读(9)     博客类别:Crawler     转自:https://www.cnblogs.com/TheMagicalRainbowSea/p/18419490
    如有侵权 请联系我们删除  (页面底部联系我们)  

    十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)

    @


    MyBatis 的官方文档:https://mybatis.p2hp.com/

    在这里插入图片描述

    关于 MyBatis 的学习的详细内容,大家可以移步至:️️️ MyBatis_ChinaRainbowSea的博客-CSDN博客

    1. Spring Boot 配置 MyBatis 的详细步骤

    1. 首先,我们创建相关测试的数据库,数据表。如下:

    在这里插入图片描述

    
    CREATE DATABASE `springboot_mybatis`
    USE `springboot_mybatis`
    
    CREATE TABLE `monster` (
    `id` int not null auto_increment,
    `age` int not null,
    `birthday` DATE DEFAULT NULL,
    `email` VARCHAR(255) DEFAULT NULL,
    `gender` CHAR(1) DEFAULT null,
    `name` VARCHAR(255) DEFAULT NULL,
    `salary` DOUBLE not NULL,
    PRIMARY KEY(`id`)
    )
    
    SELECT * from monster
    
    
    
    INSERT INTO  `monster` (`id`,`age` ,`birthday`,`email`,`gender`,`name`,`salary`) 
    VALUES (1,20,'2000-10-10','nmw@sohu.com','男','牛魔王',9000.99)
    INSERT INTO  `monster` (`id`,`age` ,`birthday`,`email`,`gender`,`name`,`salary`)
    VALUES (2,10,'2000-12-12','bgj@sohu.com','女','白骨精',9999.99)
    
    
    
    1. 导入相关的 jar 依赖。这里我们使用 Druid 数据库连接池,同时我们还需要导入 mybatis.spring.boot 的。

    在这里插入图片描述

    <!--        引入 mybatis starter-->
            <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.2.2</version>
            </dependency>
    

    引入 Druid 数据库的 jar 依赖。

    在这里插入图片描述

    <!--        引入 druid 依赖-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.17</version>
            </dependency>
    

    所有的 pom.xml 文件当中的 jar 依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.rainbowsea</groupId>
        <artifactId>springboot_mybaits</artifactId>
        <version>1.0-SNAPSHOT</version>
    
    
        <!--    导入SpringBoot 父工程-规定写法-->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.5.3</version>
        </parent>
    
        <!--    导入web项目场景启动器:会自动导入和web开发相关的jar包所有依赖【库/jar】-->
        <!--    后面还会在说明spring-boot-starter-web 到底引入哪些相关依赖-->
        <dependencies>
    <!--        引入 web starter 依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
    <!--        引入 mybatis starter-->
            <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.2.2</version>
            </dependency>
    
    <!--        引入 mysql 驱动: 这里老师使用版本仲裁 8.0.26-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
    <!--        引入配置处理器-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
            </dependency>
    
    
            <!--引入lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
    
    <!--        引入 test stater -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
    
    <!--        引入 druid 依赖-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.17</version>
            </dependency>
        </dependencies>
    
    
    </project>
    
    1. 编写对应 数据表的在Java当中对应的 Bean 对象。

    在这里插入图片描述

    特殊说明:

    这里使用 @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") 注解。来设置数据表当中的时间赋值到该 Bean 对象上的时间属性的一个时间格式。

    • pattern = "yyyy-MM-dd" 是设置时间显示的格式样式
    • timezone = "GMT+8" 是设置时区差。这里我们中国是东半球,时差为 + 8 个小时。

    需要注意的是:这个注解只对前端显示,有效果,后端,控制台显示无效。

    在这里插入图片描述

    1. 将Spring Boot 默认的 HikariCP 数据库连接池,切换为我们想要的 Druid 数据库连接池。

    这里我们通过配置类的方式,进行切换。

    在这里插入图片描述

    package com.rainbowsea.springboot.mybatis.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.sql.DataSource;
    
    @Configuration
    public class DruidDataSourceConfig {
    
    
        @ConfigurationProperties(value = "spring.datasource")  // 读取 类路径下的application.yaml
        // 的信息,并为下面的 对应的 setXX 进行赋值操作
        @Bean
        public DataSource dataSource() {
            DruidDataSource druidDataSource = new DruidDataSource();
    
            return druidDataSource;
    
        }
    
    }
    
    

    在 resource 类路径下创建一个,名为 applicaiton.yaml 文件,配置编写,相关对于,Druid 数据库连接池的信息。如下:

    在这里插入图片描述

    server:
      port: 9090  # 注意:使用空格
    
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: MySQL123
        url: jdbc:mysql://localhost:3306/springboot_mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    
    
    
    

    在这里插入图片描述

    1. 编写项目的场景启动器

    在这里插入图片描述

    package com.rainbowsea.springboot.mybatis;
    
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ConfigurableApplicationContext;
    
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext ioc = SpringApplication.run(Application.class, args);
    
        }
    
    }
    
    
    1. 运行测试,我们是否成功切换为了,我们想要的 Duird 数据连接池,因为在 Spring Boot 当中测试的话,必须要编写好对应的项目启动器,不然,是无法测试的,会报错。

    在这里插入图片描述

    在这里插入图片描述

    package com.rainbowsea.springboot.mybatis;
    
    
    import com.rainbowsea.springboot.mybatis.bean.Monster;
    import com.rainbowsea.springboot.mybatis.mapper.MonsterMapper;
    import com.rainbowsea.springboot.mybatis.service.MonsterService;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    import javax.annotation.Resource;
    
    @SpringBootTest(classes = Application.class)  // 与 main 不同的需要指明 测试的是哪个Class类
    public class ApplicationTest {
    
    
        @Resource
        private JdbcTemplate jdbcTemplate;
    
    
    
    
        @Test
        public void t1() {
            // 输出看看当前的数据源是什么
            System.out.println(jdbcTemplate.getDataSource().getClass());
    
        }
    
    
    
    }
    
    
    1. 创建一个mapper/dao 的包,在该包下创建一个名为 MonsterMapper 的接口,通过代理类的方式,在该接口下,编写我们要执行业务的 SQL 语句的方法。

    在这里插入图片描述

    package com.rainbowsea.springboot.mybatis.mapper;
    
    import com.rainbowsea.springboot.mybatis.bean.Monster;
    import org.apache.ibatis.annotations.Mapper;
    
    
    /**
     * 在Mapper接口使用 @Mapper 就会扫描,并将Mapper接口对象注入
     */
    @Mapper // 包扫描,加上了这个注解的话,那么
    public interface MonsterMapper {
    
    
        // 方法 根据id 返回 Monster 对象
        public Monster getMonsterById(Integer id);
    
    }
    
    

    特别说明:

    这里我们在该 接口类当中,使用了 @Mapper 注解。该注解的作用就是,让Spring Boot 加载的时候,会扫描这个类。从而找到这个类。这样我们就不需要额外的配置,包扫描了

    1. 在相应的对应的包,下创建对应的包,创建对应 SQl 语句的xml 文件。如下

    在这里插入图片描述

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.rainbowsea.springboot.mybatis.mapper.MonsterMapper">
    <!--
        1. 扫描所有的dao接口的实现,加入到ioc容器中
        2. 这里dao接口,就是mapper接口
    -->
    
    
        <!--    配置 getMonsterById-->
        <select id="getMonsterById" resultType="com.rainbowsea.springboot.mybatis.bean.Monster">
             select * from monster where id = #{id}
        </select>
    <!--  elect * from `monster` where id = #{id} 注意: 不是单引号处理 -->
    </mapper>
    

    同时需要在,application.yaml 文件当中配置,Mybatis 的包扫描路径:如下;

    在这里插入图片描述

    mybatis:
      # 指定要扫描的 Xxxmapper.xml
      mapper-locations: classpath:mapper/*.xml
    
    server:
      port: 9090  # 注意:使用空格
    
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: MySQL123
        url: jdbc:mysql://localhost:3306/springboot_mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    
    mybatis:
      # 指定要扫描的 Xxxmapper.xml
      mapper-locations: classpath:mapper/*.xml
    
    
      # 通过config-location 可以指定mybatis-config.xml 可以以传统的方式来配置mybatis
    #  config-location:
    # 我们可以直接在 application.yaml 进行配置
    # 举例说明1,比如配置原来的 typeAliases
      # 还有很多配置,等我们用到再说
    #  type-aliases-package: com.rainbowsea.springboot.mybatis.bean
    #  configuration:
    #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    #    map-underscore-to-camel-case: true
    
    # 老师说明: 配置mybatis的两种方式的选择: 如果配置比较简单,就直接在application.yaml配置
    # 如配置内部比较多,可以考虑单独的做一个mybatis-config.xml
    

    运行测试:

    在这里插入图片描述

    package com.rainbowsea.springboot.mybatis;
    
    
    import com.rainbowsea.springboot.mybatis.bean.Monster;
    import com.rainbowsea.springboot.mybatis.mapper.MonsterMapper;
    import com.rainbowsea.springboot.mybatis.service.MonsterService;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    import javax.annotation.Resource;
    
    @SpringBootTest(classes = Application.class)  // 与 main 不同的需要指明 测试的是哪个Class类
    public class ApplicationTest {
    
    
    
    
        @Resource
        private MonsterMapper monsterMapper;
    
    
    
    
    
        @Test
        public void getMonsterById() {
            Monster monsterById = monsterMapper.getMonsterById(1);
            System.out.println(monsterById);
    
        }
    
    
    
    
    
    }
    
    

    在这里插入图片描述

    1. 编写对应的 Severl 业务处理

    首先,编写其接口:
    在这里插入图片描述

    package com.rainbowsea.springboot.mybatis.service;
    
    import com.rainbowsea.springboot.mybatis.bean.Monster;
    
    public interface MonsterService {
    
        // 根据id 返回 Monster 对象
        public Monster getMonsterById(Integer id);
    }
    
    

    在编写其接口的实现类,

    在这里插入图片描述

    package com.rainbowsea.springboot.mybatis.service.impl;
    
    
    import com.rainbowsea.springboot.mybatis.bean.Monster;
    import com.rainbowsea.springboot.mybatis.mapper.MonsterMapper;
    import com.rainbowsea.springboot.mybatis.service.MonsterService;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    
    
    @Service
    public class MonsterServiceImpl implements MonsterService {
    
    
        // 装配MonsterMapper
    
        @Resource
        private MonsterMapper monsterMapper;
    
    
        @Override
        public Monster getMonsterById(Integer id) {
    
    
            return monsterMapper.getMonsterById(id);
        }
    }
    
    

    运行测试:

    在这里插入图片描述

    package com.rainbowsea.springboot.mybatis;
    
    
    import com.rainbowsea.springboot.mybatis.bean.Monster;
    import com.rainbowsea.springboot.mybatis.mapper.MonsterMapper;
    import com.rainbowsea.springboot.mybatis.service.MonsterService;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    import javax.annotation.Resource;
    
    @SpringBootTest(classes = Application.class)  // 与 main 不同的需要指明 测试的是哪个Class类
    public class ApplicationTest {
    
    
        // 装配到MonsterService
        @Resource
        private MonsterService monsterService;
    
    
    
    
        // 测试 MonsterService
        @Test
        public void getMonsterById2() {
    
            Monster monster = monsterService.getMonsterById(2);
            System.out.println(monster);
    
        }
    
    
    
    }
    
    

    在这里插入图片描述

    1. 编写对应的 Controller 控制器,在前端处理显示。

    在这里插入图片描述

    package com.rainbowsea.springboot.mybatis.controller;
    
    
    import com.rainbowsea.springboot.mybatis.bean.Monster;
    import com.rainbowsea.springboot.mybatis.service.MonsterService;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import javax.annotation.Resource;
    
    @Controller
    public class MonsterController {
    
        // 装配MonsterService
        @Resource
        private MonsterService monsterService;
    
    
        @ResponseBody
        @GetMapping("/monster")
        public Monster getMonsterById( @RequestParam(value = "id") Integer id) {
            return monsterService.getMonsterById(id);
        }
    }
    
    

    运行测试:注意:我们这里配置的端口是9090,并不是8080。

    在这里插入图片描述

    2. 最后:

    “在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

    在这里插入图片描述