SELECT * FROM bursh_questions.menu_fold as m left join bank_chapter as b on(m.menu_id=b.menu_id)
left join(select * from question_interrupt as q where q.user_id=#{userId})interrupt on(b.chapter_id=interrupt.chapter_id)
上边是三表链表查询 我想的结果是这样的
但是用上边的sql 查出来是这样的
有数据就有数组 没有数据应该数组是空的啊,为啥还是这样的,分析了下 两个chapterId一毛一样的 我怀疑应该是指定列的问题于是我改变了指向列 sql如下
SELECT m.menu_id,m.menu_content,m.menu_display,m.menu_model,b.chapter_id,b.chapter_content,b.chapter_display,b.menu_id b_menu_id,
q.interrupt_id,q.chapter_id q_chapter_id,q.user_id,q.time,q.interrupt_answer,q.status FROM bursh_questions.menu_fold as m left join bank_chapter as b on(m.menu_id=b.menu_id)
left join(select * from question_interrupt as q where q.user_id=4000) q on(b.chapter_id=q.chapter_id)
给这个指个别名 q.chapter_id q_chapter_id 查询应该就可以了
应该有些人好奇 我的上边的链表如何那样查询的,我也说下是使用了spriing boot mybatis 下面我贴下代码 应该更清晰一点
首先在mapping.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.kotlin.bank.mapping.MenuMapping">
<resultMap id="BaseResultMap" type="com.kotlin.bank.entity.MenuEntity" autoMapping="true">
<id column="menu_id" jdbcType="INTEGER" property="menuId" />
<result column="menu_content" jdbcType="VARCHAR" property="menuContent" />
<result column="menu_display" jdbcType="INTEGER" property="menuDisplay" />
<result column="menu_model" jdbcType="INTEGER" property="menuModel" />
<collection property="data" resultMap="chapterResultMap"/>
</resultMap>
<resultMap id="chapterResultMap" type="com.kotlin.bank.entity.BankChapterEntity" >
<id column="chapter_id" jdbcType="INTEGER" property="chapterId" />
<result column="chapter_content" jdbcType="VARCHAR" property="chapterContent" />
<result column="menu_id" jdbcType="INTEGER" property="menuId" />
<collection property="InterruptList" resultMap="interruptResultMap"/>
</resultMap>
<resultMap id="interruptResultMap" type="com.kotlin.bank.entity.InterruptQuestionEntity" >
<id column="interrupt_id" jdbcType="INTEGER" property="interruptId" />
<result column="chapter_id" jdbcType="INTEGER" property="chapterId" />
<result column="time" jdbcType="VARCHAR" property="time" />
<result column="user_id" jdbcType="INTEGER" property="userId" />
<result column="status" jdbcType="INTEGER" property="status" />
<result column="interrupt_answer" jdbcType="VARCHAR" property="interruptAnswer" />
</resultMap>
<!-- 根据mode查询所有的错题 0章节 1考试 2随机生成 格局当前日期排序 查出来几条 条数动态动态-->
<select id="selectMenu" resultMap="BaseResultMap" resultType="com.kotlin.bank.entity.MenuEntity">
SELECT m.menu_id,m.menu_content,m.menu_display,m.menu_model,b.chapter_id,b.chapter_content,b.chapter_display,b.menu_id b_menu_id,
q.interrupt_id,q.chapter_id q_chapter_id,q.user_id,q.time,q.interrupt_answer,q.status FROM bursh_questions.menu_fold as m left join bank_chapter as b on(m.menu_id=b.menu_id)
left join(select * from question_interrupt as q where q.user_id=#{userId}) q on(b.chapter_id=q.chapter_id)
</select>
</mapper>
第一个resultMap 是第一个表,有个collection这个,就是第一个表和第二个表是主外键关系,你在第一个的实体类中声明一个变量,主动映射成集合,这样就很方便,不用你去循环去查第二个表了
第二个resultMap 是你的第二表 ,有个collection这个,就是我们是那边看到的那个集合也跟我上边说的一样,声明一个变量,映射集合
第三个resultMap是你的第三个表
属性介绍 可能有刚入门的一看懵逼的
resultMap 里边的 id:就是你声明的一个变量而已,可以随便起,建议起得有意义
resultMap 里边的 type:就是你对应的实体类
select 里边的 id 你的 mapping中的方法,就是你声明interface的类中的方法
select 里边 resulyMap 是你上边介绍的resulyMap的id
select 里边的 resultType对应的实体类
#{userId}这个是在mapping中定义方法的参数
实体类我也贴下 我用的是kotlin写的
class MenuEntity {
var menuId = 0
var menuContent = ""
var menuDisplay = 0
var menuModel=0
var data: ArrayList<Any>? = null
}
class BankChapterEntity {
val chapterId = 0
var chapterContent = ""
val chapterDisplay = 0
var chapterMapping=0
var menuId=0
var random=0
var InterruptList:ArrayList<Any>?=null
}
class InterruptQuestionEntity {
var interruptId=0
var chapterId=0
var userId=0
var time=""
var interruptAnswer=""
var status=0
}
上边介绍的interface的mapping 接贴下
interface MenuMapping {
fun selectMenu(userId:Int):ArrayList<Any>?
}
对应的service
@Service
class MenuService {
@Autowired
var menuMapping:MenuMapping?=null
fun selectMenu(userId:Int):ArrayList<Any>?{
return menuMapping!!.selectMenu(userId)
}
}
对应的Controller
@RestController
@RequestMapping("/menu")
class MenuController {
@Autowired
var menuService: MenuService? = null
@Autowired
var bankChapterService: BankChapterService? = null
@RequestMapping("/getMenu")
fun selectMenu(): ListDataEntity {
var data= menuService!!.selectMenu(HttpServletUtils.getRequestHeader("userId")!!.toInt()) as ArrayList<MenuEntity>
return ResultEntityUtils.packedListEntity(0,data as ArrayList<Any>)
}
}
大概就是这样,后边有时间我会把kotlin 搭建spring boot mybatis 的代码贴出来,也是入门级别的,我也是入门,记录下,希望能帮助到刚入门的小伙伴