sprongboot学习(2)--构建树结构,springboot2整合mybatis、mysql和FastJson

sprongboot学习(2)–构建树结构,springboot2整合mybatis、mysql和FastJson

本篇文章的目的主要是学习springboot技术(1)利用Springboot实现树状结构(2)使用阿里的FastJson实现Json风格的数据显示(3)解决springboot2中FastJson功能失效的问题。
1、数据库
​​在这里插入图片描述
可以拷贝下面的sql语句在mysql数据库中执行

SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;

-- Table structure for sys_dept

DROP TABLE IF EXISTS sys_dept; CREATE TABLE sys_dept ( dept_id bigint(20) NOT NULL AUTO_INCREMENT, parent_id bigint(20) NULL DEFAULT NULL COMMENT '上级部门ID,一级部门为0', name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门名称', order_num int(11) NULL DEFAULT NULL COMMENT '排序', del_flag tinyint(4) NULL DEFAULT 0 COMMENT '是否删除 -1:已删除 0:正常', PRIMARY KEY (dept_id) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门管理' ROW_FORMAT = Dynamic;

-- Records of sys_dept

INSERT INTO sys_dept VALUES (1, 0, '总集团', 0, 0); INSERT INTO sys_dept VALUES (2, 1, '北京分公司', 1, 0); INSERT INTO sys_dept VALUES (3, 1, '上海分公司', 2, 0); INSERT INTO sys_dept VALUES (4, 3, '技术部', 0, 0); INSERT INTO sys_dept VALUES (5, 3, '销售部', 1, 0); INSERT INTO sys_dept VALUES (6, 2, '其他部', 0, 0); INSERT INTO sys_dept VALUES (7, 4, '技术三级菜单', 0, 0); INSERT INTO sys_dept VALUES (8, 5, '销售三级菜单', 0, 0);

SET FOREIGN_KEY_CHECKS = 1;

2、项目结构
在这里插入图片描述
3、代码说明(解决springboot2中FastJson不起作用的问题)
(1)pom.xml加入fastjson依赖

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.15</version>
		</dependency>

(2)继承WebMvcConfigurerAdapter ,重写WebMvcConfigurerAdapter方法 解决springboot2中FastJson不起作用的问题。

@Configuration
public class WebMvcConf extends WebMvcConfigurerAdapter {
    /**
     * 使用fastJson的方式一     需要  extends WebMvcConfigurationSupport
     * 1.需要先定义一个convert转换消息的对象
     * 2.添加fastJson的配置信息,比如:是否要格式化返回的json数据
     * 3.在convert中添加配置信息
     * 4.将convert添加到converts当中
     * @param converters
     *  这种方式才能解决乱码问题,下面的方式二我试了一下,不得行
     *  原文链接:https://blog.csdn.net/qq_33371766/article/details/82220605
     */
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//        for (HttpMessageConverter<?> converter : converters) {
//            if (converter instanceof MappingJackson2HttpMessageConverter){
//                converters.remove(converter);
//            }
//        }
        Iterator<HttpMessageConverter<?>> iterator = converters.iterator();
        while(iterator.hasNext()){
            HttpMessageConverter<?> converter = iterator.next();
            if(converter instanceof MappingJackson2HttpMessageConverter){
                iterator.remove();
            }
        }
        super.configureMessageConverters(converters);
        //1.需要先定义一个convert转换消息对象
        FastJsonHttpMessageConverter fastConverter=new FastJsonHttpMessageConverter();
        //2.添加fastJson的配置信息,比如:是否要格式化返回的json数据
        FastJsonConfig fastConfig=new FastJsonConfig();
        fastConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
        //处理中文乱码问题(不然出现中文乱码)
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        fastConverter.setSupportedMediaTypes(fastMediaTypes);
        //3.在convert中添加配置信息
        fastConverter.setFastJsonConfig(fastConfig);
        //4.将convert添加到converts当中
        converters.add(fastConverter);
    }
 }

4、其他代码说明
(1)pom.xml

<?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.3.0.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.xinyu.manage</groupId>
	<artifactId>treebuild</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>treebuild</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.2</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.15</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

(2)application.properties

# 端口号8080
server.port=8080

