“今年春尽,杨花似雪,犹不见还家”
前言
之前说了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();
}
}