1、多对一的处理
a) 数据库表的设计
学生表student与老师表teacher
b) 实体类
c)编写映射文件student.mapper.xml
第一种方式:按结果嵌套处理
<?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="cn.sxt.entity.student.mapper"> <!-- 对于多对一处理有两种方式1、按结果嵌套处理2、按查询嵌套处理 --> <select id="getStudents" resultMap="StudentTeacher"> select s.id sid,s.name sname,s.tid stid,t.id tid,t.name tname from student s,teacher t where s.tid = t.id </select> <resultMap type="Student" id="StudentTeacher">重点在这一块 <id column="sid" property="id"/> <result column="sname" property="name"/> <association property="teacher" javaType="Teacher"> <id column="tid" property="id"/> <result column="tname" property="name"/> </association> </resultMap> </mapper>
第二种方式:按查询嵌套处理,有两种写法(这种方式相当于做了两次查询)
one
这种方式student.mapper.xml配置文件代码如下
<?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="cn.sxt.entity.student.mapper"> <!-- 对于多对一处理有两种方式1、按结果嵌套处理2、按查询嵌套处理 <select id="getStudents" resultMap="StudentTeacher"> select s.id sid,s.name sname,s.tid stid,t.id tid,t.name tname from student s,teacher t where s.tid = t.id </select> <resultMap type="Student" id="StudentTeacher"> <id column="sid" property="id"/> <result column="sname" property="name"/> <association property="teacher" javaType="Teacher"> <id column="tid" property="id"/> <result column="tname" property="name"/> </association> </resultMap> --> <select id="getStudents" resultMap="StudentTeacher"> select * from student </select> <resultMap type="Student" id="StudentTeacher"> <association property="teacher" column="tid" javaType="Teacher" select="cn.sxt.entity.teacher.mapper.getTeacher"></association> </resultMap> </mapper>
teacher.mapper.xml配置文件代码如下
<?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="cn.sxt.entity.teacher.mapper"> <select id="getTeacher" resultType="Teacher"> select * from teacher where id=#{id} </select> </mapper>
另外还需要在mybatis.cfg.xml中添加配置
two
然后在mybatis.cfg.xml配置文件里面只写一个
2、一对多的处理
a) 数据库表和上面设计的一样不用改(数据库表的设计不受java代码两个实体之间关系的影响)
b) 实体类要修改
Student.java
Teacher.java
c) 编写映射文件 teacher.mapper.xml
第一种处理方式:按结果嵌套处理
第二种方式:按查询嵌套处理,有两种写法(这种方式相当于做了两次查询)
两种写法,和多对一第二种方式表达的两种写法的意思是一样的,只不过是把另一个mapper.xml映射文件中的查询放到了一个文件中了,所以此处只写一种
teacher.mapper.xml
student.mapper.xml
package cn.sxt.dao; import java.io.IOException; import java.util.List; import org.apache.ibatis.session.SqlSession; import cn.sxt.entity.Student; import cn.sxt.entity.Teacher; import cn.sxt.util.MyBatisUtil; public class TeacherDao { public Teacher getTeacher(int id) throws IOException{ SqlSession session = MyBatisUtil.getSession(); Teacher teacher = session.selectOne("cn.sxt.entity.teacher.mapper.getTeacher",id); session.close(); return teacher; } }
测试代码及结果