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多层架构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot json时间格式化处理的方法

    springboot json时间格式化处理的方法

    这篇文章主要介绍了springboot json时间格式化处理的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 超好用的Java工具类库Hutool用法详解

    超好用的Java工具类库Hutool用法详解

    Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,下面就跟随小编一起来学习一下Hutool的具体用法吧
    2023-09-09
  • Java类加载的过程详解

    Java类加载的过程详解

    这篇文章主要介绍了深入理解Java 类加载全过程的相关资料,小编觉得写的还不错,需要的朋友可以参考下,希望能够给你带来帮助
    2021-09-09
  • 一文带你全面了解Java Properties类

    一文带你全面了解Java Properties类

    Properties是JDK1.0中引入的java类,目前也在项目中大量使用,主要用来读取外部的配置,那除了这个,你对它其他的一些api也了解吗? 你了解它是怎么实现的吗? 如果不清楚的话,就通过本篇文章带你一探究竟
    2022-09-09
  • java多线程学习笔记之自定义线程池

    java多线程学习笔记之自定义线程池

    本篇文章主要介绍了java多线程学习笔记之自定义线程池 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 2022最新Java泛型详解(360度无死角介绍)

    2022最新Java泛型详解(360度无死角介绍)

    Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了 编译时类型安全监测机制,该机制允许我们在编译时检测到非法的类型数据结构,这篇文章主要介绍了java泛型的基本概念及使用详解,感兴趣的朋友跟随小编一起看看吧
    2022-10-10
  • SpringBoot实现RabbitMQ监听消息的四种方式

    SpringBoot实现RabbitMQ监听消息的四种方式

    本文介绍了在Spring Boot中实现RabbitMQ监听消息的几种方式,包括使用@RabbitListener注解、MessageListenerAdapter、配置连接工厂和队列等方式,感兴趣的可以了解一下
    2024-07-07
  • java中Timer定时器的使用和启动方式

    java中Timer定时器的使用和启动方式

    这篇文章主要介绍了java中Timer定时器的使用和启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • mybatis引用其他文件中的sql片段的实现

    mybatis引用其他文件中的sql片段的实现

    Mybatis中也是支持引用其他Mapper文件中的SQL片段的,本文就来介绍一下如何使用,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • Java中try catch 的基本用法示例

    Java中try catch 的基本用法示例

    这篇文章主要给大家介绍了关于Java中try catch 的基本用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论