MyBatis学习11-SpringBoot集成MyBatis
1 创建 SpringBoot 项目
- 新建项目或新建模块,在左侧选择 Spring Initializr,右侧选择 JDK 的版本,并选中’Default:https//stat.spring.io’,点击Next。如下图:
如果点击 Next 后一直在显示加载中的页面无其它反应,尝试切换网络后重新点击 Next。
-
填写项目模块信息(主要填写 Group/Artifact),如下图所示:
-
选择 Spring Boot 的版本(这里选择了2.3.1版本,因为2.4.0+版本不能选择 MyBatis 集成),并选择依赖的工具或插件。如下图所示:
-
选择文件存放磁盘位置,点击 Finish 。如下图所示:
2 项目结构
项目代码可从项目地址 中进行下载。
-
项目结构
-
pom.xml 文件内容
<?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.3.1.RELEASE</version>
</parent>
<groupId>com.ddpyjqtd</groupId>
<artifactId>springboot-mybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-mybatis</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 启动类
启动类中增加扫描路径(@MapperScan),代码如下:
package com.ddpyjqtd.mybatis;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* SpringBoot 项目启动类
*
* @author lif
* @date 2020/7/8 20:23
*/
@SpringBootApplication
@MapperScan("com.ddpyjqtd")
public class SpringbootMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisApplication.class, args);
}
}
- 创建实体类对象 Dept.java,内容如下:
package com.ddpyjqtd.mybatis.domain;
import java.io.Serializable;
import lombok.Data;
/**
* 部门表
*
* @author lif
* @date 2020/7/8 19:23
*/
@Data
public class Dept implements Serializable {
/**
* 部门表主键
*/
private Integer deptId;
/**
* 部门名称
*/
private String deptName;
private static final long serialVersionUID = 1L;
}
- 创建 MyBatis 实体类对应的 XML 映射器:DeptMapper.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.ddpyjqtd.mybatis.mapper.DeptMapper">
<resultMap id="BaseResultMap" type="com.ddpyjqtd.mybatis.domain.Dept">
<id column="dept_id" jdbcType="INTEGER" property="deptId"/>
<result column="dept_name" jdbcType="VARCHAR" property="deptName"/>
</resultMap>
<sql id="Base_Column_List">
dept_id,
dept_name
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from dept
where dept_id = #{deptId,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete
from dept
where dept_id = #{deptId,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.ddpyjqtd.mybatis.domain.Dept">
insert into dept (dept_id, dept_name)
values (#{deptId,jdbcType=INTEGER}, #{deptName,jdbcType=VARCHAR})
</insert>
<update id="updateByPrimaryKey" parameterType="com.ddpyjqtd.mybatis.domain.Dept">
update dept
set dept_name = #{deptName,jdbcType=VARCHAR}
where dept_id = #{deptId,jdbcType=INTEGER}
</update>
</mapper>
- 创建 MyBatis 接口类 DeptMapper.java,内容如下:
package com.ddpyjqtd.mybatis.mapper;
import com.ddpyjqtd.mybatis.domain.Dept;
/**
* 部门表Mapper
*
* @author lif
* @date 2020/7/8 19:23
*/
public interface DeptMapper {
/**
* delete by primary key
*
* @param deptId primaryKey
* @return deleteCount
*/
int deleteByPrimaryKey(Integer deptId);
/**
* insert record to table
*
* @param record the record
* @return insert count
*/
int insert(Dept record);
/**
* select by primary key
*
* @param deptId primary key
* @return object by primary key
*/
Dept selectByPrimaryKey(Integer deptId);
/**
* update record
*
* @param record the updated record
* @return update count
*/
int updateByPrimaryKey(Dept record);
}
- 创建 Service 类 DeptService.java,内容如下:
package com.ddpyjqtd.mybatis.service;
import org.springframework.stereotype.Service;
import com.ddpyjqtd.mybatis.mapper.DeptMapper;
import com.ddpyjqtd.mybatis.domain.Dept;
import javax.annotation.Resource;
/**
* 部门 Service
*
* @author lif
* @date 2020/7/8 19:23
*/
@Service
public class DeptService {
@Resource
private DeptMapper deptMapper;
/**
* 删除部门表信息
*
* @param deptId 主键ID
* @return int
* @author lif
* @date 2020/7/8 19:26
*/
public int deleteByPrimaryKey(Integer deptId) {
return deptMapper.deleteByPrimaryKey(deptId);
}
/**
* 新增部门表信息
*
* @param dept 部门对象
* @return int
* @author lif
* @date 2020/7/8 19:26
*/
public int insert(Dept dept) {
return deptMapper.insert(dept);
}
/**
* 通过主键查询部门表信息
*
* @param deptId 部门表主键
* @return com.ddpyjqtd.mybatis.domain.Dept
* @author lif
* @date 2020/7/8 19:26
*/
public Dept selectByPrimaryKey(Integer deptId) {
return deptMapper.selectByPrimaryKey(deptId);
}
/**
* 通过主键修改部门表信息
*
* @param dept 部门表对象
* @return int
* @author lif
* @date 2020/7/8 19:27
*/
public int updateByPrimaryKey(Dept dept) {
return deptMapper.updateByPrimaryKey(dept);
}
}
- SpringBoot 配置文件中增加数据库与 MyBatis 配置,内容如下:
# 开发配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# MyBatis 配置
mybatis:
typeAliasesPackage: com.ddpyjqtd.mybatis.domain
mapperLocations: classpath:mapper/*Mapper.xml
- 新建 DeptService 类对应的测试类,内容如下:
package com.ddpyjqtd.mybatis.service;
import com.ddpyjqtd.mybatis.SpringbootMybatisApplication;
import com.ddpyjqtd.mybatis.domain.Dept;
import com.ddpyjqtd.mybatis.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* 部门 Service 测试类
*
* @author lif
* @date 2020/7/8 19:53
*/
@SpringBootTest(classes = {SpringbootMybatisApplication.class})
@RunWith(SpringJUnit4ClassRunner.class)
@Slf4j
class DeptServiceTest {
@Autowired
private DeptService deptService;
@Test
void selectByPrimaryKey() {
Dept dept = deptService.selectByPrimaryKey(1);
log.info("dept info is : {} ", dept.toString());
Assert.assertNotNull(dept);
}
}
- 执行 SQL 脚本,内容如下:
-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`dept_id` int(11) NOT NULL COMMENT '部门表主键',
`dept_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '部门名称',
PRIMARY KEY (`dept_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '部门表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES (1, '部门一');
INSERT INTO `dept` VALUES (2, '部门二');
-- ----------------------------
-- Table structure for emp
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`emp_id` int(11) NOT NULL COMMENT '员工表主键',
`emp_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '同工编号',
`emp_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '员工名称',
`hire_date` datetime(0) NULL DEFAULT NULL COMMENT '受雇日期',
`dept_id` int(11) NULL DEFAULT NULL COMMENT '所在部门',
PRIMARY KEY (`emp_id`) USING BTREE,
INDEX `IDX_EMP_EMPNO`(`emp_no`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '员工表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES (1, 'a_001', '员工一', '2020-06-30 20:20:57', 1);
INSERT INTO `emp` VALUES (2, 'a_002', '员工二', '2019-10-09 20:21:12', 1);
INSERT INTO `emp` VALUES (3, 'b_001', '员工三', '2020-06-02 20:21:35', 2);
- 运行测试类,运行结果如下:
2020-07-08 23:10:04.750 INFO 20712 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-07-08 23:10:04.917 INFO 20712 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2020-07-08 23:10:04.967 INFO 20712 --- [ main] c.d.mybatis.service.DeptServiceTest : dept info is : Dept(deptId=1, deptName=部门一)
3 关键点
- 引入 jar 包
- 配置数据库与 MyBatis 配置
- 启动类中增加 MyBatis 扫描地址