zoukankan      html  css  js  c++  java
  • Spring Boot + MyBatis 多模块搭建教程

    作者:枫本非凡
    www.cnblogs.com/orzlin/p/9717399.html

    一、前言

    1、创建父工程

    最近公司项目准备开始重构,框架选定为 SpringBoot + Mybatis,本篇主要记录了在IDEA中搭建 Spring Boot 多模块项目的过程。

    1、开发工具及系统环境

    2、项目目录结构

    • biz层:

    • 业务逻辑层

    • dao层:数据持久层

    • web层:请求处理层

    二、搭建步骤

    1、创建父工程

    IDEA 工具栏选择菜单 File -> New -> Project...

    选择Spring Initializr,Initializr默认选择Default,点击Next

    填写输入框,点击Next

    这步不需要选择直接点Next

    点击Finish创建项目

    最终得到的项目目录结构如下

    删除无用的.mvn目录、src目录、mvnw及mvnw.cmd文件,最终只留.gitignore和pom.xml

    2、创建子模块

    选择项目根目录beta右键呼出菜单,选择New -> Module

    选择Maven,点击Next

    填写ArifactId,点击Next

    修改Module name增加横杠提升可读性,点击Finish

    同理添加beta-dao、beta-web子模块,最终得到项目目录结构如下图

    3、运行项目

    在beta-web层创建com.yibao.beta.web包(注意:这是多层目录结构并非单个目录名,com >> yibao >> beta >> web)并添加入口类BetaWebApplication.java

    package com.yibao.beta.web;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @author linjian
     * @date 2018/9/29
     */
    @SpringBootApplication
    public class BetaWebApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(BetaWebApplication.class, args);
        }
    }
    

    在com.yibao.beta.web包中添加controller目录并新建一个controller,添加test方法测试接口是否可以正常访问

    package com.yibao.beta.web.controller;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author linjian
     * @date 2018/9/29
     */
    @RestController
    @RequestMapping("demo")
    public class DemoController {
    
        @GetMapping("test")
        public String test() {
            return "Hello World!";
        }
    }
    

    运行BetaWebApplication类中的main方法启动项目,默认端口为8080,访问

    http://localhost:8080/demo/test得到如下效果

    以上虽然项目能正常启动,但是模块间的依赖关系却还未添加,下面继续完善。微信搜索 web_resource 获取更多推送

    4、配置模块间的依赖关系

    各个子模块的依赖关系:biz层依赖dao层,web层依赖biz层父pom文件中声明所有子模块依赖(dependencyManagement及dependencies的区别自行查阅文档)

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.yibao.beta</groupId>
                <artifactId>beta-biz</artifactId>
                <version>${beta.version}</version>
            </dependency>
            <dependency>
                <groupId>com.yibao.beta</groupId>
                <artifactId>beta-dao</artifactId>
                <version>${beta.version}</version>
            </dependency>
            <dependency>
                <groupId>com.yibao.beta</groupId>
                <artifactId>beta-web</artifactId>
                <version>${beta.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

    其中${beta.version}定义在properties标签中

    在beta-web层中的pom文件中添加beta-biz依赖

    <dependencies>
        <dependency>
            <groupId>com.yibao.beta</groupId>
            <artifactId>beta-biz</artifactId>
        </dependency>
    </dependencies>
    

    在beta-biz层中的pom文件中添加beta-dao依赖

    <dependencies>
        <dependency>
            <groupId>com.yibao.beta</groupId>
            <artifactId>beta-dao</artifactId>
        </dependency>
    </dependencies>
    

    5 web层调用biz层接口测试

    在beta-biz层创建com.yibao.beta.biz包,添加service目录并在其中创建DemoService接口类,微信搜索 web_resource 获取更多推送

    package com.yibao.beta.biz.service;
    
    /**
     * @author linjian
     * @date 2018/9/29
     */
    public interface DemoService {
    
        String test();
    }
    
    package com.yibao.beta.biz.service.impl;
    
    import com.yibao.beta.biz.service.DemoService;
    import org.springframework.stereotype.Service;
    
    /**
     * @author linjian
     * @date 2018/9/29
     */
    @Service
    public class DemoServiceImpl implements DemoService {
    
        @Override
        public String test() {
            return "test";
        }
    }
    

    DemoController通过@Autowired注解注入DemoService,修改DemoController的test方法使之调用DemoService的test方法,最终如下所示:

    package com.yibao.beta.web.controller;
    
    import com.yibao.beta.biz.service.DemoService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author linjian
     * @date 2018/9/29
     */
    @RestController
    @RequestMapping("demo")
    public class DemoController {
    
        @Autowired
        private DemoService demoService;
    
        @GetMapping("test")
        public String test() {
            return demoService.test();
        }
    }
    

    再次运行BetaWebApplication类中的main方法启动项目,发现如下报错

    ***************************
    APPLICATION FAILED TO START
    ***************************
    
    Description:
    
    Field demoService in com.yibao.beta.web.controller.DemoController required a bean of type 'com.yibao.beta.biz.service.DemoService' that could not be found.
    
    Action:
    
    Consider defining a bean of type 'com.yibao.beta.biz.service.DemoService' in your configuration.
    

    原因是找不到DemoService类,此时需要在BetaWebApplication入口类中增加包扫描,设置@SpringBootApplication注解中的scanBasePackages值为com.yibao.beta,最终如下所示

    package com.yibao.beta.web;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @author linjian
     * @date 2018/9/29
     */
    @SpringBootApplication(scanBasePackages = "com.yibao.beta")
    @MapperScan("com.yibao.beta.dao.mapper")
    public class BetaWebApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(BetaWebApplication.class, args);
        }
    }
    

    设置完后重新运行main方法,项目正常启动,访问http://localhost:8080/demo/test得到如下效果

    6. 集成Mybatis

    父pom文件中声明mybatis-spring-boot-starter及lombok依赖

    dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.22</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

    在beta-dao层中的pom文件中添加上述依赖

    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
    

    在beta-dao层创建com.yibao.beta.dao包,通过mybatis-genertaor工具生成dao层相关文件(DO、Mapper、xml),存放目录如下

    applicatio.properties文件添加jdbc及mybatis相应配置项

    spring.datasource.driverClassName = com.mysql.jdbc.Driver
    spring.datasource.url = jdbc:mysql://192.168.1.1/test?useUnicode=true&characterEncoding=utf-8
    spring.datasource.username = test
    spring.datasource.password = 123456
    
    mybatis.mapper-locations = classpath:mybatis/*.xml
    mybatis.type-aliases-package = com.yibao.beta.dao.entity
    

    DemoService通过@Autowired注解注入UserMapper,修改DemoService的test方法使之调用UserMapper的selectByPrimaryKey方法,最终如下所示

    package com.yibao.beta.biz.service.impl;
    
    import com.yibao.beta.biz.service.DemoService;
    import com.yibao.beta.dao.entity.UserDO;
    import com.yibao.beta.dao.mapper.UserMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    /**
     * @author linjian
     * @date 2018/9/29
     */
    @Service
    public class DemoServiceImpl implements DemoService {
    
        @Autowired
        private UserMapper userMapper;
    
        @Override
        public String test() {
            UserDO user = userMapper.selectByPrimaryKey(1);
            return user.toString();
        }
    }
    

    再次运行BetaWebApplication类中的main方法启动项目,发现如下报错

    APPLICATION FAILED TO START
    ***************************
    
    Description:
    
    Field userMapper in com.yibao.beta.biz.service.impl.DemoServiceImpl required a bean of type 'com.yibao.beta.dao.mapper.UserMapper' that could not be found.
    
    Action:
    
    Consider defining a bean of type 'com.yibao.beta.dao.mapper.UserMapper' in your configuration.
    

    原因是找不到UserMapper类,此时需要在BetaWebApplication入口类中增加dao层包扫描,添加@MapperScan注解并设置其值为com.yibao.beta.dao.mapper,最终如下所示

    package com.yibao.beta.web;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @author linjian
     * @date 2018/9/29
     */
    @SpringBootApplication(scanBasePackages = "com.yibao.beta")
    @MapperScan("com.yibao.beta.dao.mapper")
    public class BetaWebApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(BetaWebApplication.class, args);
        }
    }
    

    设置完后重新运行main方法,项目正常启动,访问http://localhost:8080/demo/test得到如下效果

    至此,一个简单的 Spring Boot + Mybatis多模块项目已经搭建完毕,我们也通过启动项目调用接口验证其正确性。

    三、总结

    一个层次分明的多模块工程结构不仅方便维护,而且有利于后续微服务化。在此结构的基础上还可以扩展common层(公共组件)、server层(如dubbo对外提供的服务)微信搜索 web_resource 获取更多推送此为项目重构的第一步,后续还会的框架中集成logback、disconf、redis、dubbo等组件。

    四、未提到的坑

    在搭建过程中还遇到一个maven私服的问题,原因是公司内部的maven私服配置的中央仓库为阿里的远程仓库,它与maven自带的远程仓库相比有些jar包版本并不全,导致在搭建过程中好几次因为没拉到相应jar包导致项目启动不了。

    关注公众号Java技术栈回复"面试"获取我整理的2020最全面试题及答案。

    推荐去我的博客阅读更多:

    1.Java JVM、集合、多线程、新特性系列教程

    2.Spring MVC、Spring Boot、Spring Cloud 系列教程

    3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

    4.Java、后端、架构、阿里巴巴等大厂最新面试题

    觉得不错,别忘了点赞+转发哦!

  • 相关阅读:
    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
    11
    实战 迁移学习 VGG19、ResNet50、InceptionV3 实践 猫狗大战 问题
    tx2系统备份与恢复
    如何在Ubuntu 18.04上安装和卸载TeamViewer
    bzoj 3732 Network (kruskal重构树)
    bzoj2152 聪聪可可 (树形dp)
    牛客 216D 消消乐 (二分图最小点覆盖)
    牛客 197E 01串
    Wannafly挑战赛23
  • 原文地址:https://www.cnblogs.com/javastack/p/13353324.html
Copyright © 2011-2022 走看看