首页 > 其他分享 >Spring Cloud微服务项目集成MyBatis

Spring Cloud微服务项目集成MyBatis

时间:2024-08-05 17:53:23浏览次数:12  
标签:String Spring MyBatis import model com public Cloud

        在现代软件开发中,微服务架构已经成为一种流行的解决方案,它能够将应用程序拆分成多个小的、独立的服务。每个服务负责一个特定的业务功能,并可以独立部署和扩展。Spring Cloud是一个提供各种工具和框架以支持微服务开发的开源框架,而 MyBatis 是一个流行的持久层框架,用于简化数据库操作。

        将 Spring Cloud MyBatis 结合使用,可以使你的微服务项目在处理数据持久化方面更加高效和灵活。本文将介绍如何在 Spring Cloud 微服务项目中集成 MyBatis ,并提供一个基本的实现步骤。

前置条件

在开始本文前,博主希望你已经搭建了一个微服务项目:Spring Cloud微服务项目搭建

1.添加依赖

        在子模块pom.xml配置文件中添加 MyBatisMyBatis-Plus 依赖:

        MyBatis-PlusMyBatis 的基础上,对单表操作进行了一个加强,而 MyBatis 的官方也说了,希望开发者将 MyBatisMyBatis-Plus 二者相结合起来使用

<!-- MyBatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.16</version>
</dependency>

<!-- Page helper MyBatis 分页插件 -->
    <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>6.1.0</version>
</dependency>

<!-- MyBatis Plus Plugin -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    <version>3.5.7</version>
</dependency>

 2.为MyBatis-Plus添加分页配置

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
        return interceptor;
    }
}

3.创建Mapper层

这里结合MyBatis-Plus使用,故继承了BaseMapper

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import model.order.OrderInfoModel;
import org.apache.ibatis.annotations.*;

@Mapper
public interface OrderMapper extends BaseMapper<OrderInfoModel> {

}

4.创建Mapper.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="order.mapper.OrderMapper">
    <!-- 博主这里直接在resources.mapper 目录下创建 OrderMapper.xml -->
    <!-- 将本段代码全部复制到OrderMapper.xml文件中后,在namespace上绑定对应的Mapper即可 -->
</mapper>

5.编写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="order.mapper.OrderMapper">
    <!--  订单信息 分页查询  -->
    <select id="selectOrderPage" resultMap="UserOrderResultMap">
        SELECT * FROM order_info
        <if test="userId != null">
            WHERE user_id = #{userId}
        </if>
    </select>

    <!--  根据 userId 查询用户信息  -->
    <select id="selectUserListById" resultType="model.user.UserInfoModel">
        SELECT * FROM user_info WHERE user_id = #{userId}
    </select>

    <!--  订单查询结果映射  -->
    <resultMap id="UserOrderResultMap" type="model.order.OrderInfoModel">
        <result property="userId" column="user_id" />
        <collection property="userInfo" column="user_id" select="selectUserListById" />
    </resultMap>
</mapper>

6.在Mapper层创建对应的方法

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import model.order.OrderInfoModel;
import org.apache.ibatis.annotations.*;

@Mapper
public interface OrderMapper extends BaseMapper<OrderInfoModel> {

    /**
     * 订单列表分页查询
     */
    Page<OrderInfoModel> selectOrderPage(Page<OrderInfoModel> pageModel, String userId);
}

7.创建Service层

博主这里直接继承ServiceImpl,查询业务直接在Service中编写:

  • 新增 删除 业务直接用 MyBatis-Plus 提供的方法
  • 查询业务这里,如果只是单表简单的查询的话,建议使用 MyBatis-Plus 提供的方法,对于复杂业务的查询,还是老老实实的写在 XML
@Service
public class OrderService extends ServiceImpl<OrderMapper, OrderInfoModel> {

    /**
     * 新增订单
     */
    public int createOrder(String jwt, OrderInfoModel model) {
        /* 解析 Token */
        Jws<Claims> claims = JwtUtil.parseJWT(jwt);
        String userId = claims.getPayload().get("USER_ID").toString();

        /* 绑定订单创建人 */
        model.setUserId(userId);

        /* 生成 订单ID */
        String orderId = ToolsUtil.createdID("T-", 14);
        model.setOrderId(orderId);

        return baseMapper.insert(model);
    }

    /**
     * 删除订单
     */
    public int deleteOrder(String orderId) {
        return baseMapper.deleteById(orderId);
    }

    /**
     * 订单列表 分页查询
     */
    public Page<OrderInfoModel> selectOrderPage(int page, int size, OrderInfoModel model) {
        Page<OrderInfoModel> pageModel = new Page<>(page, size);
        if ((model.getUserId() != null) && (!model.getUserId().isEmpty())) {
            return baseMapper.selectOrderPage(pageModel, model.getUserId());
        }
        return baseMapper.selectOrderPage(pageModel, null);
    }

}

 8.创建Controller层

        对于 Controller 层来说,跟直接使用 MyBatis 时没有什么太大的区别,这个地方对于直接使用字段注入,博主还是更推荐以构造函数的方式注入

@RestController
@RequestMapping("/api/auth/order")
@Tag(name = "订单管理")
public class OrderController {

    private final OrderService orderService;

