1. 程式人生 > >MyBatis基於註解的一對一、一對多和多對多的關係

MyBatis基於註解的一對一、一對多和多對多的關係

“今年春盡,楊花似雪,猶不見還家”

前言

之前說了MyBatis常用註解
和基於註解的簡單增刪改查操作。
現在來了解下MyBatis基於註解的一對一、一對多和多對多的關係。

示例

  • 一對一:一個人只有一個身份證號

PersonMapper .java

import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.FetchType;
import org.arunner.domain.Person;

/**
 * @author arunner
 * @date 2018/11/10
 */
public interface PersonMapper {

    @Select("select * from tb_person where id= #{id}")
    @Results({
            @Result(id=true,column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(column = "age",property = "age"),
            @Result(column = "sex",property = "sex"),
            @Result(column = "card_id",property = "card",one = @One(select = "org.arunner.mapper.CardMapper.selectCardById",fetchType = FetchType.EAGER)),
    })
    Person selectPersonById(Integer id);

}

CardMapper .java

import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;
import org.arunner.domain.Card;
import org.arunner.domain.Person;

/**
 * @author arunner
 * @date 2018/11/10
 */
public interface CardMapper {
    @Select("select * from tb_card where id= #{id}")
    Card selectCardById(Integer id);
}

測試

public class OneToOneTest {
    public static void main(String[] args) {
        SqlSession sqlSession = FKSqlSessionFactory.getSqlSession();
        PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
        Person person = mapper.selectPersonById(1);
        System.out.println(person);
        //檢視關聯的Card物件
        System.out.println(person.getCard());
        //提交事務
        sqlSession.commit();
        //關閉sqlSession物件
        sqlSession.close();
    }
}

在這裡插入圖片描述

  • 一對多:一個班級對應多個學生

ClazzMapper .java

public interface ClazzMapper {

    @Select("select * from tb_clazz where id= #{id}")
    @Results({
            @Result(id = true,column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(column = "code",property = "code"),
             //@many註解的select屬性表示需要關聯執行的SQL語句
             //FetchType.LAZY表示查詢的型別是延遲載入
            @Result(column = "id",property = "students",many = @Many(select = "org.fkit.mapper.StudentMapper.selectByClazzId",fetchType = FetchType.LAZY)),
    })
    //根據ID查詢班級資訊
    Clazz selectById(Integer id);
}

StudentMapper .java

public interface StudentMapper {

    @Select("select * from tb_student where clazz_id= #{id}")
    @Results({
            @Result(id=true,column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(column = "age",property = "age"),
            @Result(column = "sex",property = "sex")
    })
    List<Student> selectByClazzId(Integer id);
}

測試

public class OneToManyTest {
    public static void main(String[] args) {
        SqlSession sqlSession = FKSqlSessionFactory.getSqlSession();
        ClazzMapper mapper = sqlSession.getMapper(ClazzMapper.class);
       //根據ID查詢Clazz物件
        Clazz clazz = mapper.selectById(1);
        System.out.println(clazz.getId() + "-" + clazz.getCode() + "-" + clazz.getName());
        //檢視關聯的學生集合,因為配置延遲載入,所以當使用時才會執行SQL語句
        List<Student> students = clazz.getStudents();
        for (Student student : students) {
            System.out.println(student);
        }
        //提交事務
        sqlSession.commit();
        //關閉sqlSession物件
        sqlSession.close();
    }
}

在這裡插入圖片描述

  • 一對多:一個訂單對應多個商品,一個商品也可以屬於多個訂單

ArticleMapper .java

public interface ArticleMapper {

	@Select("SELECT * FROM tb_article WHERE id IN (SELECT article_id FROM tb_item WHERE order_id = #{id} ) ")
	List<Article> selectByOrderId(Integer order_id);
	
}

OrderMapper .java

public interface OrderMapper {

	@Select("SELECT * FROM TB_ORDER WHERE ID = #{id}")
	@Results({
		@Result(id=true,column="id",property="id"),
		@Result(column="code",property="code"),
		@Result(column="total",property="total"),
		@Result(column="user_id",property="user",
			[email protected](select="org.fkit.mapper.UserMapper.selectById",
		fetchType=FetchType.EAGER)),
		@Result(column="id",property="articles",
			[email protected](select="org.fkit.mapper.ArticleMapper.selectByOrderId",
		fetchType=FetchType.LAZY))
	})
	Order selectById(Integer id);
	
}

UserMapper .java

public interface UserMapper {

	@Select("SELECT * FROM TB_USER WHERE ID = #{id} ")
	User selectById(Integer id);
	
}

測試

public class ManyToManyTest {

	public static void main(String[] args) throws Exception {
		// 獲取Session例項
		SqlSession session = FKSqlSessionFactory.getSqlSession();
		// 獲取OrderMapper例項
		OrderMapper om = session.getMapper(OrderMapper.class);
		// 根據id查詢Order物件
		Order order = om.selectById(1);
		// 檢視查詢到的Order物件
		System.out.println(order.getId() + " " + order.getCode() + " " + order.getTotal());
		// 檢視Order關聯的User物件
		System.out.println(order.getUser());
		// 檢視關聯的Article集合,因為配置使用的是LAZY懶載入,所以當使用時才執行SQL語句
		order.getArticles().forEach(article -> System.out.println(article));
		// 提交事務
		session.commit();
		// 關閉Session
		session.close();
	}
}