springboot使用mybatis一對多的關聯查詢問題記錄
springboot使用mybatis一對多的關聯查詢
由於剛開始寫java不久,對sql語句的熟悉度還是不夠熟練,雖然現在使用的mybatisPlus比較多,但我始終覺得sql不能忘也不能不用,剛好最近有個需求需要做到關聯的查詢,時間也算充足,所以用sql來寫,於是踩瞭很久坑,終於跳出來瞭,小小記錄一下。
一對多
# 我這裡是一對多查詢,一張主表兩張副表,最後還要有一張VO表(就是做關聯映射用的),主表和副表的實體我就不貼瞭,以下是VO實體
這是我的controller
@RequestMapping(value = "/queryChartAll", method = RequestMethod.GET) public R<?> queryChartAll(){ List<StatementEnteringVO> statementEnteringVO = statementEnteringMapper.queruMapperPage(); if(statementEnteringVO != null){ return R.data(statementEnteringVO); }else{ return R.fail(ResultCode.ERROR); } }
mapper
public interface StatementEnteringMapper extends BaseMapper<StatementEntering> { List<StatementEnteringVO> queruMapperPage(); }
mapper.xml(註意瞭,最難受也是最坑的)
為瞭展示方便,我貼少點的字段,不然老長的代碼看球不明白,再註一下:一對多使用collection
,一對一使用association
,文章主講一對多的。所以也不對association
做解釋瞭,感興趣的朋友可以自己去瞭解一下,用法是一樣的。
<?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.ld.ldstat.mapper.StatementEnteringMapper"> <resultMap id="queryChartAllTwo" type="com.ld.ldstat.vo.StatementEnteringVO"> <id property="id" jdbcType="BIGINT" column="sid"></id> <result property="theDate" jdbcType="DATE" column="the_date"></result> <result property="deptName" jdbcType="VARCHAR" column="dept_name"></result> <result property="deptId" jdbcType="BIGINT" column="dept_id"></result> <!--這裡是對應vo實體的表1實體--> <collection property="cashCar" javaType="java.util.List" ofType="com.ld.ldstat.entity.CashCar"> <id property="id" jdbcType="BIGINT" column="cid"></id> <result property="parentId" jdbcType="BIGINT" column="c_parent_id"/> <result property="projectName" jdbcType="VARCHAR" column="c_project_name"/> <result property="ninetyWithin" jdbcType="INTEGER" column="ninety_within"/> <result property="ninetyExcept" jdbcType="INTEGER" column="ninety_except"/> <result property="cashCar" jdbcType="INTEGER" column="cash_car"/> </collection> <!--這裡是對應vo實體的表2實體--> <collection property="subtotalAll" ofType="com.ld.ldstat.entity.SubtotalAll"> <id property="id" jdbcType="BIGINT" column="aid"></id> <result property="parentId" jdbcType="BIGINT" column="a_parent_id"/> <result property="projectName" jdbcType="VARCHAR" column="a_project_name"/> <result property="subtotalType" jdbcType="INTEGER" column="subtotal_type"/> <result property="task" jdbcType="INTEGER" column="task"/> <result property="theDay" jdbcType="INTEGER" column="the_day"/> </collection> </resultMap> <select id="queruMapperPage" resultMap="queryChartAllTwo"> SELECT se.id sid,se.the_date,se.dept_name, ca.id cid,ca.project_name c_project_name,ca.parent_id c_parent_id,ca.ninety_Within,ca.ninety_except,ca.cash_car, sa.id aid,sa.project_name a_project_name,sa.parent_id a_parent_id,sa.task,sa.the_day FROM statement_entering se LEFT JOIN cash_car ca on se.id = ca.parent_id LEFT JOIN subtotal_all sa on se.id = sa.parent_id <!-- 條件可根據自己的需求增加啦--> </select> </mapper>
以下是需要註意的點(我就是在這裡踩瞭好久的坑)
以下sql用的是左連接語句LEFT JOIN
,具體的sql語句我也不解釋瞭,因為要瞭解的太多瞭,【尷尬】
這裡的這些字段必須要使用別名,為啥?因為幾張表的字段相同所以會出現覆蓋的問題,比如我副表1和副表2同時存在一個相同字段project_name
,如果不給其聲明別名,副表2該字段的數據會被副表1的該字段覆蓋掉,原理我也解釋不清楚,哈哈!!
對應的映射字段要使用別名,上圖
線劃的醜瞭些,將就吧!
看下最終獲取到的數據結構
完美,理想中的效果。。。
至於最終效果圖為啥這麼多null
,不用懷疑,這些是我沒有寫對應的映射
到此這篇關於springboot使用mybatis一對多的關聯查詢的文章就介紹到這瞭,更多相關springboot使用mybatis關聯查詢內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Mybatis實現聯表查詢並且分頁功能
- Mybatis中resultMap的使用總結
- mybatis條件語句中帶數組參數的處理
- MyBatis實現兩種查詢樹形數據的方法詳解(嵌套結果集和遞歸查詢)
- 關於mybatis一對一查詢一對多查詢遇到的問題