MyBatis 关联查询 自关联 (一对多、多对一)

所谓自关联是指,自己即充当一方,又充当多方。其实就是普通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=
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis实现关联表的一对多查询,可以使用嵌套查询语句(Nested Select),具体步骤如下: 1. 在MyBatis的Mapper XML文件中,先定义一个查询语句,用来查询所有父节点信息,如下所示: ``` <select id="getParents" resultType="Parent"> SELECT * FROM parent WHERE parent_id = #{parentId} </select> ``` 2. 接着在同一个Mapper XML文件中,定义一个嵌套查询语句,用来查询某个父节点下的所有子节点信息,如下所示: ``` <select id="getChildren" resultType="Child"> SELECT * FROM child WHERE parent_id = #{parentId} </select> ``` 3. 最后,在Mapper XML文件中,将两个查询语句组合在一起,形成一个完整的查询语句,如下所示: ``` <select id="getParentsWithChildren" resultMap="ParentWithChildren"> SELECT * FROM parent WHERE parent_id = #{parentId} <collection property="children" resultMap="ChildResultMap"> SELECT * FROM child WHERE parent_id = #{parentId} </collection> </select> ``` 其中,`resultMap`属性指定了查询结果映射的对象类型,`property`属性指定了父节点对象中的子节点集合属性名,`resultMap`属性指定了子节点对象类型的结果映射配置。 4. 最后,在Java应用程序中,通过MyBatis的`SqlSession`对象执行查询语句,获取查询结果,如下所示: ``` SqlSession sqlSession = sqlSessionFactory.openSession(); try { Mapper mapper = sqlSession.getMapper(Mapper.class); Parent parent = mapper.getParentsWithChildren(parentId); List<Child> children = parent.getChildren(); } finally { sqlSession.close(); } ``` 这样,就可以通过MyBatis实现关联表的一对多查询了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值