天天看点

Mybatis关联映射之关联多个对象,即一对多(二)

已知条件已在上一篇关联单个对象的文中写明,这篇文章则继续根据上篇的已知数据,实现Mybatis一对多的两种关联查询方式

新增数据如下:

1、dao.UserDao.java(Mapper映射器)

package dao;
import entity.User;
public interface UserDao {
	//关联多个对象
	public User findUserById1(String userId);//一条语句执行sql
	public User findUserById2(String userId);//两条语句执行sql
}
           

2、UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
 
 <!-- namespace为命名空间,需与映射器全名一致 -->
<mapper namespace="dao.UserDao">
	<!-- 使用一条sql语句来加载User和关联的Book(关联多个对象) -->
	<select id="findUserById1" parameterType="String" resultMap="userMap1">
		select *from cn_user u join cn_book b on(u.cn_user_id=b.cn_user_id)
			where u.cn_user_id=#{id}
	</select>
	<resultMap id="userMap1" type="entity.User">
		<!-- 定义cn_user字段的装载,一定不能少写 -->
		<id property="cn_user_id" column="cn_user_id" />
		<result property="cn_user_name" column="cn_user_name" />
		<result property="cn_user_password" column="cn_user_password" />
		<collection property="books" javaType="java.util.List" ofType="entity.Book">
			<id property="cn_book_id" column="cn_book_id" />
			<result property="cn_user_id" column="cn_user_id" />
			<result property="cn_book_name" column="cn_book_name" />
		</collection>
	</resultMap>
	
	
	<!-- 使用两条sql语句来加载User和关联的Book(关联多个对象) -->
	<select id="findUserById2" parameterType="String" resultMap="userMap2">
		select *from cn_user where cn_user_id=#{id}
	</select>
	<resultMap id="userMap2" type="entity.User">
		<!-- 映射主键 -->
		<id property="cn_user_id" column="cn_user_id"/>
		<!-- 映射其他字段,此处可以选择性指定其他属性 -->
		<result property="cn_user_name" column="cn_user_name"/>
		<!-- 指定books属性是一个List<Book>集合 -->
		<collection property="books" javaType="java.util.List" ofType="entity.Book"
			select="findBooks" column="cn_user_id" >
		</collection>
	</resultMap>
	<select id="findBooks" parameterType="String" resultType="entity.Book">
		select *from cn_book where cn_user_id=#{userId}
	</select>
</mapper>
           

3、测试类TestCase.java

package test;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import dao.UserDao;
import entity.User;

public class TestCase {
	private UserDao dao;
	private ApplicationContext ac;
	@Before
	public void init() {
		ac = new ClassPathXmlApplicationContext("spring-mybatis.xml");
		dao = ac.getBean("userDao", UserDao.class);
	}
	@Test
	public void test01() {
		User user = dao.findUserById1("用户id");//一对多,使用一条sql查询
		System.out.println(user);
	}
	@Test
	public void test02() {
		User user = dao.findUserById2("用户id");//一对多,使用两条sql查询
		System.out.println(user);
	}
}
           

以上便是Mybatis关联映射中的多个映射的两种书写情况,有不懂的可以评论或者私聊