当前位置: 首页 > news >正文

【数据库系列】Spring Boot 中使用 MyBatis 详细指南

在这里插入图片描述

一、基础介绍

1.1 MyBatis

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO(Plain Old Java Objects)映射成数据库中的记录。

1.2 Spring Boot 集成 MyBatis 的优势

将 Spring Boot 和 MyBatis 集成,能够充分发挥 Spring Boot 的快速开发特性和 MyBatis 灵活的数据库操作能力。通过这种集成,可以快速搭建一个稳定、高效的数据库访问层,简化开发流程,提高开发效率。

二、集成步骤

2.1 创建 Spring Boot 项目

可以使用 Spring Initializr(https://start.spring.io/)来快速创建一个 Spring Boot 项目。在创建项目时,需要选择以下依赖:

  • Spring Web
  • Spring Data JPA
  • MySQL Driver
  • MyBatis Framework

2.2 配置数据源

application.properties 文件中配置数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/yourdatabase
spring.datasource.username=yourusername
spring.datasource.password=yourpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

2.3 配置 MyBatis

application.properties 文件中配置 MyBatis 的相关属性:

mybatis.mapper-locations=classpath:/mapper/*.xml
mybatis.type-aliases-package=com.example.demo.entity

mybatis.mapper-locations 配置 MyBatis 映射文件的位置,mybatis.type-aliases-package 配置实体类的包名,这样在 MyBatis 映射文件中就可以直接使用实体类名而无需写全限定名。

2.4 创建实体类

创建一个 Java 实体类,用于映射数据库表中的记录。例如,创建一个 User 实体类:

package com.example.demo.entity;public class User {private Long id;private String username;private String password;// 省略 getters 和 setters
}

2.5 创建 Mapper 接口

创建一个 Mapper 接口,用于定义数据库操作方法。例如,创建一个 UserMapper 接口:

package com.example.demo.mapper;import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface UserMapper {@Select("SELECT * FROM user")List<User> findAll();
}

@Mapper 注解用于将该接口标记为 MyBatis 的 Mapper 接口。

2.6 创建 Mapper 映射文件

resources/mapper 目录下创建一个 UserMapper.xml 文件,用于实现 Mapper 接口中的方法:

<?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.example.demo.mapper.UserMapper"><select id="findAll" resultType="com.example.demo.entity.User">SELECT * FROM user</select>
</mapper>

namespace 属性指定 Mapper 接口的全限定名,id 属性指定要实现的方法名,resultType 属性指定返回结果的类型。

2.7 创建 Service 层

创建一个 Service 层,用于调用 Mapper 接口中的方法。例如,创建一个 UserService 接口和其实现类 UserServiceImpl

package com.example.demo.service;import com.example.demo.entity.User;import java.util.List;public interface UserService {List<User> findAll();
}
package com.example.demo.service.impl;import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> findAll() {return userMapper.findAll();}
}

2.8 创建 Controller 层

创建一个 Controller 层,用于处理客户端请求。例如,创建一个 UserController

package com.example.demo.controller;import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic List<User> findAll() {return userService.findAll();}
}

三、示例完整代码

1. 创建 application.yml

src/main/resources 目录下创建 application.yml 文件。

2. 配置数据源和 MyBatis

将原本 application.properties 中的配置内容转换为 YAML 格式,如下:

spring:datasource:url: jdbc:mysql://localhost:3306/yourdatabaseusername: yourusernamepassword: yourpassworddriver-class-name: com.mysql.cj.jdbc.Driver
mybatis:mapper-locations: classpath:/mapper/*.xmltype-aliases-package: com.example.demo.entity

说明

  • 在 YAML 中,使用缩进表示层级关系。例如,springmybatis 是顶级配置项,datasourcespring 的子配置项,urlusernamepassworddriver-class-namedatasource 的子配置项。
  • 冒号后面需要跟一个空格,然后再写具体的值。

完整项目示例

以下是基于上述 application.yml 配置的完整项目示例,包括之前提到的各个部分:

项目结构
src
├── main
│   ├── java
│   │   ├── com
│   │   │   ├── example
│   │   │   │   ├── demo
│   │   │   │   │   ├── controller
│   │   │   │   │   │   └── UserController.java
│   │   │   │   │   ├── entity
│   │   │   │   │   │   └── User.java
│   │   │   │   │   ├── mapper
│   │   │   │   │   │   ├── UserMapper.java
│   │   │   │   │   │   └── UserMapper.xml
│   │   │   │   │   ├── service
│   │   │   │   │   │   ├── UserService.java
│   │   │   │   │   │   └── impl
│   │   │   │   │   │       └── UserServiceImpl.java
│   │   │   │   │   └── DemoApplication.java
│   └── resources
│       ├── application.yml
│       └── mapper
│           └── UserMapper.xml
└── test└── java└── com└── example└── demo└── DemoApplicationTests.java
依赖配置(pom.xml)
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring</groupId><artifactId>mybatis-spring</artifactId><version>2.0.6</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</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>
实体类(User.java)
package com.example.demo.entity;public class User {private Long id;private String username;private String password;// 构造函数public User() {}public User(String username, String password) {this.username = username;this.password = password;}// getters 和 setterspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
Mapper 接口(UserMapper.java)
package com.example.demo.mapper;import com.example.demo.entity.User;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface UserMapper {@Select("SELECT * FROM user")List<User> findAll();@Select("SELECT * FROM user WHERE id = #{id}")User findById(Long id);@Insert("INSERT INTO user (username, password) VALUES (#{username}, #{password})")@Options(useGeneratedKeys = true, keyProperty = "id")void save(User user);@Update("UPDATE user SET username = #{username}, password = #{password} WHERE id = #{id}")void update(User user);@Delete("DELETE FROM user WHERE id = #{id}")void delete(Long id);
}
Mapper 映射文件(UserMapper.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.example.demo.mapper.UserMapper"><select id="findAll" resultType="com.example.demo.entity.User">SELECT * FROM user</select><select id="findById" resultType="com.example.demo.entity.User">SELECT * FROM user WHERE id = #{id}</select><insert id="save" keyProperty="id" useGeneratedKeys="true">INSERT INTO user (username, password) VALUES (#{username}, #{password})</insert><update id="update">UPDATE user SET username = #{username}, password = #{password} WHERE id = #{id}</update><delete id="delete">DELETE FROM user WHERE id = #{id}</delete>
</mapper>
Service 层

UserService.java

package com.example.demo.service;import com.example.demo.entity.User;import java.util.List;public interface UserService {List<User> findAll();User findById(Long id);void save(User user);void update(User user);void delete(Long id);
}

UserServiceImpl.java

package com.example.demo.service.impl;import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> findAll() {return userMapper.findAll();}@Overridepublic User findById(Long id) {return userMapper.findById(id);}@Overridepublic void save(User user) {userMapper.save(user);}@Overridepublic void update(User user) {userMapper.update(user);}@Overridepublic void delete(Long id) {userMapper.delete(id);}
}
Controller 层(UserController.java)
package com.example.demo.controller;import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic ResponseEntity<List<User>> findAll() {List<User> users = userService.findAll();return new ResponseEntity<>(users, HttpStatus.OK);}@GetMapping("/{id}")public ResponseEntity<User> findById(@PathVariable Long id) {User user = userService.findById(id);if (user!= null) {return new ResponseEntity<>(user, HttpStatus.OK);} else {return new ResponseEntity<>(HttpStatus.NOT_FOUND);}}@PostMappingpublic ResponseEntity<Void> save(@RequestBody User user) {userService.save(user);return new ResponseEntity<>(HttpStatus.CREATED);}@PutMappingpublic ResponseEntity<Void> update(@RequestBody User user) {userService.update(user);return new ResponseEntity<>(HttpStatus.NO_CONTENT);}@DeleteMapping("/{id}")public ResponseEntity<Void> delete(@PathVariable Long id) {userService.delete(id);return new ResponseEntity<>(HttpStatus.NO_CONTENT);}
}
测试(DemoApplicationTests.java)
package com.example.demo;import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.*;@SpringBootTest
public class DemoApplicationTests {@Autowiredprivate UserService userService;@Testpublic void testFindAll() {assertEquals(0, userService.findAll().size());}@Testpublic void testSaveAndFindById() {User user = new User("testuser", "testpassword");userService.save(user);assertNotNull(userService.findById(user.getId()));}@Testpublic void testUpdate() {User user = new User("testuser", "testpassword");userService.save(user);user.setPassword("newpassword");userService.update(user);assertEquals("newpassword", userService.findById(user.getId()).getPassword());}@Testpublic void testDelete() {User user = new User("testuser", "testpassword");userService.save(user);userService.delete(user.getId());assertNull(userService.findById(user.getId()));}
}

通过上述配置和代码示例,你可以在 Spring Boot 项目中使用 application.yml 配置文件来集成 MyBatis,并实现完整的用户管理功能。

http://www.lryc.cn/news/514404.html

相关文章:

  • Azure Airflow 中配置错误可能会使整个集群受到攻击
  • Python跨年烟花
  • 【代码】Python|Windows 批量尝试密码去打开加密的 Word 文档(docx和doc)
  • java开发中注解汇总​​
  • C# 设计模式(结构型模式):外观模式
  • PowerShell 常见问题解答
  • 计算机网络 (15)宽带接入技术
  • 前端Python应用指南(六)构建RESTful API:使用Flask和Django实现用户认证与授权
  • 【Unity3D】基于UGUI——简易版 UI框架
  • 算法排序算法
  • 第3章 总线
  • 手机实时提取SIM卡打电话的信令声音-双卡手机来电如何获取哪一个卡的来电
  • 共阳极LED的控制与短路问题解析
  • 华为消费级QLC SSD来了
  • liunx下载gitlab
  • 深度学习模型预测值集中在某一个值
  • Sqoop的使用
  • OpenGL ES 04 图片数据是怎么写入到对应纹理单元的
  • C# 设计模式的六大原则(SOLID)
  • 数据库自增 id 过大导致前端时数据丢失
  • 第二十六天 自然语言处理(NLP)词嵌入(Word2Vec、GloVe)
  • MongoDB 固定集合
  • 数据结构9.3 - 文件基础(C++)
  • Leetcode 1254 Number of Closed Islands + Leetcode 1020 Number of Enclaves
  • Junit4单元测试快速上手
  • U盘提示格式化?原因、恢复方案与预防措施全解析
  • HTML——13.超链接
  • vue中的设计模式
  • 利用python将图片转换为pdf格式的多种方法,实现批量转换,内置模板代码,全网最全,超详细!!!
  • tcpdump的常见方法