    @Autowired
    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }

    @PostMapping("/create")
    @Operation(summary = "新增【订单】", parameters = {
            @Parameter(
                    name = "Authorization",
                    description = "TOKEN",
                    in = ParameterIn.HEADER,
                    required = true,
                    schema = @Schema(type = "string")
            )
    })
    public int createOrder(@RequestHeader("Authorization") String token, @RequestBody OrderInfoModel model) {
        String jwt = token.substring(14);
        return orderService.createOrder(jwt, model);
    }

    @DeleteMapping("/delete/{orderId}")
    @Operation(summary = "删除【订单】", parameters = {
            @Parameter(
                    name = "Authorization",
                    description = "TOKEN",
                    in = ParameterIn.HEADER,
                    required = true,
                    schema = @Schema(type = "string")
            )
    })
    public int deleteOrder(@PathVariable("orderId") String orderId) {
        return orderService.deleteOrder(orderId);
    }

    @PostMapping("/selectOrderPage")
    @Operation(summary = "【订单】信息分页查询", parameters = {
            @Parameter(
                    name = "Authorization",
                    description = "TOKEN",
                    in = ParameterIn.HEADER,
                    required = true,
                    schema = @Schema(type = "string")
            )
    })
    public Page<OrderInfoModel> selectOrderPage(@RequestParam(defaultValue = "1") int page,
                                                @RequestParam(defaultValue = "10") int size,
                                                @RequestBody OrderInfoModel orderInfoModel) {
        return orderService.selectOrderPage(page, size, orderInfoModel);
    }
}

9.接口测试

        最后,在Swagger文档中,或者ApiFox / PostMan 等接口测试工具中进行接口调用,就可以对我们的数据库进行操作了:

标签:String,Spring,MyBatis,import,model,com,public,Cloud
From: https://blog.csdn.net/qq_56046190/article/details/140869830

相关文章

  • 计算机毕业设计必看必学!! 85583 springboot高校网上选课系统,原创定制程序, java、PHP
                                                  摘要本论文主要论述了如何使用JAVA语言开发一个高校网上选课系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,......
  • 基于Docker Swarm、Portainer和Jenkins的Spring Cloud服务自动构建和部署
    本文探讨基于DockerSwarm、Portainer和Jenkins的SpringCloud微服务自动构建和部署。相对本文讨论的方案,业界更主流的是基于k8s,显而易见k8s的功能更强大,但也更复杂,也需要投入更多开发和运维成本。对于小公司,集群规模不会很大,DockerSwarm加上Portainer可以满足大部分需求,建议可以......
  • SpringBoot-事件监听机制
    SpringBoot-事件监听机制  本文参考的SpringBoot版本是2.6.13  一、SpringBoot启动事件顺序 事件执行顺序: 1. ApplicationStartingEvent   springboot最开始启动时触发,SpringApplication.run()之前发送。 2.ApplicationEnvironm......
  • tomcat10 springboot项目部署成功但springboot没有启动日志问题
    问题描述项目在tomcat8可以启动成功,请求也可以正常处理,在tomcat10上只有部署成功信息比如:deployWARDeploymentofwebapplicationarchive[/data1/WWW/webapps/XXX.war]hasfinishedin[127]ms,但是没有springboot启动的信息。该问题不属于springboot打包为war包不成......
  • 词云图大师(WordCloudMaster)上线Web端!
    我们非常激动地宣布,词云图大师(WordCloudMaster)现已正式上线Web端!这一全新版本为用户带来了更多的便捷和功能,让创建和分享词云变得更加轻松。无论是企业、教育机构还是个人用户,都可以通过Web端实现快速生成和定制属于自己的词云图。https://studio.wordcloudmaster.com/无缝体验......
  • 在 Glue 作业中使用 python3+ 创建 CloudFront 签名 URL
    是否可以使用python3+为GlueJob中S3文件中的一个特定文件创建具有一定时间限制的CloudFront签名URL?我看到可以在Lambda中做到这一点,但在Python文档中找不到任何内容,特别是胶水工作。任何人都可以提供一些提示吗?defload_private_key(key_path):withopen(......
  • Springboot注解
    Springboot注解DAO、Service、Controller1、dao层dao层主要做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,dao层的设计首先是设计dao层的接口,然后在Spring的配置文件中定义此接口的实现类,dao层的数据源配置,以及有关数据库连接参数都在Spring配置文件中进行......
  • springboot自学(6)springboot核心原理
    Springboot启动流程初始化各种属性,加载成对象  读取环境属性(Environment)  系统配置(spring.factories)  参数(Arguments、application.properties)创建Spring容器对象ApplicationContext,加载各种配置在容器创建前,通过监听器机制,应对不同阶段加载数据、更新数据的要求......
  • MybatisPlus自带方法报错BindingException: Invalid bound statement (not found)
    问题描述: MybatisPlus自带方法如xxx.list()xxx.save()或则xxMapper.selectList()... 等方法无法使用报错:Invalidboundstatement(notfound) 但是自己定义的sql方法可以使用问题排查: 1、自定义方法可使用排除xml位置不正确,包扫描没扫到(target目录下已生成对应的mapper和xml......
  • 联云世纪携手GMI Cloud:打造亚太至全球AI算力服务新引擎
    在全球化的浪潮中,企业不仅需要本土深耕,更需要海外扩展以实现全球竞争力的提升。特别是在人工智能(AI)技术不断成熟和应用领域的不断拓宽的今天,AI技术不仅成为推动科技创新的核心动力,更成为企业在全球市场中保持创新能力和竞争力的关键因素。联云世纪与GMICloud的战略合作,正是基......