自關聯


自關聯是指,自己即充當一方,又充當多方。其實就是普通1:n 和 n:1的變形

1、一對多
1)表結構
-- 新聞欄目
CREATE TABLE `news` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`name` varchar(10) NOT NULL,
`pid` int(5) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


2)實體類
// 新聞欄目:當前的新聞欄目被看作是一方,即父欄目
public class News {
private Integer id;
private String name;
private Set<News> childen;
//省略get set屬性方法
@Override
public String toString() {
return "News [id=" + id + ", name=" + name + ", childen=" + childen
+ "]";
}
}
3)Dao接口
public interface INewsDao {
List<News> selectById(int id);//查詢指定id欄目下面的所有子孫菜單

News selectById2(int id);//查詢指定id欄目及下面的所有子孫菜單
}
4)mapper.xml文件
<!-- 查詢指定id欄目下面的所有子孫菜單 -->
<resultMap type="News" id="newsMapper">
<id column="id" property="id"/>
<result column="name" property="name"/>

<collection property="childen"
ofType="News"
select="selectById"
column="id"/>
</resultMap>

<select id="selectById" resultMap="newsMapper">
select id,name from news where pid = #{xxx}
</select>


<!-- 查詢指定id欄目 及 下面的所有子孫菜單 -->
<select id="selectChilden" resultMap="newsMapper">
select id,name from news where pid=#{ooo}
</select>

<resultMap type="News" id="newsMapper2">
<id column="id" property="id"/>
<result column="name" property="name"/>

<collection property="childen"
ofType="News"
select="selectChilden"
column="id" />
</resultMap>

<select id="selectById2" resultMap="newsMapper2">
select id,name from news where id=#{xxx}
</select>
標簽屬性可以參考:

MyBatis 關聯查詢 (一對多、多對一)

5)測試輸出:
一、
[DEBUG] ==> Preparing: select id,name from news where pid = ?
[DEBUG] ==> Parameters: 1(Integer)
[TRACE] <== Columns: id, name
[TRACE] <== Row: 3, 內地娛樂
[DEBUG] ====> Preparing: select id,name from news where pid = ?
[DEBUG] ====> Parameters: 3(Integer)
[DEBUG] <==== Total: 0
[TRACE] <== Row: 4, 港台娛樂
[DEBUG] ====> Preparing: select id,name from news where pid = ?
[DEBUG] ====> Parameters: 4(Integer)
[DEBUG] <==== Total: 0
[DEBUG] <== Total: 2
News [id=3, name=內地娛樂, childen=[]]
News [id=4, name=港台娛樂, childen=[]]
二、
[DEBUG] ==> Preparing: select id,name from news where id=?
[DEBUG] ==> Parameters: 2(Integer)
[TRACE] <== Columns: id, name
[TRACE] <== Row: 2, 體育新聞
[DEBUG] ====> Preparing: select id,name from news where pid=?
[DEBUG] ====> Parameters: 2(Integer)
[TRACE] <==== Columns: id, name
[TRACE] <==== Row: 5, 籃球
[DEBUG] ======> Preparing: select id,name from news where pid = ?
[DEBUG] ======> Parameters: 5(Integer)
[TRACE] <====== Columns: id, name
[TRACE] <====== Row: 7, NBA
[DEBUG] ========> Preparing: select id,name from news where pid = ?
[DEBUG] ========> Parameters: 7(Integer)
[DEBUG] <======== Total: 0
[TRACE] <====== Row: 8, CBA
[DEBUG] ========> Preparing: select id,name from news where pid = ?
[DEBUG] ========> Parameters: 8(Integer)
[DEBUG] <======== Total: 0
[DEBUG] <====== Total: 2
[TRACE] <==== Row: 6, 足球
[DEBUG] ======> Preparing: select id,name from news where pid = ?
[DEBUG] ======> Parameters: 6(Integer)
[TRACE] <====== Columns: id, name
[TRACE] <====== Row: 9, 意甲
[DEBUG] ========> Preparing: select id,name from news where pid = ?
[DEBUG] ========> Parameters: 9(Integer)
[TRACE] <======== Columns: id, name
[TRACE] <======== Row: 12, AC米蘭
[DEBUG] ==========> Preparing: select id,name from news where pid = ?
[DEBUG] ==========> Parameters: 12(Integer)
[TRACE] <========== Columns: id, name
[TRACE] <========== Row: 14, 皮爾洛
[DEBUG] ============> Preparing: select id,name from news where pid = ?
[DEBUG] ============> Parameters: 14(Integer)
[DEBUG] <============ Total: 0
[DEBUG] <========== Total: 1
[TRACE] <======== Row: 13, 國際米蘭
[DEBUG] ==========> Preparing: select id,name from news where pid = ?
[DEBUG] ==========> Parameters: 13(Integer)
[DEBUG] <========== Total: 0
[DEBUG] <======== Total: 2
[TRACE] <====== Row: 10, 西甲
[DEBUG] ========> Preparing: select id,name from news where pid = ?
[DEBUG] ========> Parameters: 10(Integer)
[DEBUG] <======== Total: 0
[TRACE] <====== Row: 11, 中超
[DEBUG] ========> Preparing: select id,name from news where pid = ?
[DEBUG] ========> Parameters: 11(Integer)
[DEBUG] <======== Total: 0
[DEBUG] <====== Total: 3
[DEBUG] <==== Total: 2
[DEBUG] <== Total: 1
News [id=2, name=體育新聞, childen=[News [id=5, name=籃球, childen=[News [id=8, name=CBA, childen=[]], News [id=7, name=NBA, childen=[]]]], News [id=6, name=足球, childen=[News [id=11, name=中超, childen=[]], News [id=10, name=西甲, childen=[]], News [id=9, name=意甲, childen=[News [id=12, name=AC米蘭, childen=[News [id=14, name=皮爾洛, childen=[]]]], News [id=13, name=國際米蘭, childen=[]]]]]]]]

