目录
一、前言
Spring Boot作为当下流行的Java开发框架,以其简化配置、快速构建的特点深受开发者青睐。MyBatis作为持久层框架,灵活性强且与SQL语句解耦,搭配MySQL数据库能够高效处理数据操作。本教程旨在提供一套完整的整合方案,帮助开发者快速搭建基于Spring Boot、MyBatis和MySQL的项目环境。
二、创建+整合项目
1.创建SpringBoot项目
1.打开idea,新建springboot项目,配置相关信息(名称、位置、语言、JDK、java版本等)
2.选择合适的依赖(这里搜不到的后续可手动添加到pom文件)
3.创建好之后,项目的层级是下面这样的
4.更改maven仓库指向自己的maven仓库(如果要使用远程仓库自行在pom文件里配置)
5.重新加载maven(建议重载一下)
6.以下是全部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>
<groupId>org.wal</groupId>
<artifactId>UserDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>UserDemo</name>
<description>UserDemo</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.13</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</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>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>org.wal.userdemo.UserDemoApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
7.接下来是创建对应的包和整体的分层架构(推荐),不建议在Service或者Controller直接调用Mapper层接口。
8.说一下SpringBoot项目具体的一个流程:从Controller => Service => ServiceImpl =>Mapper => Mapper.xml 以下是具体的代码:
Controller.java
package org.wal.userdemo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.wal.userdemo.entity.UserEntity;
import org.wal.userdemo.service.UserService;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 获取用户信息
* @param id
* @return
*/
@GetMapping("/getUserById")
public UserEntity getUserById(@RequestParam("id") Integer id) {
return userService.getUserById(id);
}
/**
* 获取所有用户信息
* @return List<UserEntity>
*/
@GetMapping("/getAllUsers")
public List<UserEntity> getAllUsers() {
return userService.getAllUsers();
}
/**
* 获取用户数量
* @return Integer
*/
@GetMapping("/getUserCount")
public Integer getUserCount() {
return userService.getUserCount();
}
/**
* 获取用户分页信息
* @param pageNum
* @param pageSize
* @return List<UserEntity>
*/
@GetMapping("/getUsersByPage")
public List<UserEntity> getUsersByPage(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize) {
return userService.getUsersByPage(pageNum, pageSize);
}
/**
* 获取用户名称模糊查询信息
* @param name
* @return List<UserEntity>
*/
@GetMapping("/getUsersByName")
public List<UserEntity> getUsersByName(@RequestParam("name") String name) {
return userService.getUsersByName(name);
}
/**
* 添加用户信息
* @param userEntity
* @return Integer
*/
@PostMapping("/addUser")
public Integer addUser(@RequestBody UserEntity userEntity) {
return userService.addUser(userEntity);
}
/**
* 修改用户信息
* @param userEntity
* @return Integer
*/
@PostMapping("/updateUser")
public Integer updateUser(@RequestBody UserEntity userEntity) {
return userService.updateUser(userEntity);
}
/**
* 删除用户信息
* @param id
* @return Integer
*/
@GetMapping("/deleteUser")
public Integer deleteUser(@RequestParam("id") Integer id) {
return userService.deleteUser(id);
}
}
Service.java
package org.wal.userdemo.service;
import org.wal.userdemo.entity.UserEntity;
import java.util.List;
public interface UserService {
/**
* 根据id查询用户
*
* @param id
* @return
*/
UserEntity getUserById(Integer id);
/**
* 查询所有用户
*
* @return
*/
List<UserEntity> getAllUsers();
/**
* 查询用户数量
*
* @return
*/
Integer getUserCount();
/**
* 分页查询用户
*
* @param pageNum
* @param pageSize
* @return
*/
List<UserEntity> getUsersByPage(Integer pageNum, Integer pageSize);
/**
* 根据名称查询用户
*
* @param name
* @return
*/
List<UserEntity> getUsersByName(String name);
/**
* 添加用户
*
* @param userEntity
* @return
*/
Integer addUser(UserEntity userEntity);
/**
* 修改用户
*
* @param userEntity
* @return
*/
Integer updateUser(UserEntity userEntity);
/**
* 删除用户
*
* @param id
* @return
*/
Integer deleteUser(Integer id);
}
ServiceImpl.java
package org.wal.userdemo.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.wal.userdemo.entity.UserEntity;
import org.wal.userdemo.mapper.UserMapper;
import org.wal.userdemo.service.UserService;
import java.util.Collections;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
/**
* 获取用户信息
*
* @param id
* @return UserEntity
*/
@Override
public UserEntity getUserById(Integer id) {
return userMapper.getUserById(id);
}
/**
* 获取所有用户信息
*
* @return List<UserEntity>
*/
@Override
public List<UserEntity> getAllUsers() {
return userMapper.getAllUsers() ;
}
/**
* 获取用户数量
*
* @return Integer
*/
@Override
public Integer getUserCount() {
return userMapper.getUserCount();
}
/**
* 分页获取用户信息
*
* @param pageNum
* @param pageSize
* @return List<UserEntity>
*/
@Override
public List<UserEntity> getUsersByPage(Integer pageNum, Integer pageSize) {
return userMapper.getUsersByPage(pageNum, pageSize);
}
/**
* 根据用户名获取用户信息
*
* @param name
* @return List<UserEntity>
*/
@Override
public List<UserEntity> getUsersByName(String name) {
return userMapper.getUsersByName( name);
}
/**
* 添加用户
*
* @param userEntity
* @return Integer
*/
@Override
public Integer addUser(UserEntity userEntity) {
return userMapper.addUser(userEntity);
}
/**
* 修改用户信息
*
* @param userEntity
* @return Integer
*/
@Override
public Integer updateUser(UserEntity userEntity) {
return userMapper.updateUser(userEntity);
}
/**
* 删除用户
*
* @param id
* @return Integer
*/
@Override
public Integer deleteUser(Integer id) {
return userMapper.deleteUser( id);
}
}
entity.java(这里我用的lombok依赖的@Data注解,可以省略getter和setter方法)
package org.wal.userdemo.entity;
import lombok.Data;
@Data
public class UserEntity {
/**
* id 主键
*/
private Integer id;
/**
* name 姓名
*/
private String name;
/**
* age 年龄
*/
private Integer age;
}
9.接下来整理SpringBoot的配置信息(application.properties或者application.yml(推荐)),两者无区别只是展现形式不同,后者维护更容易。
10.接下来就是找到UserDemoApplication运行项目
可以看到项目已经在8080端口正常运行了。
2.整合MyBatis
1.首先在application.yml中添加MyBatis的配置信息,如下;
2.接着在java/*/mapper下创建mapper.java
package org.wal.userdemo.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.wal.userdemo.entity.UserEntity;
import java.util.List;
@Mapper
public interface UserMapper {
/**
* 根据id查询用户
*
* @param id
* @return
*/
UserEntity getUserById(Integer id);
/**
* 查询所有用户
*
* @return
*/
List<UserEntity> getAllUsers();
/**
* 查询用户数量
*
* @return
*/
Integer getUserCount();
/**
* 分页查询用户
*
* @param pageNum
* @param pageSize
* @return
*/
List<UserEntity> getUsersByPage(Integer pageNum, Integer pageSize);
/**
* 根据名称查询用户
*
* @param name
* @return
*/
List<UserEntity> getUsersByName(String name);
/**
* 添加用户
*
* @param userEntity
* @return
*/
Integer addUser(UserEntity userEntity);
/**
* 修改用户
*
* @param userEntity
* @return
*/
Integer updateUser(UserEntity userEntity);
/**
* 删除用户
*
* @param id
* @return
*/
Integer deleteUser(Integer id);
}
3.在resource下创建文件夹mapper,在mapper下创建mapper.xml,与mapper.java里的接口一一对应。
<?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="org.wal.userdemo.mapper.UserMapper">
<resultMap id="BaseResultMap" type="org.wal.userdemo.entity.UserEntity">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="age" property="age" />
</resultMap>
<select id="getUserById" resultMap="BaseResultMap" parameterType="Integer">
select * from user where id = #{id};
</select>
<select id="getAllUsers" resultMap="BaseResultMap" >
select * from user;
</select>
<select id="getUserCount" resultMap="BaseResultMap">
select count(*) from user;
</select>
<select id="getUsersByPage" resultMap="BaseResultMap" parameterType="String">
select *
from user limit #{pageNum}, #{pageSize};
</select>
<select id="getUsersByName" resultMap="BaseResultMap" parameterType="String">
select * from user where name like concat('%',#{name},'%');
</select>
<insert id="addUser" useGeneratedKeys="true" keyProperty="id" parameterType="org.wal.userdemo.entity.UserEntity">
insert into user (name, age) values (#{name}, #{age});
</insert>
<update id="updateUser" parameterType="org.wal.userdemo.entity.UserEntity">
update user set name = #{name}, age = #{age} where id = #{id};
</update>
<delete id="deleteUser" parameterType="Integer">
delete from user where id = #{id};
</delete>
</mapper>
如此MyBatis就整合完成了。
3.整合MySQL
1.首先在application.yml中配置数据源信息,如下:
2.创建entity.java所需的表(需要可以直接用)
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
`age` int DEFAULT NULL COMMENT '年龄',
KEY `zhujian` (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='测试';
INSERT INTO `user` (`id`,`name`,`age`) VALUES('1','张','19');
INSERT INTO `user` (`id`,`name`,`age`) VALUES('2','李','27');
INSERT INTO `user` (`id`,`name`,`age`) VALUES('3','赵','99');
INSERT INTO `user` (`id`,`name`,`age`) VALUES('4','王','17');
如此 MySQL也整合完成了。
三、测试
1.整合完成后再重启一下项目
2.使用postman模拟请求,可以看到能查询到数据库的数据,如下:
其他接口不再测试。
四、附:源码
1.源码下载地址
https://gitee.com/wangaolin/user-demo
同学们可以自行下载查看使用。
2.application.yml的完整代码
server:
# 端口
port: 8080
spring:
datasource:
# 数据库连接地址
url: jdbc:mysql://127.0.0.1:3306/wal?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
# mybatis 配置
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.wal.userdemo.entity
# 日志
logging:
level:
com.example.demo.mapper: debug
五、结语
本文详细介绍了Spring Boot整合MyBatis和MySQL的步骤,包括项目创建、配置、编写实体类、Mapper、Service和Controller,并进行了简单的测试。通过这个整合,我们可以方便地使用MyBatis进行数据库操作。
注意:在实际开发中,我们可能还需要进行异常处理、事务管理、统一返回、日志处理等操作,这些可以在后续的文章中展开。
希望这篇博客对你有所帮助!