您的位置:首页 > 其它

Mybatis高级映射结果集---xml配置---(一对多,多对一)

2017-11-24 11:37 471 查看
理论的知识我就不说了 官方文档 http://www.mybatis.org/mybatis-3/zh/
直接来案例

多个学生存在一个班级 ====》多对一

一个班级存在多个学生====》一对多

先在数据库中创建一个学生表 一个班级表  班级表中的主键是学生表中的外键

创建学生表的实例

package cn.easytop.lesson03.resultMap.xml;

//多对一
public class Student {
private int sid;
private String sname;
//查询学生带出班级
private Grade grade;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}


创建班级表的实例

package cn.easytop.lesson03.resultMap.xml;

import java.util.ArrayList;
import java.util.List;

public class Grade {
private int gid;
private String gname1;
//查出班级带出学生
List<Student> studentList=new ArrayList<Student>();
public int getGid() {
return gid;
}
public void setGid(int gid) {
this.gid = gid;
}

public String getGname1() {
return gname1;
}
public void setGname1(String gname1) {
this.gname1 = gname1;
}

public List<Student> getStudentList() {
return studentList;
}
public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}
@Override
public String toString() {
return "Grade [gid=" + gid + ", gname1=" + gname1 + "]";
}

}
 

创建mybatis的核心配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- mybatis的核心配置文件
1.数据库的连接的信息(连接池)
-->
<properties resource="oracle.properties"></properties>
<!-- 取别名 -->
<typeAliases>
<!-- 给此包下的所有的类取别名    默认别名为类名的首字母小写 -->
<package name="cn.easytop.lesson03.resultMap.xml"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!-- 事务管理器  默认使用jdbc事务 -->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driverClass}"/>
<property nam
4000
e="url" value="${url}"/>
<property name="username" value="${username1}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="cn/easytop/lesson03/resultMap/xml/GradeMapper.xml"/>
<mapper resource="cn/easytop/lesson03/resultMap/xml/StudentMapper.xml"/>
</mappers>
</configuration>

班级接口

package cn.easytop.lesson03.resultMap.xml;

import java.util.List;

public interface GradeMapper {
//常规查询
public List queryAllGrade();

//查询班级
public Grade queryGrade(String gid);

//学生带出班级
public Grade queryGradeByGid(String gid);
}

学生接口

package cn.easytop.lesson03.resultMap.xml;

import java.util.List;

public interface StudentMapper {

//查询学生
public Student queryStudent(String sid);

//班级带出学生
public List<Student> queryStudentByGid(String gid);
}
映射班级xml文件 GradeMapper.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.easytop.lesson03.resultMap.xml.GradeMapper">
<!-- 简单的结果集映射:
数据库的列名和实体类的属性名如果不一致 需要建立列名和属性名的映射关系
结果集映射返回的结果是相同的都是grade
-->
<!--
autoMapping="true"  默然是自动映射   属性名和列名一致
列和属性的关系  主键使用id标签   非主键使用result
-->
<resultMap type="grade" id="gradeMap" autoMapping="true">
<id column="gid" property="gid"></id>
<result column="gname" property="gname1"/>
</resultMap>
<select id="queryAllGrade" resultMap="gradeMap">
select * from grade
</select>

<resultMap type="grade" id="gradeOne" autoMapping="true">
<id column="gid" property="gid"></id>
<result column="gname" property="gname1"/>
<!--
resultMap="gradeOne" 查询出来的gid与数据库中的列名 column="gid" 自动映射(属性名与数据库名一致)
把gid传入select="cn.easytop.lesson03.resultMap.xml.StudentMapper.queryStudentByGid"
此方法中查询出结果与Student中的property="studentList"映射   并指定映射的类型 javaType="list"
-->
<collection property="studentList" column="gid" javaType="list"
select="cn.easytop.lesson03.resultMap.xml.StudentMapper.queryStudentByGid">
</collection>
</resultMap>

<!--
resultMap="gradeOne"  与标签<resultMap>中的id="gradeOne"映射
-->
<select id="queryGrade" resultMap="gradeOne">
select * from grade where gid=#{gid}
</select>

<!--
多对一
学生带出班级
-->
<select id="queryGradeByGid" resultMap="gradeMap">
select * from grade where gid=#{gid}
</select>
</mapper>


映射学生xml文件 StudentMapper.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">

<!--
namespace="cn.easytop.lesson03.resultMap.xml.StudentMapper" 与接口绑定

-->
<mapper namespace="cn.easytop.lesson03.resultMap.xml.StudentMapper">
<!--
多对一的映射结果集
autoMapping="true" 属性名与数据库中的列名一致自动映射
<id column="sid" property="sid"></id>   如果属性名是数据库中的主键 使用id标签
-->
<resultMap type="student" id="studentMap" autoMapping="true">
<id column="sid" property="sid"></id>
<!--
把 resultMap="studentMap" 的查询结果gid与数据库中的column="gid"映射(属性名与列名一致自动映射)
把gid传入到select="cn.easytop.lesson03.resultMap.xml.GradeMapper.queryGradeByGid">
此方法中查询出结果与Student中的grade映射
-->
<association property="grade" column="gid" select="cn.easytop.lesson03.resultMap.xml.GradeMapper.queryGradeByGid"></association>
</resultMap>

<!--
resultMap="studentMap"  与<resultMap>标签中的id="studentMap"映射
-->
<select id="queryStudent" resultMap="studentMap">
select * from student where sid=#{0}
</select>

<!--
一对多
班级带出学生
-->
<select id="queryStudentByGid" resultType="student">
select * from student where gid=#{0}
</select>
</mapper>
Test测试类
package cn.easytop.lesson03.resultMap.xml;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Test {
public static SqlSession getSession() throws IOException{
String resource = "cn/easytop/lesson03/resultMap/xml/mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//工厂类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession openSession = sqlSessionFactory.openSession();
//session操作的是 指向sql语句的一个唯一表示符
return openSession;
}
//常规查询
@org.junit.Test
public void testXmlInterface() throws IOException{
SqlSession session=getSession();
//获取FoodMapper的实现类
GradeMapper fm=session.getMapper(GradeMapper.class);
List<Grade> queryFood = fm.queryAllGrade();
System.out.println(queryFood);
}

/*
* 多对一 查询出学生带出班级
*
*/
@org.junit.Test
public void testManyToOne() throws IOException{
SqlSession session=getSession();
//获取FoodMapper的实现类
StudentMapper fm=session.getMapper(StudentMapper.class);
Student student = fm.queryStudent("1");
System.out.println(student.getSname()+"======="+student.getGrade().getGname1());
}

/*
* 一对多 查询出班级带出学生
*
*/
@org.junit.Test
public void testOneToMany() throws IOException{
SqlSession session=getSession();
//获取FoodMapper的实现类
GradeMapper fm=session.getMapper(GradeMapper.class);
Grade queryFood = fm.queryGrade("1");
for(Student s:queryFood.getStudentList()){
System.out.println(s.getSname());
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: