springBoot+mybaties后端多层架构的实现示例

 更新时间:2022年07月06日 08:52:22   作者:我要用代码向我喜欢的女孩表白  
本文主要介绍了springBoot+mybaties后端多层架构的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前期准备

1.建立一个springBoot项目

2.导入相关的pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>etf</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>etf</name>
    <description>etf</description>
 
        <properties>
            <java.version>1.8</java.version>
            <mybatis-plus.version>3.4.2</mybatis-plus.version>
        </properties>
 
 
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
 
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
 
</project>

建立相关目录

说明:

各层名称说明补充
controller与前端交互的接口部分 
service层业务逻辑主要写的地方 
mapper层mapper接口,对应mybatis的sql.xml 
mapper.xml层在resource中,mybaites自动将数据返回给mapper层 
dao与数据库1v1对应的类,驼峰-》对应数据库的下划线 

resource中的目录

idea下载安装插件

lombok

mybaits-tool(任意工具都可以plugin里很多,主要用于xml与mapper跳转)

配置mybais-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
 
<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&amp;autoReconnect=true&amp;allowMultiQueries=true"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/EtfHotMapper.xml"/>
        <mapper resource="mapper/EtfTeachMapper.xml"/>
        <mapper resource="mapper/TestEditorMapper.xml" />
        <mapper resource="mapper/TestClientMapper.xml" />
    </mappers>
 
</configuration>

dao层案例:

package com.example.etf.story.dao;
 
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
 
import java.util.Date;
 
@Data
public class TestStory {
 
    private int storyId;
    private String initInfo;
    private String storyName;
    private String storyType;
    private int status;
    private String creater;
    private String auditor;
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private Date updateTime;
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private Date createTime;
}

数据库建表案例

附送他的建表语句:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
 
-- ----------------------------
-- Table structure for test_story
-- ----------------------------
DROP TABLE IF EXISTS `test_story`;
CREATE TABLE `test_story`  (
  `story_id` int(0) NOT NULL AUTO_INCREMENT COMMENT '第一层id',
  `init_info` json NOT NULL COMMENT '初始信息',
  `story_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '名称',
  `story_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '属于种类,学习,游戏',
  `status` int(0) NULL DEFAULT NULL COMMENT '状态,0未发布,1未审核,2不通过,3审核通过,4失效',
  `creator` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '作者',
  `auditor` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '审核人',
  `update_time` timestamp(0) NULL DEFAULT NULL COMMENT '更新时间',
  `create_time` timestamp(0) NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`story_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
 
SET FOREIGN_KEY_CHECKS = 1;

Paramr案例

(前端字段交互部分)

例:入口(查询条件)

package com.example.etf.story.paramer;
 
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
 
import java.util.ArrayList;
import java.util.List;
 
@Data
public class StorySelectParam {
        private int pageNum=1;
        private int pageSize=8;
        @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
        private List<String> updateTime;
        @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
        private List<String> createTime;
        private String creator;
        private String storyName;
        private String storyType;
 
        private int sqlStart;//limit的开始
        private int sqlEnd;//limit的结束
 
 
}

返回前端内容(页码以及本次总条数,用于分页)

package com.example.etf.story.paramer;
 
import com.example.etf.story.dao.TestStory;
import lombok.Data;
 
import java.util.List;
 
@Data
public class StoriesParam {
    private List<TestStory> testStories;
    private int total;
    private int pageNum;
    private int  pageSize;
}

Controller层案例

package com.example.etf.story.controller;
 
 
import com.example.etf.story.dao.TestStory;
import com.example.etf.story.paramer.StoriesParam;
import com.example.etf.story.paramer.StorySelectParam;
import com.example.etf.story.service.TestClientService;
import com.example.etf.story.service.TestEditorService;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
 
import javax.annotation.Resource;
import java.util.List;
 
@Controller
@RestController
public class TestClientController {
 
    @Resource
    private TestClientService clientService;
 
    //获取所有已发布story
    @PostMapping("/selectStorysByPublic")
    @ResponseBody
    public StoriesParam selectStorysByPublic(@RequestBody StorySelectParam storySelectParam){
        return clientService.selectStorysByPublic(storySelectParam);
    }
 
}

Service层案例

package com.example.etf.story.service;
 
import com.example.etf.controller.SqlSessionF;
import com.example.etf.story.dao.TestStory;
import com.example.etf.story.mapper.TestClientMapper;
 
import com.example.etf.story.paramer.StoriesParam;
import com.example.etf.story.paramer.StorySelectParam;
import org.springframework.stereotype.Service;
 
import java.util.List;
 
@Service
public class TestClientService {
    public StoriesParam selectStorysByPublic(StorySelectParam storySelectParam){
        TestClientMapper mapper = new SqlSessionF().getSqlSession().getMapper(TestClientMapper.class);
        int pageNum = storySelectParam.getPageNum();
        int pageSize = storySelectParam.getPageSize();
        if(pageNum==0 || pageSize==0){
            storySelectParam.setSqlStart(0);
            storySelectParam.setSqlEnd(8);
        }else {
            storySelectParam.setSqlStart((pageNum - 1) * pageSize);
            storySelectParam.setSqlEnd(pageNum * pageSize);
        }
        System.out.println(storySelectParam);
 
        List<TestStory> testStories = mapper.selectStorysByPublic(storySelectParam);
        StoriesParam storiesParam = new StoriesParam();
        storiesParam.setTestStories(testStories);
        storiesParam.setPageNum(pageNum);
        storiesParam.setPageSize(pageSize);
 
        storiesParam.setTotal(mapper.getTotal(storySelectParam));
 
        return storiesParam;
 
    }
}

Mapper层案例

package com.example.etf.story.mapper;
 
import com.example.etf.story.dao.TestStory;
import com.example.etf.story.dao.TestStoryStage;
import com.example.etf.story.paramer.StoriesParam;
import com.example.etf.story.paramer.StorySelectParam;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Component;
 
import java.util.List;
 
@Mapper
@Component
public interface TestClientMapper {
    //分页查询所有故事
 
    List<TestStory> selectStorysByPublic(StorySelectParam storySelectParam);
    int getTotal(StorySelectParam storySelectParam);//总数用于分页
}

SQL.xml案例

(resource下的mapper)

TestClientMapper.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.etf.story.mapper.TestClientMapper">
 
<select id="selectStorysByPublic" resultType="com.example.etf.story.dao.TestStory">
    select * from
 
    test_story
 
    where
    <if test=" storyName==null or storyName=='' ">
        story_name !=""
    </if>
 
 
    <if test="storyName !='' and storyName !=null ">
        story_name like concat('%',#{storyName},'%')
    </if>
 
    <if test="creator !='' and creator !=null ">
        and creator like concat('%',#{creator},'%')
    </if>
 
    <if test="storyType !='' and storyType !=null ">
        and story_type like concat('%',#{storyType},'%')
    </if>
 
    <if test="updateTime.size()>0 and updateTime !=null">
        <![CDATA[ and DATE_FORMAT(update_time, '%Y-%m-%d') >= #{updateTime[0]} ]]>
        <![CDATA[ and DATE_FORMAT(update_time, '%Y-%m-%d') <= #{updateTime[1]} ]]>
    </if>
    <if test="createTime.size()>0 and createTime !=null">
        <![CDATA[ and DATE_FORMAT(create_time, '%Y-%m-%d') >= #{createTime[0]} ]]>
        <![CDATA[ and DATE_FORMAT(create_time, '%Y-%m-%d') <= #{createTime[1]} ]]>
    </if>
    limit ${sqlStart},${sqlEnd}
</select>
 
<select id="getTotal" resultType="int">
    select count(1) from
 
    test_story
 
    where
    <if test=" storyName==null or storyName=='' ">
        story_name !=""
    </if>
 
 
    <if test="storyName !='' and storyName !=null ">
        story_name like concat('%',#{storyName},'%')
    </if>
 
    <if test="creator !='' and creator !=null ">
        and creator like concat('%',#{creator},'%')
    </if>
 
    <if test="storyType !='' and storyType !=null ">
        and story_type like concat('%',#{storyType},'%')
    </if>
 
    <if test="updateTime.size()>0 and updateTime !=null">
        <![CDATA[ and DATE_FORMAT(update_time, '%Y-%m-%d') >= #{updateTime[0]} ]]>
        <![CDATA[ and DATE_FORMAT(update_time, '%Y-%m-%d') <= #{updateTime[1]} ]]>
    </if>
    <if test="createTime.size()>0 and createTime !=null">
        <![CDATA[ and DATE_FORMAT(create_time, '%Y-%m-%d') >= #{createTime[0]} ]]>
        <![CDATA[ and DATE_FORMAT(create_time, '%Y-%m-%d') <= #{createTime[1]} ]]>
    </if>
 
</select>
</mapper>

同志们辛苦了,新手都会觉得为什么要用这个?这么复杂。一个类不好吗?

对于老手都能理解(当你做项目后,就知道,一个项目的简单模块,就有几十个接口。轻松维护,多人协同,第一次搭建稍微麻烦点,后续开发异常舒服)

 到此这篇关于springBoot+mybaties后端多层架构的实现示例的文章就介绍到这了,更多相关springBoot mybaties多层架构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 正则表达式详细使用

    Java 正则表达式详细使用

    这篇文章主要介绍了Java 正则表达式详细使用,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-10-10
  • java实现通讯录管理系统

    java实现通讯录管理系统

    这篇文章主要为大家详细介绍了java实现通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • springboot集成swagger3与knife4j的详细代码

    springboot集成swagger3与knife4j的详细代码

    这篇文章主要介绍了springboot集成swagger3与knife4j,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 利用Postman和Chrome的开发者功能探究项目(毕业设计项目)

    利用Postman和Chrome的开发者功能探究项目(毕业设计项目)

    这篇文章主要介绍了利用Postman和Chrome的开发者功能探究项目(毕业设计项目),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java基于Javafaker生成测试数据

    Java基于Javafaker生成测试数据

    这篇文章主要介绍了Java基于Javafaker生成测试数据的方法,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-12-12
  • SpringBoot 如何使用sharding jdbc进行分库分表

    SpringBoot 如何使用sharding jdbc进行分库分表

    这篇文章主要介绍了SpringBoot 如何使用sharding jdbc进行分库分表,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Mybatis多线程下如何使用Example详解

    Mybatis多线程下如何使用Example详解

    这篇文章主要给大家介绍了关于Mybatis多线程下如何使用Example的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • 如何开发基于Netty的HTTP/HTTPS应用程序

    如何开发基于Netty的HTTP/HTTPS应用程序

    HTTP/HTTPS是最常见的协议套件之一,并且随着智能手机的成功,它的应用也日益广泛,因为对于任何公司来说,拥有一个可以被移动设备访问的网站几乎是必须的。下面就来看看如何开发基于Netty的HTTP/HTTPS应用程序
    2021-06-06
  • Java中的Spring Security配置过滤器

    Java中的Spring Security配置过滤器

    这篇文章主要介绍了Java中的Spring Security配置过滤器,文章通过围绕文章主题的相关资料展开详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • Java通过HttpClient进行HTTP请求的代码详解

    Java通过HttpClient进行HTTP请求的代码详解

    Apache HttpClient是一个功能强大且广泛使用的Java库,它提供了方便的方法来执行HTTP请求并处理响应。本文将介绍如何使用HttpClient库进行HTTP请求,包括GET请求、POST请求、添加参数和请求体、设置请求头等操作,需要的朋友可以参考下
    2023-05-05

最新评论