Spring+SpringMVC集成Mybatis简单的实现
Spring+SpringMVC集成Mybatis简单的实现
有些不妥当的地方,请各位大佬多多指点,集成Mybatis的时候采用了省略Dao层的配置方法,Dao层绑定了XXXMapper.xml文件,Dao层只需写接口,直接上干货。
SSM框架简介
SSM框架,是Spring + Spring MVC + MyBatis的缩写,这个是继SSH之后,目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统。
1.Spring简介
Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
A.控制反转(IOC)是什么呢?
IOC:控制反转也叫依赖注入。利用了工厂模式将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。
[注意]:面试的时候,如果有条件,画图,这样更加显得你懂了
B.面向切面(AOP)又是什么呢?
首先,需要说明的一点,AOP只是Spring的特性,它就像OOP一样是一种编程思想,并不是某一种技术,AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。
实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
[简单点解释],比方说你想在你的biz层所有类中都加上一个打印‘你好,AOP’的功能这你经可以用aop思想来做,你先写个类写个方法,方法经实现打印‘你好,AOP’让后你Ioc这个类 ref=“biz.*”让每个类都注入。
2.Spring MVC简介
Spring MVC属于Spring Framework的后续产品,已经融合在Spring Web Flow里面,它原生支持的Spring特性,让开发变得非常简单规范。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
3.MyBatis简介
MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。可以这么理解,MyBatis是一个用来帮你管理数据增删改查的框架。
首先我们看一下目录结构目录结构
数据库数据源(权限管理系统的菜单表)
/*
Navicat Premium Data Transfer
Source Server : czh
Source Server Type : MySQL
Source Server Version : 80013
Source Host : localhost:3306
Source Schema : admin
Target Server Type : MySQL
Target Server Version : 80013
File Encoding : 65001
Date: 15/08/2019 14:43:25
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_menu
-- ----------------------------
DROP TABLE IF EXISTS `sys_menu`;
CREATE TABLE `sys_menu` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '菜单名称',
`parent_id` bigint(20) DEFAULT NULL COMMENT '父菜单ID,一级菜单为0',
`url` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '菜单URL,类型:1.普通页面(如用户管理, /sys/user) 2.嵌套完整外部页面,以http(s)开头的链接 3.嵌套服务器页面,使用iframe:前缀+目标URL(如SQL监控, iframe:/druid/login.html, iframe:前缀会替换成服务器地址)',
`perms` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '授权(多个用逗号分隔,如:sys:user:add,sys:user:edit)',
`type` int(11) DEFAULT NULL COMMENT '类型 0:目录 1:菜单 2:按钮',
`icon` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '菜单图标',
`order_num` int(11) DEFAULT NULL COMMENT '排序',
`create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人',
`create_time` datetime(0) DEFAULT NULL COMMENT '创建时间',
`last_update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人',
`last_update_time` datetime(0) DEFAULT NULL COMMENT '更新时间',
`del_flag` tinyint(4) DEFAULT 0 COMMENT '是否删除 -1:已删除 0:正常',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 45 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '菜单管理' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_menu
-- ----------------------------
INSERT INTO `sys_menu` VALUES (1, '系统管理', NULL, NULL, NULL, 0, 'el-icon-setting', 0, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (2, '用户管理', NULL, '/sys/user', NULL, 1, 'el-icon-service', 1, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (4, '角色管理', NULL, '/sys/role', NULL, 1, 'el-icon-view', 4, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (5, '菜单管理', NULL, '/sys/menu', NULL, 1, 'el-icon-menu', 5, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (9, '查看', 2, NULL, 'sys:user:view', 2, NULL, 0, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (10, '新增', 2, NULL, 'sys:user:add', 2, NULL, 0, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (11, '修改', 2, NULL, 'sys:user:edit', 2, NULL, 0, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (12, '删除', 2, NULL, 'sys:user:delete', 2, NULL, 0, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (17, '查看', 4, NULL, 'sys:role:view', 2, NULL, 0, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (18, '新增', 4, NULL, 'sys:role:add', 2, NULL, 0, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (19, '修改', 4, NULL, 'sys:role:edit', 2, NULL, 0, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (20, '删除', 4, NULL, 'sys:role:delete', 2, NULL, 0, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (21, '查看', 5, NULL, 'sys:menu:view', 2, NULL, 0, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (22, '新增', 5, NULL, 'sys:menu:add', 2, NULL, 0, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (23, '修改', 5, NULL, 'sys:menu:edit', 2, NULL, 0, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (24, '删除', 5, NULL, 'sys:menu:delete', 2, NULL, 0, NULL, NULL, NULL, NULL, 0);
INSERT INTO `sys_menu` VALUES (28, '使用案例', 0, NULL, NULL, 0, 'el-icon-picture-outline', 6, NULL, NULL, 'admin', '2018-11-15 14:39:43', 0);
SET FOREIGN_KEY_CHECKS = 1;
use表的数据源
/*
Navicat Premium Data Transfer
Source Server : czh
Source Server Type : MySQL
Source Server Version : 80013
Source Host : localhost:3306
Source Schema : admin
Target Server Type : MySQL
Target Server Version : 80013
File Encoding : 65001
Date: 15/08/2019 14:49:38
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
`password` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '密码',
`email` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '邮箱',
`mobile` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '手机号',
`status` tinyint(4) DEFAULT NULL COMMENT '状态 0:禁用 1:正常',
`create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人',
`create_time` datetime(0) DEFAULT NULL COMMENT '创建时间',
`last_update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人',
`last_update_time` datetime(0) DEFAULT NULL COMMENT '更新时间',
`del_flag` tinyint(4) DEFAULT 0 COMMENT '是否删除 -1:已删除 0:正常',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `name`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 45 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户管理' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES (1, '宋江', '123456', '11397556@qq.com', '13054866654', 1, NULL, '2019-08-12 16:39:40', NULL, '2019-08-12 16:39:44', 0);
INSERT INTO `sys_user` VALUES (2, '黄磊', '200000', '11@.com', '13154867762', 1, 'admin', '2019-08-12 22:20:19', '', NULL, 0);
INSERT INTO `sys_user` VALUES (23, '赵云', '123', 'test@qq.com', '13889700023', 1, 'admin', '2018-09-23 19:43:44', 'admin', '2018-09-23 19:43:52', 0);
INSERT INTO `sys_user` VALUES (24, '诸葛亮', '123', 'test@qq.com', '13889700023', 1, 'admin', '2018-09-23 19:44:23', 'admin', '2018-09-23 19:44:29', 0);
INSERT INTO `sys_user` VALUES (25, '曹操', '123', 'test@qq.com', '13889700023', 1, 'admin', '2018-09-23 19:45:32', 'admin', '2018-09-23 19:45:37', 0);
INSERT INTO `sys_user` VALUES (26, '典韦', '123', 'test@qq.com', '13889700023', 1, 'admin', '2018-09-23 19:45:48', 'admin', '2018-09-23 19:45:57', 0);
INSERT INTO `sys_user` VALUES (27, '夏侯惇', '123', 'test@qq.com', '13889700023', 1, 'admin', '2018-09-23 19:46:09', 'admin', '2018-09-23 19:46:17', 0);
INSERT INTO `sys_user` VALUES (28, '荀彧', '123', 'test@qq.com', '13889700023', 1, 'admin', '2018-09-23 19:46:38', 'admin', '2018-11-04 15:33:17', 0);
INSERT INTO `sys_user` VALUES (29, '孙权', '123', 'test@qq.com', '13889700023', 1, 'admin', '2018-09-23 19:46:54', 'admin', '2018-09-23 19:47:03', 0);
INSERT INTO `sys_user` VALUES (30, '周瑜', '123', 'test@qq.com', '13889700023', 1, 'admin', '2018-09-23 19:47:28', 'admin', '2018-09-23 19:48:04', 0);
INSERT INTO `sys_user` VALUES (31, '陆逊', '123', 'test@qq.com', '13889700023', 1, 'admin', '2018-09-23 19:47:44', 'admin', '2018-09-23 19:47:58', 0);
INSERT INTO `sys_user` VALUES (32, '黄盖', '123', 'test@qq.com', '13889700023', 1, 'admin', '2018-09-23 19:48:38', 'admin', '2018-09-23 19:49:02', 0);
INSERT INTO `sys_user` VALUES (43, '张向杰', 'zxj1511487', 'zhangxiangjie@163.com', '17881280356', 1, 'admin', '2019-08-13 14:38:36', 'admin', '2019-08-13 14:38:49', 1);
SET FOREIGN_KEY_CHECKS = 1;
web.xml文件的配置,配置都有注释
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" >
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 上下文参数配置 -->
<!-- Spring配置文件加载地址 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:aplicationContext.xml</param-value>
</context-param>
<!-- Servlet配置监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/spring-context.xml</param-value>
</context-param>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- <error-page>-->
<!-- <exception-type>java.lang.Exception</exception-type>-->
<!-- <location>/common/error.jsp</location>-->
<!-- </error-page>-->
</web-app>
重点来了下边就是关于集成Mybatis的相关配置
1.首先在resources目录下创建一个mapper文件夹(用来放所有的sql语句的xml文件
2.创建一个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>
<!--注入Mapper文件夹中的每一个XML文件,让Mybatis去解析SQL语句-->
<mappers>
<mapper resource="Mapper/UserMapper.xml"/>
<mapper resource="Mapper/MenuMapper.xml"/>
<mapper resource="Mapper/CustomerMapper.xml"/>
<mapper resource="Mapper/updateUserRole.xml"/>
</mappers>
</configuration>
3配置applicationContext.xml文件,这部分比较麻烦,要注意,这里采用了无Dao层的配置,用SqlSessionFactory 动态代理生成Dao层就是省略Dao层,Dao层只写接口,在这里我配置了阿里的Druid数据库连接池,创建了SqlSessionFactory工厂用来解析SQL语句,还配置了PageHelper分页插件(这个插件特别NB,两句话搞定分页,后边有案例)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">
<!--1.扫描service层-->
<context:component-scan base-package="org.taru.service.impl"/>
<context:component-scan base-package="org.taru.service.*"/>
<!--2. 在classpath 读取jdbc属性配置文件-->
<context:property-placeholder ignore-unresolvable="true" location="classpath:db.properties"/>
<!-- 3.数据源 连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!--配置连接池属性-->
<!--配置驱动类名字-->
<property name="driverClassName" value="${jdbc.driver}" />
<!-- 基本属性 url、user、password -->
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<property name="maxActive" value="20" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<!-- 验证连接有效与否的SQL,不同的数据配置不同 -->
<property name="validationQuery" value="select 1 " />
</bean>
<!--4.配置SqlSessionFactory对象 -->
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!--配置mybatis全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--分页配置-->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的方式配置参数,一行配置一个 -->
<value>
</value>
</property>
</bean>
</array>
</property>
</bean>
<!--5 自动扫描对象关系映射 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定会话工厂,如果当前上下文中只定义了一个则该属性可省去 -->
<property name="sqlSessionFactoryBeanName" value="SqlSessionFactory"></property>
<!-- 指定要自动扫描接口的基础包,实现接口 -->
<property name="basePackage" value="org.taru.dao"></property>
</bean>
</beans>
下边就是写SQL语句了,这个案例比较经典,本案例采用了
<?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属性一点要全限定性类名,写你要操作的Dao层的接口名 -->
<mapper namespace="org.taru.dao.queryMenuDao">
<!-- statement,内容:sql语句。id:唯一标识,随便写,在同一个命名空间下保持唯一
resultType:sql语句查询结果集的封装类型,tb_user即为数据库中的表 -->
<resultMap type="org.taru.domel.Menu" id="MenuMap">
<id column="id" property="id"/>
<result column="faname" property="name"/>
<collection property="date" ofType="org.taru.domel.Menu" >
<id column="id" property="id"/><!-- 这里的column对应的是下面查询的别名,而不是表字段名 -->
<result column="sonname" property="name"/>
</collection>
</resultMap>
<!-- 查询菜单树 -->
<!--<select>标签的id属性一点要是Dao层接口的方法名,否则无法解析SQL-->
<!--sql语句是五表联查查询用户的权限,生成动态菜单的SQL语句,对于初学者应该有点挑战,但是非常经典-->
<select id="queryMenu" parameterType="org.taru.domel.Menu" resultMap="MenuMap">
select e.name as faname,f.name as sonname
from
sys_user a
left join sys_user_role b on a.id = b.user_id
left join sys_role c on b.role_id = c.id
left join sys_role_menu d on c.id = d.role_id
left join sys_menu e on d.menu_id = e.id
left join sys_menu f on f.parent_id=e.id
where
e.del_flag = 0 and a.id =#{user.id}
</select>
</mapper>
下边就是Dao层接口,以前的dao层写起来特别麻烦,现在就两句话,直接上代码异(注意这里只写接口)
public interface queryMenuDao {
public List<Menu> queryMenu(String id);
}
service层也有变化,service层比SpringMVC中多了service层的接口,用serviceImpl实现类实现service方法
service接口
public interface queryMenuService {
public List<Menu> queryMenu(String id);
interface customerService {
}
}
serviceimpl实现类(这里要加头顶注解@Service,实现service接口,重写他的方法,注入Dao层的接口,调用Dao层的方法)
@Service
public class QueryMenuServiceImpl1 implements queryMenuService {
@Autowired
org.taru.dao.queryMenuDao queryMenuDao;
@Override
public List<Menu> queryMenu( String id) {
List<Menu> list =queryMenuDao.queryMenu(id);
return list;
}
}
Controller层调用service方法
@RestController
public class queryMenuController {
@Autowired
queryMenuService QueryMenuServiceImpl1;
@RequestMapping("/api/querymenu")
public JsonResult queryMenu(@RequestParam("id") String id){
JsonResult jsonResult=null;
try {
List<Menu> list = QueryMenuServiceImpl1.queryMenu(id);
if (list != null) {
jsonResult = new JsonResult("200", "查询成功", list);
} else {
jsonResult = new JsonResult("404", "查询失败", "");
}
} catch (Exception e) {
e.getStackTrace();
jsonResult = new JsonResult("500", "数据错误", "");
}
return jsonResult;
}
}
这里还有一个工具类生成Json串的名为JsonResul
public class JsonResult implements Serializable {
private String status;
private String message;
private Object data;
public String getStatus() {
return status;
}
public String getMsg() {
return message;
}
public Object getData() {
return data;
}
public void setStatus(String status) {
this.status = status;
}
public void setMsg(String msg) {
this.message = msg;
}
public void setData(Object data) {
this.data = data;
}
public JsonResult(String status, String message, Object data) {
super();
this.status = status;
this.message = message;
this.data = data;
}
}
好了所有逻辑都写完了,启动Tomcat之后我用PostMan测试结果如下:
{
"status": "200",
"data": [
{
"id": null,
"name": "用户管理",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": [
{
"id": null,
"name": "查看",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": []
}
]
},
{
"id": null,
"name": "用户管理",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": [
{
"id": null,
"name": "新增",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": []
}
]
},
{
"id": null,
"name": "用户管理",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": [
{
"id": null,
"name": "修改",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": []
}
]
},
{
"id": null,
"name": "用户管理",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": [
{
"id": null,
"name": "删除",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": []
}
]
},
{
"id": null,
"name": "角色管理",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": [
{
"id": null,
"name": "查看",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": []
}
]
},
{
"id": null,
"name": "角色管理",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": [
{
"id": null,
"name": "新增",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": []
}
]
},
{
"id": null,
"name": "角色管理",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": [
{
"id": null,
"name": "修改",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": []
}
]
},
{
"id": null,
"name": "角色管理",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": [
{
"id": null,
"name": "删除",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": []
}
]
},
{
"id": null,
"name": "系统管理",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": []
},
{
"id": null,
"name": "查看",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": []
},
{
"id": null,
"name": "查看",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": []
},
{
"id": null,
"name": "查看",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": []
},
{
"id": null,
"name": "使用案例",
"parent_id": null,
"url": null,
"perms": null,
"type": 0,
"flag": 0,
"date": []
}
],
"msg": "查询成功"
}
里边有CustomerMapper是带分页的查询
GitHub源码地址