MyBatis 是一款优秀的持久层框架,它支持自定义 SQL,存储过程以及高级映射。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects)为数据库中的记录。
本文讲述如何在 Spring Boot 框架中基于 XML 方式使用 Mybatis。
创建 MySQL 数据表 本文采用 MySQL 数据库作为数据源,创建用户表 user
:
1 2 3 4 5 6 7 8 9 CREATE TABLE `user `( `id` int (32 ) NOT NULL AUTO_INCREMENT, `name` varchar (32 ) NOT NULL , `passwd` varchar (50 ) NOT NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
插入一行数据:
1 2 insert into user (name, passwd) values ('leo' , '123' );commit ;
创建 Spring Boot 项目 本文采用 IntelliJ Idea 的 Spring Initializr 向导来创建 Spring Boot 项目,过程比较简单,此处不再赘述。
创建后的 pom.xml
文件如下:
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion > 4.0.0</modelVersion > <parent > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-parent</artifactId > <version > 2.4.1</version > <relativePath /> </parent > <groupId > me.leehao</groupId > <artifactId > mybatisdemo</artifactId > <version > 0.0.1-SNAPSHOT</version > <name > mybatisdemo</name > <description > Demo project for Mybatis</description > <properties > <java.version > 1.8</java.version > </properties > <dependencies > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-jdbc</artifactId > </dependency > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-web</artifactId > </dependency > <dependency > <groupId > org.mybatis.spring.boot</groupId > <artifactId > mybatis-spring-boot-starter</artifactId > <version > 2.1.4</version > </dependency > <dependency > <groupId > mysql</groupId > <artifactId > mysql-connector-java</artifactId > <scope > runtime</scope > </dependency > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-test</artifactId > <scope > test</scope > </dependency > </dependencies > <build > <plugins > <plugin > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-maven-plugin</artifactId > </plugin > </plugins > </build > </project >
上面的依赖包括 MyBatis 和 MySQL 驱动的依赖。
另外,由于本文采用调用 Web 接口方式验证 MyBatis 功能,故引入了 spring-boot-starter-web
依赖。
数据源配置 MySQL 数据源配置 application.yml
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 server: port: 6080 spring: datasource: username: root password: 12345678 url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapping/*Mapper.xml type-aliases-package: me.leehao.mybatisdemo.entity logging: level: me: leehao: mybatisdemo: mapper : debug
上面采用了名称为 mybatis
的 schema,且定义了 MyBatis 的 XML 映射文件位置为 mapping
目录下的 *Mapper.xml
文件。
为方便调试,我们将执行的 SQL 通过日志打印出来。
定义 entity 定义数据库实体类 User
:
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 38 39 40 package me.leehao.mybatisdemo.entity;public class User { private Integer id; private String name; private String passwd; 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 getPasswd () { return passwd; } public void setPasswd (String passwd) { this .passwd = passwd; } @Override public String toString () { return "User{" + "id=" + id + ", name='" + name + '\'' + ", passwd='" + passwd + '\'' + '}' ; } }
定义 mapper 接口 创建好对应的实体类后,我们还需要为其创建对应的 mapper 接口和对应的 mapper XML 文件,需要注意的是这两类文件都需要放置到指定的路径下。其中的 mapper XML 文件位置路径已在上文的 application.yml
配置中进行了配置,mapper 接口会在下文的 Spring Boot 启动主类中进行配置。
1 2 3 4 5 6 7 8 9 package me.leehao.mybatisdemo.mapper;import me.leehao.mybatisdemo.entity.User;import org.springframework.stereotype.Repository;@Repository public interface UserMapper { User QueryById (int id) ; }
在 UserMapper
中定义了 QueryById
方法,具体的实现由下面的 mapper XML 进行实现。
UserMapper
接口添加 @Repository
注解是目的是为了避免在 UserService
中使用 UserMapper
出现 Could not autowire
的提示(虽然实际上不影响使用)。
定义 mapper XML 创建一个与 UserMapper.java
对应的 UserMapper.xml
文件,里面定义了 QueryById
使用的 SQL,且定义 resultType
返回类型为 User
实体类:
1 2 3 4 5 6 7 <?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 ="me.leehao.mybatisdemo.mapper.UserMapper" > <select id ="QueryById" resultType ="me.leehao.mybatisdemo.entity.User" > select * from user where id = #{id} </select > </mapper >
定义 service 定义 UserService
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package me.leehao.mybatisdemo.service;import me.leehao.mybatisdemo.entity.User;import me.leehao.mybatisdemo.mapper.UserMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Service public class UserService { @Autowired UserMapper userMapper; public User QueryById (int id) { return userMapper.QueryById(id); } }
UserService
里面调用了 UserMapper
的 QueryById
接口。
定义 controller 定义 UserController
接口:
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 package me.leehao.mybatisdemo.controller;import me.leehao.mybatisdemo.entity.User;import me.leehao.mybatisdemo.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController public class UserController { @Autowired private UserService userService; @RequestMapping("user/{id}") public String GetUser (@PathVariable int id) { User user = userService.QueryById(id); if (user != null ) { return user.toString(); } else { return String.format("User(id: %s) not found" , id); } } }
在 UserController
中,定义了接口 user/{id}
,根据用户 id 在数据库中查询用户信息。
定义启动类 为在指定 mapper 接口的扫描路径,在 Spring Boot 启动主类中增加 @MapperScan("me.leehao.mybatisdemo.mapper")
的注解。
1 2 3 4 5 6 7 8 9 10 11 12 13 package me.leehao.mybatisdemo;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication @MapperScan("me.leehao.mybatisdemo.mapper") public class MybatisdemoApplication { public static void main (String[] args) { SpringApplication.run(MybatisdemoApplication.class, args); } }
运行 启动 Spring Boot 后,访问地址 http://localhost:6080/user/1
,输出:
User{id=1, name=’leo’, passwd=’123’}
附:源代码 https://github.com/haozlee/learnmybatis
参考资料