# spring连接mysql配置
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/tree?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# mybatis
#指定POJO扫描包来让mybatis自动扫描到自定义POJO
mybatis.type-aliases-package=com.xinyu.manage.entity
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapperLocations=classpath:mybatis/mapper/*.xml

(3)entity

import com.alibaba.fastjson.JSON;
import java.io.Serializable;
import java.util.List;
/**
 * 部门Tree结构
 */
//@TableName("sys_dept")
public class DeptEntity implements Serializable {

    //部门id
    //@TableId(value="dept_id",type= IdType.AUTO)
    private Integer deptId;
    //父Id
     private Integer parentId;
    //部门名称
    private String name;
    //排序编号
    private String orderNum;
    //删除标识
    private String delFlag;
    // 子节点
    private List<DeptEntity> treeNode;
    
    public Integer getDeptId() {
        return deptId;
    }

    public void setDeptId(Integer deptId) {
        this.deptId = deptId;
    }

    public Integer getParentId() {
        return parentId;
    }

    public void setParentId(Integer parentId) {
        this.parentId = parentId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getOrderNum() {
        return orderNum;
    }

    public void setOrderNum(String orderNum) {
        this.orderNum = orderNum;
    }

    public String getDelFlag() {
        return delFlag;
    }

    public void setDelFlag(String delFlag) {
        this.delFlag = delFlag;
    }

    public List<DeptEntity> getTreeNode() {
        return treeNode;
    }

    public void setTreeNode(List<DeptEntity> treeNode) {
        this.treeNode = treeNode;
    }

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}

(4)service

public interface TreeService {

    List<DeptEntity> getNextNodeTree(Integer deptId);

    DeptEntity getNodeTree();

}

(5)serviceImp

@Service
public class TreeServiceImp implements TreeService{
    @Autowired
    private UserDao userDao;

    public List<DeptEntity> getNextNodeTree(Integer deptId){
        return userDao.getNextNodeTree(deptId);
    }

    public DeptEntity getNodeTree(){
        return userDao.getNodeTree();
    }
}

(6)
UserDao

@Mapper
public interface UserDao {
    DeptEntity getNodeTree();
    List<DeptEntity> getNextNodeTree(int deptId);
}

mybatis-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>
</configuration>

NodeMapper.xml:路径resources/mybatis/mapper/NodeMapper.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.xinyu.manage.dao.UserDao">

    <resultMap id="BaseTreeResultMap" type="com.xinyu.manage.entity.DeptEntity">
        <result column="dept_id" property="deptId"/>
        <result column="parent_id" property="parentId"/>
        <result column="name" property="name"/>
        <result column="order_num" property="orderNum"/>
        <collection column="dept_id" property="treeNode" javaType="java.util.ArrayList"
                    ofType="com.xinyu.manage.entity.DeptEntity" select="getNextNodeTree"/>
    </resultMap>

    <resultMap id="NextTreeResultMap" type="com.xinyu.manage.entity.DeptEntity">
        <result column="dept_id" property="deptId"/>
        <result column="parent_id" property="parentId"/>
        <result column="name" property="name"/>
        <result column="order_num" property="orderNum"/>
        <collection column="dept_id" property="treeNode" javaType="java.util.ArrayList"
                    ofType="com.xinyu.manage.entity.DeptEntity" select="getNextNodeTree"/>
    </resultMap>

    <select id="getNextNodeTree" resultMap="NextTreeResultMap">
        SELECT
        *
        FROM sys_dept
        WHERE parent_id = #{deptId}
    </select>

    <select id="getNodeTree" resultMap="BaseTreeResultMap">
        SELECT
        *
        FROM sys_dept
        WHERE parent_id = 0
    </select>
</mapper>

(7)TreeController

@RestController
public class TreeController {
    @Autowired
    private TreeService treeService;

    @RequestMapping("/tree/{deptId}")
    public List<DeptEntity> tree(@PathVariable int deptId){
        return treeService.getNextNodeTree(deptId);
    }
    @RequestMapping("/treeShow")
    public List<DeptEntity> treeShow(@RequestParam("id") int id){
        return treeService.getNextNodeTree(id);
    }

    @RequestMapping("nodeTree")
    public DeptEntity nodeTree(){
        return treeService.getNodeTree();
    }

}

(8)http://localhost:8080/treeShow?id=1
页面数据显示以Json风格显示
在这里插入图片描述
github项目链接:https://github.com/hnwolfs220/treebuild
树状结构的项目参考: https://blog.csdn.net/qq_38164123/article/details/94358131

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值