Springboot(二)、子模块层级依赖

本贴最后更新于 1350 天前,其中的信息可能已经东海扬尘

Springboot(二)、子模块层级依赖

在上一章节中创建了基于 Maven 管理的多模块项目,这一节将介绍如何实现模块之间的依赖。

image.png
从图中可以看出 sdk 实体层会被 dao 层和 service 依赖,因为代码里会引用实体,同理 dao 层和 service 层又会被 server 依赖。serive 层主要是定义一些接口,并不进行具体的实现,具体的实现是在 server 模块,用过 dubbo 的都知道服务消费端和提供端会引用一个公共的 service 接口。而在某些项目中也有人直接将公共 service 接口定义在了 sdk 中,本项目为了更清晰点将其拆开了。

技术选用

  • idea2020
  • mybatis
  • mysql
  • navicat
  • maven
  • springboot

子模块层级依赖

首先我们将根据上图来实现子模块之间的层级依赖。
(1)在 dao 模块 pom 文件中添加 sdk 依赖
在标签下添加代码:

        <dependency>
            <groupId>com.to.jing</groupId>
            <artifactId>sdk</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

pom 文件如下图,后续随着依赖的增多将不再对 pom 文件截图。
image.png
(2)在 service 模块 pom 文件中添加 sdk 依赖
在标签下添加代码:

        <dependency>
            <groupId>com.to.jing</groupId>
            <artifactId>sdk</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

(3)在 server 模块 pom 文件中添加 service 和 sdk 依赖
在标签下添加代码:

        <dependency>
            <groupId>com.to.jing</groupId>
            <artifactId>service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.to.jing</groupId>
            <artifactId>dao</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

整合 mybatis

添加完子模块层级依赖后,我们写个完整的项目 Helloword 来测试下,同时也对各个模块的功能划分和代码的编写有个清晰的认识。。

  • 添加库表结构
    先创建数据库 course,在添加用户表 user,插入一条数据。代码如下:
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码',
  `age` int(11) NULL DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'asd', 'asd', 12);
  • dao 层引入 mybatis 依赖
    在父模块中 pom 文件中设置 mybatis 和 mysql 的版本,在 properties 标签下添加如下代码
<course.mybatis.version>1.1.1</course.mybatis.version>
<course.mysql.connection.version>5.1.35</course.mysql.connection.version>

pom 文件如下图,后续将不再进行截图。
image.png
然后在 dao 层引入 mybatis 和 mysql 依赖。

<!-- mybatis依赖 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${course.mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${course.mysql.connection.version}</version>
        </dependency>
  • sdk 模块中创建 user 实体
    sdk 模块中主要存放实体,新建包 com.to.jing.course.sdk.domain,在包下新建 User.java 实体。
package com.to.jing.course.sdk.domain;

import lombok.Data;

@Data
public class User {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
}
  • dao 模块创建 mapper
    在 dao 模块编写 sql.xml 文件和数据库映射方法接口。创建包 com.to.jing.course.dao,在包下新建接口 UserDao。注意接口前要加 @Mapper 注解。
package com.to.jing.course.dao;

import com.to.jing.course.sdk.domian.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserDao {
    User findUserById(Integer id);
}

然后在 resources 下新建目录 mybatis/sqlmap,在目录下新建 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.to.jing.course.dao.UserDao">

    <select id="findUserById" parameterType="java.lang.Integer" resultType="User">
        select * from user where id = #{id};
    </select>
</mapper>

完整项目结构如下:

image.png

  • service 模块创建服务接口
    service 下主要定义一些公共服务接口,用于服务的发布。新建包 com.to.jing.course.service,在包下新建接口 UserService。
package com.to.jing.course.service;

import com.to.jing.course.sdk.domian.User;

public interface UserService {
    User findUserById(Integer id);
}
  • server 模块实现业务逻辑
    先添加配置文件,在 resources 中新建 application.yaml 文件,配置 mybatis,原来有 xml 文件的可以删掉,或者自行配置 xml 内容。
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.119.110:3306/course?characterEncoding=UTF-8
    username: root
    password: 123456
mybatis:
  mapper-locations: classpath:mybatis/sqlmap/**/*.xml
  type-aliases-package: com.to.jing.course.sdk.domain

新建包 com.to.jing.course.server.service.impl,在包下新建 UserServiceImpl.java 文件,实现 UserService 接口。

package com.to.jing.course.server.service.impl;

import com.to.jing.course.dao.UserDao;
import com.to.jing.course.sdk.domian.User;
import com.to.jing.course.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    @Override
    public User findUserById(Integer id) {
        return userDao.findUserById(id);
    }
}

注意,这里 @Autowired 会在 idea 中显示一个波浪线,因为 springboot 后面不推荐使用这种注入方式,暂时先不管。
修改上一节 HelloController 中的代码为:

package com.to.jing.course.server.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.to.jing.course.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
    @Autowired
    private UserService userService;
    @RequestMapping("/")
    @ResponseBody
    public String hello(){
        return JSON.toJSONString(userService.findUserById(1), SerializerFeature.BrowserCompatible);
    }
}

在 AppServer 上添加 @MapperScan 注解

@MapperScan("com.to.jing.course.dao")

项目结构如下图
image.png
此时运行 AppServer 显示如下报错:
image.png
原因为 jar 版本冲突了,我们可以去到 server 模块 pom 文件下通过快捷键 ctrl+alt+shift+u,查看如下图。
image.png
红色就证明存在 jar 冲突,所以我们这里在父模块 pom 文件中替换 springboot 的版本从 2.3.5.RELEASE 到 2.1.5.RELEASE。

<course.spring-boot.sersion>2.1.5.RELEASE</course.spring-boot.sersion>

image.png
再次启动 AppServer,在浏览器中查看 http://localhost:8080/,结果如下图。

image.png

源码地址

https://github.com/ToJing/spring-boot-course tagV1.1

博客地址

http://m.loveplaycat.club:8080/articles/2020/11/09/1604914780246.html

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    942 引用 • 1458 回帖 • 109 关注
1 操作
TOJing 在 2020-11-10 09:59:32 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...