Mybatis中的<association>用法
2016-10-20 19:40
357 查看
转载:点击打开链接
这篇文章我们将来学习一些 association用法
这种方法的本质就是把教师实体映射从association元素中提取出来,用一个resultMap元素表示。然后association元素再引用这个resultMap元素。
这种方式是使用一条单独的select语句来加载关联的实体(本例中就是教师实体),然后在association元素中引用此select语句(注:此方法会产生N+1问题,尽量不要用嵌套的select语句)
这篇文章我们将来学习一些 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>用法
- mybatis中的<![CDATA[]]>用法
- MyBatis中<resultMap>的<association>和<collection>标签的使用
- <s:action>标签的用法
- <转>feof()和EOF用法
- <s:doubleselect />的用法
- struts-1.3.10中的<action-mappings> <action>标签中<set-property>的用法
- <转>boost::any的用法、优点和缺点以及源代码分析
- <jsp:directive.page import=""/>的用法和解释
- <bean:wirte>的用法
- <bean:write>的用法
- <p> 和<br/>用法与区别
- <a>标签锚链接的用法
- <c:forEach>很简单的用法
- <Win32_12>位图的透明效果——AlphaBlend函数的用法
- <s:iterator>和<s:param>,<s:a>的用法
- <bitset>的用法整理
- Struts2标签的<s:set>标签的用法
- C++中星号(*)和与号(&)的用法 <转>
- <s:iterator>标签的用法