spring boot mybatis left join 或者right join

       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 的代码贴出来,也是入门级别的,我也是入门,记录下,希望能帮助到刚入门的小伙伴

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我想吃辣条

觉得不错,就可怜可怜博主吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值