2、多對一
1)實體類有變化:
去掉了private Set<News> childen;其實應該留着,刪掉只是為了便於理解多對一。

添加了private News parent; 肯定只有一個父類欄目

2個成員變量都存在的話,就一個類實現多對一和一對多

// 新聞欄目:當前的新聞欄目被看作是多方,即子欄目
public class News {
private Integer id;
private String name;
private News parent;
//省略get set屬性方法
@Override
public String toString() {
return "News [id=" + id + ", name=" + name + ", parent=" + parent + "]";
}
}
2)Dao接口
public interface INewsDao {
News selectById(int id);//查詢指定id欄目及其所有父輩菜單
}
3)mapper.xml文件
<!-- 查詢指定id欄目及其所有父輩菜單 -->
<resultMap type="News" id="newsMapper">
<id column="id" property="id"/>
<result column="name" property="name"/>

<association property="parent"
javaType="News"
select="selectById"
column="pid" />
</resultMap>

<select id="selectById" resultMap="newsMapper">
select id,name,pid from news where id = #{xxx}
</select>
每一個子欄目,肯定只會存在一個父欄目。所以是一對一的關系,用<association />
4)測試輸出:
測試輸出:
[DEBUG] ==> Preparing: select id,name,pid from news where id = ?
[DEBUG] ==> Parameters: 12(Integer)
[TRACE] <== Columns: id, name, pid
[TRACE] <== Row: 12, AC米蘭, 9
[DEBUG] ====> Preparing: select id,name,pid from news where id = ?
[DEBUG] ====> Parameters: 9(Integer)
[TRACE] <==== Columns: id, name, pid
[TRACE] <==== Row: 9, 意甲, 6
[DEBUG] ======> Preparing: select id,name,pid from news where id = ?
[DEBUG] ======> Parameters: 6(Integer)
[TRACE] <====== Columns: id, name, pid
[TRACE] <====== Row: 6, 足球, 2
[DEBUG] ========> Preparing: select id,name,pid from news where id = ?
[DEBUG] ========> Parameters: 2(Integer)
[TRACE] <======== Columns: id, name, pid
[TRACE] <======== Row: 2, 體育新聞, 0
[DEBUG] ==========> Preparing: select id,name,pid from news where id = ?
[DEBUG] ==========> Parameters: 0(Integer)
[DEBUG] <========== Total: 0
[DEBUG] <======== Total: 1
[DEBUG] <====== Total: 1
[DEBUG] <==== Total: 1
[DEBUG] <== Total: 1
News [id=12, name=AC米蘭, parent=News [id=9, name=意甲, parent=News [id=6, name=足球, parent=News [id=2, name=體育新聞, parent=null]]]]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM