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

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)

2、导入相关的 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>

3、编写对应 数据表的在Java当中对应的 Bean 对象。

特殊说明:

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

  • pattern = "yyyy-MM-dd" 是设置时间显示的格式样式

  • timezone = "GMT+8" 是设置时区差。这里我们中国是东半球,时差为 + 8 个小时。

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

4、将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

5、编写项目的场景启动器

复制代码
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);

    }

}

6、运行测试,我们是否成功切换为了,我们想要的 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());

    }



}

7、创建一个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 加载的时候,会扫描这个类。从而找到这个类。这样我们就不需要额外的配置,包扫描了

8、在相应的对应的包,下创建对应的包,创建对应 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);

    }





}

9、编写对应的 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);

    }



}

10、编写对应的 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。

文章转载自: ++Rainbow-Sea++

原文链接: 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式) - Rainbow-Sea - 博客园

体验地址: 引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

相关推荐
天若有情6738 分钟前
SpringBoot4 + MyBatis 前后端分离实战|从零实现坏习惯管理系统,支持局域网手机访问CRUD
智能手机·mybatis
止语Lab2 小时前
好的 DX 不等于少写代码——三种语言的摩擦力设计课
后端
吃饱了得干活2 小时前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain
程序员天天困2 小时前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
Huiturn2 小时前
GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
后端
dkbnull2 小时前
Spring Boot请求处理组件对比详解
java·spring boot
用户298698530142 小时前
Python 实现 Excel 与 Markdown 互转的实用指南
后端·python·excel
不能只会打代码2 小时前
Day 011 — Spring 全家桶深度拆解
spring boot·mybatis·spring aop·spring mvc·spring ioc
用户77283104908402 小时前
krono-job:零侵入、单二进制交付的分布式任务调度平台(开源)
后端
Conan在掘金2 小时前
鸿蒙报错速查:Function lacks ending return statement,返回路径漏 return 就炸,根因 + 真解法
后端