springboot+mybatis环境的坑和sql语句简化技巧
1.springfox-swagger实体类无限递归
https://hacpai.com/article/1525674135818 里面有不完美的解决方案
不用动源码的解决方案也有,在swagger项目里的函数传入参数没有类互相包含就可以了
这也要求某些多对多关系的实体类的属性定义要仔细走关系图
比如User和SysClass,用在swagger传入参数的实体类不能互相包含List<SysClass>和List<User>
只能继承VO(这个VO不能作为swagger函数的传入参数),把对应的包含属性写进去,然后需要查询对应列表时返回VO就行了
2.有中间表的mybatis一对多查询
查看某些有明确一对多关系的实体类的mybatis xml,可以看到查询方式是主表join子表,然后在mybatis这端把主表的数据group起来作为某个对象的元素
由此可见没有直接关联的2个表对应的类也可以用这种方式查询
<?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.ass.core.mapper.SysClassMapper"> <!-- 可根据自己的需求,是否要使用 -->
<resultMap type="com.ass.core.entity.SysClass" id="classMap">
<result property="id" column="cid"/>
<result property="code" column="code"/>
<result property="name" column="name"/>
<result property="num" column="num"/>
<result property="description" column="description"/>
</resultMap>
<resultMap type="com.ass.core.VO.ClassWithUser" id="classUser">
<result property="id" column="cid"/>
<result property="code" column="code"/>
<result property="name" column="name"/>
<result property="num" column="num"/>
<result property="description" column="description"/>
<collection property="teachers" ofType="User">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="uid" jdbcType="VARCHAR" property="uid" />
<result column="user_account" jdbcType="VARCHAR" property="userAccount" />
<result column="password" jdbcType="VARCHAR" property="password" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="user_identity" jdbcType="INTEGER" property="userIdentity" />
<result column="user_status" jdbcType="INTEGER" property="userStatus" />
<result column="user_type" jdbcType="INTEGER" property="userType" />
<result column="user_email" jdbcType="VARCHAR" property="userEmail" />
<result column="user_mobile" jdbcType="VARCHAR" property="userMobile" />
<result column="user_remind" jdbcType="VARCHAR" property="userRemind" />
<result column="user_create_time" jdbcType="TIMESTAMP" property="userCreateTime" />
<result column="user_update_time" jdbcType="TIMESTAMP" property="userUpdateTime" />
<result column="class_id" jdbcType="VARCHAR" property="classId" />
<result column="user_col2" jdbcType="VARCHAR" property="userCol2" />
<result column="user_col3" jdbcType="VARCHAR" property="userCol3" />
<result column="user_token" jdbcType="VARCHAR" property="userToken" />
<result column="role_id" jdbcType="VARCHAR" property="roleId" />
</collection>
</resultMap> <select id="selectClassListByName" resultMap="classUser">
SELECT
c.id as cid,
c.code,
c.name,
c.num,
c.description,
u.*
FROM
sys_class c
LEFT JOIN user_class uc ON c.id = uc.class_id
LEFT JOIN user u ON u.uid = uc.user_id
WHERE
c.name like '%${name}%'
</select> </mapper>
SysClassMapper.xml
3.swagger传入参数含有对象数组时的坑点
swagger前端在碰到对象数组(无论是直接传的还是实体类里面的)时,会显示xxx[0].id和xxx[0].name之类的参数,但是直接通过前端发送请求,会因为url含有非法字符被拒绝请求
如果是用其他程序提交,例如Python(先安装requests扩展包),可以提交这种带对象数组的请求,并让服务器接收
import requests
import json def login():
res = requests.post('http://localhost:20005/api/user/login?userAccount=admin&userPassword=admin', verify=False)
myj = json.loads(res.text)
#print(myj)
return myj['data']['token']
#
def addContent():
token = login()
params = {
'resourceSteps[0].procedureName': 'ytmym',
'resourceSteps[0].procedureContent': 'mytm',
'resourceSteps[2].procedureName': 'loveZJJ',
'resourceSteps[2].procedureContent': 'asswecan',
'id': '',
'resourceContentId': '45j45j',
'experimentAdd': '5j5j',
'experimentAdd1': 'grh',
'stepsjson': '[{"procedureName":"a","procedureContent":"b"}]',
'token': token,
'resourceManagementId': 'j54j45j',
'experimentalObjective': '45j45j4',
'experimentalContext': '45j45j',
'experimentalRequirements': '5j45j',
'prepareKnowledge': '54j45j',
'experimentSummary': 'j54j',
'experimentTestId': 'h4h54'
}
url = 'http://localhost:20005/api/resource/add/content'
res = requests.post(url, params=params)
print(res.text)
#
if __name__ == '__main__':
addContent()
但是这种实现方式不太推荐,太不直观了。建议使用@ResponseBody注解对象数组或包含此类型的实体类,然后让前端传入json,处理会简单一些
springboot+mybatis环境的坑和sql语句简化技巧的更多相关文章
- springBoot + mybatis实现执行多条sql语句出错解决方法
在Idea中执行多条sql语句的修改(mybatis默认的是执行sql语句是执行单条,所以要执行多条的时候需要进行配置) 需要在连接字符串中添加上&allowMultiQueries=true ...
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...
- MyBatis学习 之 二、SQL语句映射文件(1)resultMap
目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...
- mybatis 控制台打印执行的SQL语句
1. Spring boot 集成 mybatis [转载]SpringBoot中Mybatis打印sql 1.1 如果使用的是application.properties文件,加入如下配置: log ...
- MyBatis学习总结_11_MyBatis动态Sql语句
MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...
- MyBatis 入门到精通(二) SQL语句映射XML文件
MyBatis 真正强大之处就在这些映射语句,也就是它的魔力所在.对于它的强大功能,SQL 映射文件的配置却非常简单. 如果您比较SQL 映射文件配置与JDBC 代码,您很快可以发现,使用SQL 映射 ...
- mybatis基础学习1---(配置文件和sql语句)
1:配置文件(主要配置文件) 2:配置文件(引入) 3:sql语句解析: <mapper namespace="/"> <!-- 1 -->根据id查对象 ...
- MyBatis 源码分析——动态SQL语句
有几年开发经验的程序员应该都有暗骂过原生的SQL语句吧.因为他们不能一句就搞定一个业务,往往还要通过代码来拼接相关的SQL语句.相信大家会理解SQL里面的永真(1=1),永假(1=2)的意义吧.所以m ...
- mybatis下使用log4j打印sql语句和执行结果
转载自:https://www.cnblogs.com/jeevan/p/3493972.html 本来以为很简单的问题, 结果自己搞了半天还是不行; 然后google, baidu, 搜出来各种方法 ...
随机推荐
- github=>git=>composer Packages 使用教程
2018年12月17日14:32:05 因为要做搜索,所以需要用分词工具php的分词不借助的第三方的真的很少, 目前选择的是 http://www.phpbone.com/phpanalysis/ 但 ...
- 【Python基础】lpthw - Exercise 39 字典
1. 字典和列表的区别 对于列表,它是一些项的有序排列,只能通过数值来进行索引:对于字典,则可以通过许多东西进行索引,它采用键-值映射的方式,不存在一个特定的顺序,因此不能用类似列表的数值索引,但它的 ...
- 简述移动端开发前端和app间的关系
<p>前端页面嵌套进app内部,一般有时候会进行一些交互,类似于前端页面请求后台接口一样,通常会起一个前端开发人员和app开发人员会相互协定一个协议;双方就协议而言去进行请求接口和返回数据 ...
- 关于HTTP协议学习(三)
一,目录结构 HTTPS HTTP/2 HTTP 安全 HTTP 面试 HTTP 爬虫 HTTP 资源 HTTP 抓包工具及教程 Chrome HTTP 插件 HTTP 代理服务器 HTTP 图书 二 ...
- (转载)python调用shell命令之os 、commands、subprocess
linux系统下进入python交互式环境: 一.os 模块 1.1.os模块的exec方法簇: python交互界面中: In [1]: import os In [2]: os.exec os.e ...
- xmanager 开启X11转发失败问题解决
安装相关rpm包 yum -y install xorg-x11-xauth xorg-x11-utils xorg-x11-fonts-* yum install dejavu-lgc-sans-f ...
- Linux下进程和端口常用操作
https://blog.csdn.net/s573626822/article/details/80680456
- Python全栈-JavaScript】jQuery工具
jQuery工具 一.jQuery.browser.version 显示当前 IE 浏览器版本号. if ( $.browser.msie ) alert( $.browser.version ); ...
- 如何去掉wordpress后台notice提示窗口
我们在安装完wordpress插件后,有些会在后台页面弹出一个提示你去收费升级pro版,如下图所示,这无可厚非,基础功能可以免费用,如果要用高级功能可以升级.有些朋友觉得基础功能够用了,又不想看到弹出 ...
- API网关学习及介绍
一.什么是API网关 API网关是一个服务器,是系统的后端统一入口.首先,它会提供最基本的路由服务,将调用转发到上游服务.其次,作为一个入口,它还可以进行认证,鉴权,限流等操作,对上游服务保护.所以说 ...