Spring Boot项目开发全过程-集成篇
以下内容仅是对于部分流行技术的集成,并不全面,但掌握这些流行技术的集成方法,其他的就可以照虎画猫, 从而全面掌握Spring Boot集成方法,此方法对于框架本身集成的技术也同样适用。
集成 MyBatis
什么是MyBatis?
MyBatis 是一个Java持久层框架,它提供了简便易用的方法来操作数据库。MyBatis 通过使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射到数据库中的记录。
在Spring Boot中集成MyBatis通常涉及以下几个步骤:
1.添加依赖
<!-- mybatis启动器 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<!-- mysql连接器 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
<scope>runtime</scope>
</dependency>
<!-- mybatis生成器 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
2.配置数据源
在application.properties
或application.yml
文件中配置数据源,包括数据库驱动、URL、用户名和密码。
例如,使用application.properties
配置MySQL数据源可能如下所示:
# 数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
创建实体类(也称为POJOs或JavaBeans)是推荐的做法,但并不是强制性的。实体类在MyBatis中代表数据库表中的行,通常包含与表列相对应的属性以及相应的getter和setter方法。使用实体类可以提高开发效率,因为它们提供了一种类型安全的方式来处理数据库操作的结果。
3.启用MyBatis映射器扫描
确保SpringBoot能够扫描到MyBatis的Mapper接口。可以用@MapperScan
注解指定接口所在的包。
在我的主应用类或配置类上添加@MapperScan
:
@SpringBootApplication
@MapperScan("com.example.project.mapper")//指向我的mapper接口所在的包
public class YourApplication{
public static void main(String[] args){
SpringApplication.run(YourApplication.class,args);
}
}
4.定义数据库操作(映射器)
MyBatis 允许你通过两种方式来定义数据库的操作:使用 XML 映射文件或者使用注解。这两种方式可以根据项目的需要和开发者的偏好来选择。
使用 XML 映射文件
-
创建 Mapper 接口:
首先,你需要创建一个接口,该接口定义了将要执行的数据库操作。例如:
package com.example.mapper; public interface UserMapper { User selectUser(int id); }
-
创建 XML 映射文件:
然后,你需要为这个接口创建一个 XML 映射文件。文件名通常是接口的名称加上
.xml
后缀,并放在与接口相同的包路径下。这个文件定义了具体的 SQL 语句和它们如何映射到接口方法。例如:<?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.mapper.UserMapper"> <select id="selectUser" parameterType="int" resultType="com.example.domain.User"> SELECT * FROM users WHERE id = #{id} </select> </mapper>
在这个例子中,selectUser
方法会执行一个 SQL 查询来返回一个 User
对象。
使用注解
如果你倾向于使用注解,那么可以省略 XML 映射文件,而是直接在 Mapper 接口的方法上使用 MyBatis 的注解来指定 SQL 语句。例如:
package com.example.mapper;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User selectUser(int id);
}
在这种情况下,@Select
注解告诉 MyBatis 执行的 SQL 语句是什么,而参数 #{id}
是一个占位符,它将被方法参数 id
的值所替代。
如果你使用的是XML方式定义MyBatis的SQL映射,则需要告诉MyBatis这些XML文件的位置。在application.properties
或application.yml
中设置mybatis.mapper-locations
属性。
# MyBatis 配置
mybatis.mapper-locations=classpath:mapper/*.xml
6.开始使用
创建完成后,你可以在服务层注入Mapper接口,并开始使用它进行数据库操作。
@Service
public class UserService{
private final UserMapper userMapper;
@AutoWired
public UserService(UserMapper userMapper){
this.userMapper = userMapper;
}
public User getUserById(Integer id){
return userMapper.getUserById(id);
}
}
集成 JDBC
JdbcTemplate 是 Spring 对数据库的操作在 jdbc 上面做了深层次的封装。使用 Spring 的注入功能,可以把 DataSource 注册到 JdbcTemplate 之中。
JdbcTemplate 主要提供以下五类方法:
- execute:用于执行任何 SQL 语句,一般用于执行 DDL 语句;
- update:用于执行新增、修改、删除等语句;
- batchUpdate:用于执行批处理相关语句;
- query 和 queryForXXX:用于执行查询相关语句;
- call:用于执行存储过程、函数相关语句;
1.添加 POM 依赖
<!-- JDBC依赖(JDBCTemplate) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MySQL JDBC Driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
<scope>runtime</scope>
</dependency>
2.配置数据源
在application.properties
或application.yml
配置文件中,配置数据源信息,例如对于MySQL数据库:
# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC
spring.datasource.username=用户名
spring.datasource.password=密码
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Spring Boot会使用这些配置信息自动配置数据源和JDBC模板(JdbcTemplate
)。
创建实体类(也称为POJOs或JavaBeans)是推荐的做法,但并不是强制性的。实体类代表数据库表中的行,通常包含与表列相对应的属性以及相应的getter和setter方法。使用实体类可以提高开发效率,因为它们提供了一种类型安全的方式来处理数据库操作的结果。
3.注入JdbcTemplate
编写 service 类,在该类中注入 JdbcTemplate,然后使用 JdbcTemplate 实现数据库查询。代码如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class YourService {
// 注入JdbcTemplate 实例
@Autowired
private JdbcTemplate jdbcTemplate;
public void someDatabaseOperation() {
String sql = "SELECT * FROM your_table";
List<Map<String, Object>> results = jdbcTemplate.queryForList(sql);
// 处理查询结果
}
}
4. 执行数据库操作
现在可以使用JdbcTemplate
来执行SQL查询或更新。JdbcTemplate
提供了多种方法来简化CRUD(创建、读取、更新、删除)操作的执行。
集成 MongoDB
MongoDB是一个开源的文档型数据库,属于NoSQL数据库系列,旨在处理大规模的数据集合和提供高性能、高可用性以及易扩展性的数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。
MongoDB 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
1. 添加依赖
<dependencies>
<!-- Spring Boot MongoDB Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
</dependencies>
2.配置MongoDB
# MongoDB URI
spring.data.mongodb.uri=mongodb://用户名:密码@localhost:27017/数据库名
# 如果没有启用身份验证,可以更简单:
spring.data.mongodb.database=数据库名
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
3.创建文档类
在Spring Data MongoDB中,一个文档通常由一个Java类表示,该类用@Document
注解标记,字段映射到文档的键值对。
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document
public class User {
@Id
private String id;
private String name;
private String email;
// 构造函数、getter和setter
}
4.定义Respository接口
Spring Data提供了一种简化数据访问的方法,即通过自定义Respository接口扩展MongoRepository
接口。
import org.springframework.data.mongodb.repository.MongoRepository;
public interface UserRepository extends MongoRepository<User, String> {
// 这里可以定义查询方法,Spring Data MongoDB会自动实现它们
}
5. 使用Repository
你现在可以在你的服务层中注入UserRepository
,执行数据库操作了,如保存文档、查询文档等。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public void addUser(User user) {
userRepository.save(user);
}
public List<User> findAllUsers() {
return userRepository.findAll();
}
// 其他业务逻辑
}
集成 Redis
Redis(Remote Dictionary Server)是一个开源的高性能的键值对数据库。它通常被用作数据结构服务器,因为键(key)可以包含字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)、位图(bitmaps)、超日志(hyperloglogs)或地理空间索引(geospatial indexes)等各种类型的值。
1.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置Redis
resources/application.yml
spring:
# Redis配置
redis:
# Redis数据库索引(默认为0)
database: 0
# Redis主机地址
host: 127.0.0.1
# redis端口
port: 6379
3.定义RedisTemplate(可选,因为有默认配置的RedisTemplate)
使用 @Configuration 注解创建一个 RedisTemplate 实例,代码如下:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
// 设置value的序列化器
// 这里可以根据情况选择合适的序列化器
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
使用 RedisTemplate 进行对象存储时,需要使存储对象实现 Serializable 接口,这样才能够成功将对象进行序列化。
spring-data-redis 提供了多种 Serializer 策略,这对使用 jedis 的开发者而言,实在是非常便捷。spring-data-redis 提供了4种内置的 Serializer:
JdkSerializationRedisSerializer:使用 JDK 的序列化手段 (Serializable 接口,ObjectInputStrean,ObjectOutputStream),数据以字节流存储
StringRedisSerializer:字符串编码,数据以 String 存储
JacksonJsonRedisSerializer:json 格式存储
OxmSerializer:xml 格式存储
由于本实例仅仅用于演示,因此上面的实例将简单将字符串存储到 Redis,序列化对象使用 StringRedisSerializer。
4.使用RedisTemplate
由于前面已经创建了 RedisTemplate 实例,可以使用 @Autowired 注解注入 RedisTemplate 实例。代码如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class RedisExample {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public void setKeyValue(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
public Object getValue(String key) {
return redisTemplate.opsForValue().get(key);
}
}
5.访问和操作Redis
一旦配置好RedisTemplate,你就可以在应用中自由地使用它来进行各种Redis操作,包括基本的CRUD操作、发布/订阅消息以及其他高级功能。
总结
以下对以上集成的通用性的总结,从而为开发者更好的继承其他技术提供思路。
1. 业务需求
在集成新技术前,清晰地定义为什么需要这项技术,它要解决什么问题,以及它与项目目前技术栈的兼容性。
2. 技术学习
- 理解新技术: 阅读文档,了解该技术的核心概念、优缺点和最佳实践。
- 社区探讨: 查看社区论坛、Stack Overflow等地的讨论,了解常见的问题和解决方案。
3. 添加依赖
通过Maven的pom.xml
或Gradle的build.gradle
文件添加所需技术的依赖。确保依赖的版本与Spring Boot版本兼容。
4. 基础配置
- 配置文件: 更新
application.properties
或application.yml
,添加所需的配置属性。 - 初始化代码: 如果必要,编写配置类或初始化代码以集成新技术。
5. 开发示例
实现一个简单的示例,确保新技术能在项目中正常运行。这可以帮助理解如何在项目中使用该技术。
6. 编写测试
添加集成测试和单元测试以验证新技术的集成是否符合预期。