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",
			one=@One(select="org.fkit.mapper.UserMapper.selectById",
		fetchType=FetchType.EAGER)),
		@Result(column="id",property="articles",
			many=@Many(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();
	}
}

猜你喜欢

转载自blog.csdn.net/A_Runner/article/details/83956925
今日推荐