springBoot mybaties多层架构
我要用代码向我喜欢的女孩表白 人气:0前期准备
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&autoReconnect=true&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多层架构内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
加载全部内容