Spring boot mybatis 简单示例

我在Spring boot中集成mybatis竟然花了不少时间,真没想到。对着官网的文档做,竟然还花了这么多时间。所以我把过程尽可能的详细记录下来,给有需要的朋友。

需求

在spring boot 中使用mybatis。

官方文档

使用开源组件,最棒的文档就是官方文档了。然而我在看文档时发现了一些小坑,我看文档的顺序如下:

  • 《mybatis》
    什么是 MyBatis?
    MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
    https://mybatis.org/mybatis-3/zh/index.html
    这个是讲mybatis的通用方法,不是针对spring的。我把这些文档看完,还是没有完美解决 spring boot中完美的集成mybatis。经过摸索才发现mybatis有个子项目《mybatis-spring》。

  • 《mybatis-spring》
    什么是 MyBatis-Spring?
    MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。
    https://mybatis.org/mybatis-3/zh/configuration.html

经过摸索和踩坑,我又发现这个项目还有一个子项目《mybatis-spring-boot-autoconfigure》。

  • 《mybatis-spring-boot-autoconfigure》
    MyBatis-Spring-Boot-Starter 帮助您在Spring Boot之上快速构建 MyBatis 应用程序。
    https://mybatis.org/spring/zh/boot.html

事实上对我的需要最有用的就是最后一个文档:
https://mybatis.org/spring/zh/boot.html
看前面两个文档属实让人浪费了不少时间了。

实践记录

建议大家自行查看官方的文档来练习,如果遇到坑在对照这篇文章看看。
https://mybatis.org/spring/zh/boot.html
以下内容源于官网文档的练习。

源码下载

我把我测试的代码,打包分享给大家。

https://download.csdn.net/download/lxyoucan/86341756

建表

在这里以mysql为例操作。

-- auto-generated definition
create table CITY
(
    city_id   bigint auto_increment comment '城市ID'
        primary key,
    city_name varchar(50)              not null comment '城市名称',
    state    varchar(10) default 'CA' null comment '省'
)
    comment '城市';

insert into CITY (city_name, state) values ('北京','beijing');
insert into CITY (city_name, state) values ('南京','jiangsu');
insert into CITY (city_name, state) values ('上海','shanghai');

select * from CITY where state='beijing';

pom.xml

MyBatis-Spring-Boot/pom.xml


<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.7.2version>
        <relativePath/> 
    parent>
    <groupId>cn.ycmitgroupId>
    <artifactId>MyBatis-Spring-BootartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>MyBatis-Spring-Bootname>
    <description>Demo project for Spring Bootdescription>
    <properties>
        <java.version>1.8java.version>
    properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>

        
        <dependency>
            <groupId>org.mybatis.spring.bootgroupId>
            <artifactId>mybatis-spring-boot-starterartifactId>
            <version>2.2.2version>
        dependency>

        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
        dependency>

    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>

project>

实体类

MyBatis-Spring-Boot/src/main/java/cn/ycmit/mybatis/domain/City.java

package cn.ycmit.mybatis.domain;

public class City {
    private static final long serialVersionUID = 1L;

    private Long city_id;
    private String city_name;
    private String state;

    public City() {
    }

    public Long getCity_id() {
        return city_id;
    }

    public void setCity_id(Long city_id) {
        this.city_id = city_id;
    }

    public String getCity_name() {
        return city_name;
    }

    public void setCity_name(String city_name) {
        this.city_name = city_name;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    @Override
    public String toString() {
        return "City{" +
                "city_id=" + city_id +
                ", city_name='" + city_name + '\'' +
                ", state='" + state + '\'' +
                '}';
    }
}

mapper

MyBatis-Spring-Boot/src/main/java/cn/ycmit/mybatis/mapper/CityMapper.java

package cn.ycmit.mybatis.mapper;

import cn.ycmit.mybatis.domain.City;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface CityMapper {

    @Select("SELECT * FROM CITY WHERE state = #{state}")
    City findByState(@Param("state") String state);

}

启动类

MyBatis-Spring-Boot/src/main/java/cn/ycmit/mybatis/MyBatisSpringBootApplication.java
主要简化代码,便于理解,实际项目中一般不会这么写。这样写省的写测试类了。

package cn.ycmit.mybatis;

import cn.ycmit.mybatis.mapper.CityMapper;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyBatisSpringBootApplication implements CommandLineRunner {

    private final CityMapper cityMapper;

    public MyBatisSpringBootApplication(CityMapper cityMapper) {
        this.cityMapper = cityMapper;
    }

    public static void main(String[] args) {
        SpringApplication.run(MyBatisSpringBootApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println(this.cityMapper.findByState("beijing"));
    }

}

application.yml

MyBatis-Spring-Boot/src/main/resources/application.yml
主要是数据源相关的配置。

spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://128.0.0.1:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
    username: root
    password: itkey123457

controller注入演示

MyBatis-Spring-Boot/src/main/java/cn/ycmit/mybatis/controller/SqlApiController.java

package cn.ycmit.mybatis.controller;
import cn.ycmit.mybatis.domain.City;
import cn.ycmit.mybatis.mapper.CityMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SqlApiController {
    @Autowired
    CityMapper mapper;
    /**
     * 查询测试
     * @return
     */
    @RequestMapping("/city")
    public City city()
    {
        City city =mapper.findByState("beijing");
        return city;
    }
}

这样访问 http://localhost:8080/city
就会得到如下结果:

{"city_id":1,"city_name":"北京","state":"beijing"}

你可能感兴趣的:(java,mybatis,spring,boot,java)