MyBatis基於註解的一對一、一對多和多對多的關係
阿新 • • 發佈:2018-11-11
“今年春盡,楊花似雪,猶不見還家”
前言
之前說了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();
}
}