Mybatis中的association用法

摘要:
'1');} publicvoidsetGender(Stringgender){this.gender=性别;}publicvoidsetGrade(Stringgrade){this.grade=年级;}public voidsetSupervisor(教师主管){this.super=主管;

这篇文章我们将来学习一些 association 用法

表结构

DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( 
  `id` int(11) NOT NULL auto_increment, 
  `name` varchar(10) NOT NULL, 
  `gender` char(1) NOT NULL, 
  `major` varchar(20) NOT NULL, 
  `grade` char(4) NOT NULL, 
  `supervisor_id` int(11) NOT NULL, 
  PRIMARY KEY  (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES ('1', 'zhangsan', '男', '计算机科学与技术', '2011', '1'); -- ---------------------------- -- Table structure for teacher -- ---------------------------- DROP TABLE IF EXISTS `teacher`; CREATE TABLE `teacher` ( 
  `id` int(11) NOT NULL auto_increment, 
  `name` varchar(10) NOT NULL, 
  `gender` char(1) NOT NULL, 
  `research_area` varchar(20) NOT NULL, 
  PRIMARY KEY  (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of teacher -- ---------------------------- INSERT INTO `teacher` VALUES ('1', 'laowu', '男', '软件工程');

对应的java bean

public class Student { 
 private int id;   
 private String name;     // 姓名 
 private String gender;   // 性别 
 private String major;    // 专业 
 private String grade;    // 年级 
 private Teacher supervisor; //指导教师  

public int getId() {
 return id;
}
public void setId(int id) {
 this.id = id;
}
public String getName() {
 return name;
}
public void setName(String name) {
 this.name = name;
}
public String getGender() {
 return gender;
}
public void setGender(String gender) {
 this.gender = gender;
}
public String getMajor() {
 return major;
}
public void setMajor(String major) {
 this.major = major;
}
public String getGrade() {
 return grade;
}
public void setGrade(String grade) {
 this.grade = grade;
}
public Teacher getSupervisor() {
 return supervisor;
}
public void setSupervisor(Teacher supervisor) {
 this.supervisor = supervisor;
}
}
public class Teacher {
private int id;    
private String name;               // 教师姓名
private String gender;        // 教师性别
private String researchArea;    // 研究领域
private List<Student> supStudents; // 指导学生

public int getId() {
 return id;
}
public void setId(int id) {
 this.id = id;
}
public String getName() {
 return name;
}
public void setName(String name) {
 this.name = name;
}
public String getGender() {
 return gender;
}
public void setGender(String gender) {
 this.gender = gender;
}
public String getResearchArea() {
 return researchArea;
}
public void setResearchArea(String researchArea) {
 this.researchArea = researchArea;
}
public List<Student> getSupStudents() {
 return supStudents;
}
public void setSupStudents(List<Student> supStudents) {
 this.supStudents = supStudents;
}
}

mapper

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.zaodk.mybatis.mapper.StudentOperationMapper">
<!-- 定义java Bean的属性与数据库的列之间的映射 -->
<resultMap type="Student" id="studentResultMap">
 <id column="id" property="id" />
 <result column="name" property="name" />
 <result column="gender" property="gender" />
 <result column="major" property="major" />
 <result column="grade" property="grade"/>
 <!-- association处理has-a关系 -->
 <!--注意:这种方式javaType必须指定,表示supervisor的类型是Teacher,否则会报错 -->
 <association property="supervisor" javaType="Teacher">
  <!-- 教师自身的属性与数据库字段的映射 -->
  <id property="id" column="t_id"/>
  <result property="name" column="t_name"/>
  <result property="gender" column="t_gender"/>
  <result property="researchArea" column="research_area"/>
 </association>
</resultMap>

<!-- SQL语句中以"#{}"的形式引用参数 -->
<select id="getById" parameterType="int" resultMap="studentResultMap">
 SELECT st.id,st.name,st.gender,st.major,st.grade,t.id t_id,t.name t_name,
 t.gender t_gender,t.research_area  
 FROM student st, teacher t
 WHERE st.supervisor_id = t.id
 AND st.id=#{id}
</select> </mapper>

测试

public void testAssociation(){ 
 SqlSession session = sqlSessionFactory.openSession();
 StudentOperationMapper studentOperationMapper = session.getMapper(StudentOperationMapper.class);
 Student student = studentOperationMapper.getById(1);
 System.out.println(student.getName()+"的指导老师是:"+student.getSupervisor().getName());
}

myBatis association的两种形式

嵌套的resultMap

这种方法的本质就是把教师实体映射从association元素中提取出来,用一个resultMap元素表示。然后association元素再引用这个resultMap元素。

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.zaodk.mybatis.mapper.StudentOperationMapper">
<!-- 定义java Bean的属性与数据库的列之间的映射 -->
<resultMap type="Teacher" id="teacherResultMap">
 <id property="id" column="t_id"/>
  <result property="name" column="t_name"/>
  <result property="gender" column="t_gender"/>
  <result property="researchArea" column="research_area"/>
</resultMap>

<resultMap type="Student" id="studentResultMap">
 <id column="id" property="id" />
 <result column="name" property="name" />
 <result column="gender" property="gender" />
 <result column="major" property="major" />
 <result column="grade" property="grade"/>
 <!-- 引用teacherResultMap -->
 <association property="supervisor" resultMap="teacherResultMap"/>
</resultMap>

<!-- SQL语句中以"#{}"的形式引用参数 -->
<select id="getById" parameterType="int" resultMap="studentResultMap">
 SELECT st.id,st.name,st.gender,st.major,st.grade,t.id t_id,t.name t_name,
 t.gender t_gender,t.research_area  
 FROM student st, teacher t
 WHERE st.supervisor_id = t.id
 AND st.id=#{id}
</select> </mapper>

嵌套的select语句

这种方式是使用一条单独的select语句来加载关联的实体(本例中就是教师实体),然后在association元素中引用此select语句(注:此方法会产生N+1问题,尽量不要用嵌套的select语句)

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.zaodk.mybatis.mapper.StudentOperationMapper">
<!-- 定义java Bean的属性与数据库的列之间的映射 -->
<resultMap type="Teacher" id="supervisorResultMap">
 <id property="id" column="t_id"/>
  <result property="name" column="t_name"/>
  <result property="gender" column="t_gender"/>
  <result property="researchArea" column="research_area"/>
</resultMap>

<resultMap type="Student" id="studentResultMap">
 <id column="id" property="id" />
 <result column="name" property="name" />
 <result column="gender" property="gender" />
 <result column="major" property="major" />
 <result column="grade" property="grade"/>
 <!-- 引用teacherResultMap -->
 <association property="supervisor" column="supervisor_id" select="selectSupervisor"/>
</resultMap>

<!-- SQL语句中以"#{}"的形式引用参数 -->
<select id="getById" parameterType="int" resultMap="studentResultMap">
 select id,name,gender,major,grade,supervisor_id from student where id =#{id}
</select>

<select id="selectSupervisor" parameterType="int" resultMap="supervisorResultMap">
 select id,name,gender,research_area
 from teacher where id = #{id}
</select> </mapper>


免责声明:文章转载自《Mybatis中的association用法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办css的常用效果总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WebService基本使用

不使用任何框架,纯粹使用JDK开发一个服务端与客户端 服务端 package org.zln.ws.server;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.zln.ws.server.domain.User;import javax.jws.WebService;/*...

原装js轮播图,鼠标移入停止轮播,移出继续轮播

要求:1、点击按钮,切换图片;    2、图片能够自动轮播;       3、鼠标移入,轮播停止;移出继续轮播; 知识点:1、定时器:setInterval();     2、鼠标移入事件:onmouseenter/onmouseover;       鼠标移出事件:onmouseleave/onmouseout; 难点:假设轮播图轮播到第二张图片,此时点...

1046

Gridland Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4127 Accepted Submission(s): 1900 Problem Description For y...

Java 生成三位随机数

  调用这个Math.Random()函数能够返回带正号的double值,该值取值区间是[0.0,1.0),注意,它是左闭右开区间。返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。   如果生成三位随机数,则参考如下代码: 1 int i = (int)(Math.random()*900 + 100); 2 String myStr = Int...

Entity Framework 6 自定义连接字符串ConnectionString连接MySQL

  在开始介绍之前,首先来看看官方对Entity Framework的解释:Entity Framework (EF) is an object-relational mapper that enables .NET developers to work with relational data using domain-specific objects....

Android开发之Instrumentation(自动化测试)

Android在JUnit的之外给我们又提供了Instrumentation测试框架。通过Instrumentation可以模拟按键按下、抬起、屏幕点击、滚动等事件,有效地控制Activity进行自动化测试。 Instrumentation是执行application instrumentation代码的基类。当应用程序运行的时候instrumentati...