Springboot(二)、子模块层级依赖
在上一章节中创建了基于 Maven 管理的多模块项目,这一节将介绍如何实现模块之间的依赖。
从图中可以看出 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 文件截图。
(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 文件如下图,后续将不再进行截图。
然后在 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>
完整项目结构如下:
- 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")
项目结构如下图
此时运行 AppServer 显示如下报错:
原因为 jar 版本冲突了,我们可以去到 server 模块 pom 文件下通过快捷键 ctrl+alt+shift+u,查看如下图。
红色就证明存在 jar 冲突,所以我们这里在父模块 pom 文件中替换 springboot 的版本从 2.3.5.RELEASE 到 2.1.5.RELEASE。
<course.spring-boot.sersion>2.1.5.RELEASE</course.spring-boot.sersion>
再次启动 AppServer,在浏览器中查看 http://localhost:8080/,结果如下图。
源码地址
https://github.com/ToJing/spring-boot-course tagV1.1
博客地址
http://m.loveplaycat.club:8080/articles/2020/11/09/1604914780246.html
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于