数据库表结构
Students表
Class_table表
多对一处理的2种方法
- 按结果嵌套处理
实体类
Students.java
public class Students { private String s_id; private String s_name; private String s_sex; //关联对象(外键)数据类型应该为关联对象的实体类 private Classs classs; //get set 略 |
Class.java
public class Classs { private String c_id; private String c_name; //get set 略 |
业务类
public List<Students> getStudents() throws IOException{ SqlSession ss=MybatisUit.getSession(); List<Students> list=ss.selectList("com.master.Students.maapper.selectStudentClass"); ss.close(); return list; } |
Sql语句映射
<select id="selectStudentClass" resultMap="StudentsClass"> select s_id,s_name,s_sex,c_name from Students as s,class_table as c where s.c_id=c.c_id </select> <resultMap id="StudentsClass" type="com.master.Students"> <!-- id 数据库表的主键, result数据库表的其他字段 --> <!-- column数据库表中的列名 映射到 property对应实体类的属性 --> <id column="s_id" property="s_id"/> <result column="s_name" property="s_name"/> <result column="s_sex" property="s_sex"/> <!-- association表示resultMap的id映射类型的关联对象在实体类中的属性 即数据库表的外键在实体类中的对应属性 --> <!-- javaType关联对象在java中的实体类 --> <association property="classs" javaType="com.master.Classs"> <id column="c_id" property="c_id"/> <result column="c_name" property="c_name"/> </association> </resultMap> |
测试
public class Test { public static void main(String[] args) throws IOException { StudentsDao sd=new StudentsDao(); List<Students> list=sd.getStudents(); for(Students stu:list) { System.out.print(" s_id: "+stu.getS_id()+" "); System.out.print(" s_name: "+stu.getS_name()+" "); System.out.print(" s_sex: "+stu.getS_sex()+" "); System.out.println(" c_name : "+stu.getClasss().getC_name()+" "); } } } |
结果
- 按查询嵌套处理
Sql语句映射1
<select id="selectStudentClass" resultMap="StudentsClass"> select*from Students </select>
<resultMap type="com.master.Students" id="StudentsClass"> <association property="classs" column="c_id" javaType="com.master.Classs" select="com.master.Class.maapper.getClass"></association> </resultMap> |
SQL语句映射2
<select id="getClass" resultType="com.master.Classs"> select*from class_table where c_id=#{c_id} </select> |
其他不改变;
结果
一对多处理
Mybatis 一对多处理
数据库表结构
Students表
Class_table表
三、一对多处理的2种方法
1.按结果嵌套处理
实体类
student
private String s_id; private String s_name; private String s_sex; get set 略 |
Class
public class Classs { private String c_id; private String c_name; //一对多,一个班级对应多个学生所以用list private List<Students> students; get set 略 |
业务类
//一对多,返回应是一个Class对象 public Classs getClasss() throws IOException { SqlSession ss=MybatisUit.getSession(); Classs c=ss.selectOne("com.master.Class.mapper.getClass"); ss.close(); return c; } |
SQL映射
<select id="getClass" resultMap="ClassStudent"> select*from Students as s,class_table as c where s.c_id=c.c_id and c.c_id='002' </select> <resultMap type="com.master.Classs" id="ClassStudent"> <id column="c_id" property="c_id"/> <result column="c_name" property="c_name"/> <!—本例中 javatype指定的是Student对象的属性的类型,而oftype指定的是映射到list集合属性中Student的类型 --> <collection property="students" ofType="com.master.Students"> <id column="s_id" property="s_id"/> <result column="s_name" property="s_name"/> <result column="s_sex" property="s_sex"/> </collection> </resultMap> |
测试
public static void main(String[] args) throws IOException { ClassDao cd=new ClassDao(); Classs c=cd.getClasss(); List<Students> list=c.getStudents(); System.out.println("cid= "+c.getC_id()+" cname =" +c.getC_name()); for(Students stu:list) { System.out.println(stu); } } |
结果:
2.按查询嵌套处理
SQL语句映射
<select id="getClass" resultMap="ClassStudent"> select*from class_table where c_id='002' </select> <resultMap type="com.master.Classs" id="ClassStudent"> <id column="c_id" property="c_id"/> <!-- collection 此处column为关联对象的外键 --> <collection property="students" column="c_id" ofType="com.master.Students" select="com.master.Students.mapper.getStudents"></collection> </resultMap> |
<!-- 按查询嵌套处理 --> <select id="getStudents" resultType="com.master.Students"> select*from students where c_id=#{c_id} </select> |
测试类不改变