玩转 Spring Boot 集成篇(MyBatis、JPA、事务支持)

本文介绍了Spring Boot如何与MyBatis和JPA集成,简化了ORM组件的配置,以及Spring Boot的事务支持。通过实例展示了MyBatis的配置、Mapper和Service的创建,以及事务在异常情况下的回滚机制。同时,文章还涵盖了Spring Boot集成JPA的基本步骤,利用Spring Data JPA减少数据层代码。

在使用 Spring 进行实际项目研发中,Spring 整合 ORM 组件(MyBatis、JPA)是必不可少一个环节,而在整合过程中,往往要进行大量的配置。

借助 SpringBoot 可以屏蔽 Spring 整合 ORM 组件配置的大量简化,进而让研发人员更加专注于业务逻辑的开发,使得企业级项目开发更加快速和高效。

本文将重点分享 Spring Boot 与两种常用的 ORM 组件的整合:MyBatis 和 JPA,顺带提一嘴 Spring Boot 的事务支持。

a27d5242f9a31983418f99d4aa9e9cda.png

1. Spring Boot 集成 MyBatis

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

MyBatis 特点:简单易学、灵活、解除sql与程序代码的耦合、提供映射标签,支持对象与数据库的orm字段关系映射、提供对象关系映射标签,支持对象关系组建维护、提供xml标签,支持编写动态sql等。

1.1. 引入依赖

<!-- 引入 MyBatis 依赖-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybaits-spring-boot-starter</artifactId>
    <version>2.2.1</version>
</dependency>

1.2. 添加配置

# MySQL 链接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver


## MyBatis 的配置
# Mapper资源文件存放的路径
mybatis.mapper-locations=classpath*:mapper/*Mapper.xml
# Dao 接口文件存放的目录
mybatis.type-aliases-package=com.example.demo.dao
# 开启 debug,输出 SQL
logging.level.com.example.demo.dao=debug

1.3. 编写代码

主要完成秒杀商品的添加、查询相关的数据库操作。

1.3.1. 创建实体类

package com.example.demo.model;
import java.io.Serializable;
import java.util.Date;
/**
 * 商品类
 * @author caicai
 */
public class ScProduct implements Serializable {
    private Integer id;
    private String name;
    private String productImg;
    private Integer number;
    private Date startTime;
    private Date endTime;
    private Date createTime;
    // 提供 setter、getter 方法
}

1.3.2. 创建Dao

package com.example.demo.dao;
import com.example.demo.model.ScProduct;
import org.apache.ibatis.annotations.Mapper;


@Mapper
public interface ScProductDao {
    /** 查询指定编号的商品信息*/
    ScProduct findByProductId(Integer id);
    /** 保存商品信息*/
    int insert(ScProduct scProduct);
}
  • @Mapper 注解,MyBatis 会根据接口定义与 Mapper 文件中的 SQL 语句动态创建接口的实现。

1.3.3. 创建 Service 接口

package com.example.demo.s
以下是使用 Spring Boot 整合 Thymeleaf、MyBatisJPA 和 Redis 实现商品管理的方案: ### 1. 项目初始化 创建一个 Spring Boot 项目,可以使用 Spring Initializr 来快速搭建项目骨架,添加以下依赖: ```xml <dependencies> <!-- Spring Boot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Thymeleaf --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.1</version> </dependency> <!-- Spring Boot Data JPA --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- Druid 连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> </dependencies> ``` ### 2. 数据库准备 准备好数据库中商品表所对应的实体类,以及 Spring Boot 的四层结构(controller 层、service 层、dao 层、entity 层)。 - **Entity 层**:存放商品实体类,属性值与数据库值保持一致,实现 setter 和 getter 方法。 ```java package com.example.demo.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private double price; // Getters and Setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } } ``` ### 3. 配置文件 在 `application.properties` 中进行相关配置: ```properties # MyBatis 配置 mybatis.mapper-locations=classpath:mapper/*.xml # MySQL 数据库驱动 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 数据源名称 spring.datasource.name=com.alibaba.druid.pool.DruidDataSource # 数据库连接地址 spring.datasource.url=jdbc:mysql://localhost:3306/product_management?serverTimezone=UTC&zeroDateTimeBehavior=convertToNull # 数据库用户名和密码 spring.datasource.username=root spring.datasource.password=your_password # 设置日志级别 logging.level.com.example.demo=debug # 开启 MyBatis 驼峰命名规则自动转换功能 mybatis.configuration.map-underscore-to-camel-case=true # Redis 配置 spring.redis.host=localhost spring.redis.port=6379 ``` ### 4. MyBatis 配置 创建 MyBatis 的 Mapper 接口和对应的 XML 文件: - **Mapper 接口**: ```java package com.example.demo.mapper; import com.example.demo.entity.Product; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface ProductMapper { List<Product> getAllProducts(); } ``` - **Mapper XML 文件**: ```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.ProductMapper"> <select id="getAllProducts" resultType="com.example.demo.entity.Product"> SELECT * FROM product </select> </mapper> ``` ### 5. JPA 配置 创建 JPA 的 Repository 接口: ```java package com.example.demo.repository; import com.example.demo.entity.Product; import org.springframework.data.jpa.repository.JpaRepository; public interface ProductRepository extends JpaRepository<Product, Long> { } ``` ### 6. Redis 配置 可以创建一个 Redis 工具类来操作 Redis: ```java package com.example.demo.util; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; @Component public class RedisUtil { @Autowired private RedisTemplate<String, Object> redisTemplate; public void set(String key, Object value, long timeout, TimeUnit unit) { redisTemplate.opsForValue().set(key, value, timeout, unit); } public Object get(String key) { return redisTemplate.opsForValue().get(key); } } ``` ### 7. Service 层 创建商品服务类,使用 MyBatisJPA 进行数据库操作,同时使用 Redis 进行缓存: ```java package com.example.demo.service; import com.example.demo.entity.Product; import com.example.demo.mapper.ProductMapper; import com.example.demo.repository.ProductRepository; import com.example.demo.util.RedisUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.concurrent.TimeUnit; @Service public class ProductService { @Autowired private ProductMapper productMapper; @Autowired private ProductRepository productRepository; @Autowired private RedisUtil redisUtil; public List<Product> getAllProducts() { // 先从 Redis 中获取数据 List<Product> products = (List<Product>) redisUtil.get("products"); if (products == null) { // 如果 Redis 中没有数据,从数据库中获取 products = productMapper.getAllProducts(); // 将数据存入 Redis redisUtil.set("products", products, 10, TimeUnit.MINUTES); } return products; } public Product saveProduct(Product product) { return productRepository.save(product); } } ``` ### 8. Controller 层 创建商品控制器,处理 HTTP 请求: ```java package com.example.demo.controller; import com.example.demo.entity.Product; import com.example.demo.service.ProductService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; @Controller public class ProductController { @Autowired private ProductService productService; @GetMapping("/products") public String getProducts(Model model) { List<Product> products = productService.getAllProducts(); model.addAttribute("products", products); return "products"; } @PostMapping("/products") public String saveProduct(Product product) { productService.saveProduct(product); return "redirect:/products"; } } ``` ### 9. Thymeleaf 视图 创建 Thymeleaf 模板文件 `products.html`: ```html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Product Management</title> </head> <body> <h1>Product List</h1> <table> <thead> <tr> <th>ID</th> <th>Name</th> <th>Price</th> </tr> </thead> <tbody> <tr th:each="product : ${products}"> <td th:text="${product.id}"></td> <td th:text="${product.name}"></td> <td th:text="${product.price}"></td> </tr> </tbody> </table> <form action="#" th:action="@{/products}" th:object="${product}" method="post"> <label for="name">Name:</label> <input type="text" id="name" th:field="*{name}" required><br> <label for="price">Price:</label> <input type="number" id="price" th:field="*{price}" required><br> <input type="submit" value="Save"> </form> </body> </html> ``` ### 10. 扫描 Mapper 接口 创建配置类扫描 MyBatis 的 Mapper 接口: ```java package com.example.demo.config; import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBatisMapperScannerConfig { @Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); mapperScannerConfigurer.setBasePackage("com.example.demo.mapper"); return mapperScannerConfigurer; } } ``` ### 总结 通过以上步骤,我们完成了 Spring Boot 整合 Thymeleaf、MyBatisJPA 和 Redis 实现商品管理的方案。Thymeleaf 用于构建前端页面,MyBatisJPA 用于数据库操作,Redis 用于缓存数据,提高系统性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值