代码改变世界

mybatis 框架 的应用之四(一对一 与 一对多)

2017-02-15 00:32  甘雨路  阅读(271)  评论(0编辑  收藏  举报
lf-driver=com.mysql.jdbc.Driver
lf-url=jdbc:mysql://localhost:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8
lf-user=LF
lf-password=LF
<?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.zr.mybatismore.mapper.ClassTeamMapper">

    <!-- 一对多 通过班名字查询班里学生的信息 -->
    <resultMap type="cn.zr.mybatismore.entity.ClassTeam" id="classInfo">
        <id column="classid" property="classid"/>
        <result column="classname" property="classname"/>
        <collection property="students" ofType="cn.zr.mybatismore.entity.Student">
            <id column="idnum" property="idnum"/>
            <result column="name" property="name"/>
            <result column="age" property="age"/>
            <result column="classid" property="classid"/>
        </collection>
    </resultMap>
    <select id="queryStudetsByClassname" parameterType="java.lang.String" resultMap="classInfo">
        SELECT 
            c.classid,c.classname,s.idnum,s.name,s.age
        FROM
            class c
        INNER JOIN 
            student s
        ON
            s.classid = c.classid
        WHERE 
            c.classname = #{classname}
    </select>

        
    <!-- 一对多 通过多条查询语句来实现 -->
    <resultMap type="cn.zr.mybatismore.entity.ClassTeam" id="classTeamInfo">
        <id column="classid" property="classid"/>
        <result column="classname" property="classname"/>
        <collection property="students" ofType="cn.zr.mybatismore.entity.Student" column="classid" select="queryStudents">
            <id column="idnum" property="idnum"/>
            <result column="name" property="name"/>
            <result column="age" property="age"/>
            <result column="classid" property="classid"/>
        </collection>
    </resultMap>
    <select id="queryInfoByclassname"  parameterType="java.lang.String" resultMap="classTeamInfo">
        SELECT classid,classname FROM class WHERE classname=#{classname}
    </select>
   
   <select id="queryStudents" parameterType="int" resultType="cn.zr.mybatismore.entity.Student">
           SELECT idnum,name,age,classid FROM student WHERE classid = #{classid}
   </select>
       <!-- END 一对多 通过多条查询语句来实现 -->
   
   
</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="cn.zr.mybatismore.mapper.StudentMapper">
    
    <!-- 一对一  关系映射 -->
    <resultMap type="cn.zr.mybatismore.entity.Student" id="studentInfo">
        <id column="idnum" property="idnum"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <result column="classid" property="classid"/>
        <association property="classTeam" javaType="cn.zr.mybatismore.entity.ClassTeam">
            <id column="classid" property="classid"/>
            <result column="classname" property="classname"/>
        </association>
    </resultMap>
    
    <!-- 一对一(根据idnum查询学生的信息以及他所在的班级) -->
    <select id="queryStudentById" parameterType="int" resultMap="studentInfo">
        SELECT 
            s.idnum,s.name,s.age,s.classid,c.classname
        FROM
            student s INNER JOIN class c 
        ON
            s.classid = c.classid
        WHERE
             s.idnum = #{idnum}
    </select>
    
    
    <!-- 通过多查询来实现 一对一的效果 -->
    <resultMap type="cn.zr.mybatismore.entity.Student" id="stuInfo">
        <id column="idnum" property="idnum"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <result column="classid" property="classid"/>
        <association property="classTeam" javaType="cn.zr.mybatismore.entity.ClassTeam" column="classid" select="queryClassByClassId">
            <id column="classid" property="classid"/>
            <result column="classname" property="classname"/>
        </association>
    </resultMap>
    <select id="queryStuById" parameterType="int" resultMap="stuInfo">
        SELECT idnum,name,age,classid FROM student WHERE idnum = #{idnum}
    </select>
    
    <select id="queryClassByClassId" parameterType="int" resultType="cn.zr.mybatismore.entity.ClassTeam">
        SELECT classid,classname FROM class WHERE classid = #{classid}
    </select>
    <!-- END 通过多查询来实现 一对一的效果 -->

</mapper>
  
  
  
  
  
  
<?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>
    <properties resource="mybatis/config/db.properties"></properties>
    <!-- 配置环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 配置事务管理器的类型 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源相关的属性 -->
            <dataSource type="UNPOOLED">
                <property name="driver" value="${lf-driver}"/>
                <property name="url" value="${lf-url}"/>
                <property name="username" value="${lf-user}"/>
                <property name="password" value="${lf-password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--END 配置环境 -->
    
    <!-- 配置映射路径 -->
    <mappers>
        <mapper resource="mybatis/config/mapper/StudentMapper.xml"/>
        <mapper resource="mybatis/config/mapper/ClassTeamMapper.xml" />
    </mappers>
    <!-- END 配置映射路径 -->
    
</configuration> 
package cn.zr.mybatismore.entity;

import java.util.List;

public class ClassTeam {
    
    private int classid;
    private String classname;
    
    private List<Student> students;

    public int getClassid() {
        return classid;
    }

    public void setClassid(int classid) {
        this.classid = classid;
    }

    public String getName() {
        return classname;
    }

    public void setClassname(String classname) {
        this.classname = classname;
    }

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    public ClassTeam() {
    }

    public ClassTeam(int classid, String classname, List<Student> students) {
        this.classid = classid;
        this.classname = classname;
        this.students = students;
    }

    @Override
    public String toString() {
        return "ClassTeam [classid=" + classid + ", classname=" + classname
                + ", students=" + students + "]";
    }
    
    
    
}
package cn.zr.mybatismore.entity;

public class Student {
    
    private int idnum;
    private String name;
    private int age;
    private int classid;
    private ClassTeam classTeam;
    
    public ClassTeam getClassTeam() {
        return classTeam;
    }
    public void setClassTeam(ClassTeam classTeam) {
        this.classTeam = classTeam;
    }
    public int getIdnum() {
        return idnum;
    }
    public void setIdnum(int idnum) {
        this.idnum = idnum;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getClassid() {
        return classid;
    }
    public void setClassid(int classid) {
        this.classid = classid;
    }
    public Student() {
    }
    
    public Student(int idnum, String name, int age, int classid,
            ClassTeam classTeam) {
        this.idnum = idnum;
        this.name = name;
        this.age = age;
        this.classid = classid;
        this.classTeam = classTeam;
    }
    @Override
    public String toString() {
        return "student [idnum=" + idnum + ", name=" + name + ", age=" + age
                + ", classid=" + classid + ", classTeam=" + classTeam + "]";
    }
    
}
package cn.zr.mybatismore.mapper;

import java.util.List;

import cn.zr.mybatismore.entity.ClassTeam;

public interface ClassTeamMapper {

    /**
     * 根据班名查询班里学生的相关信息
     */
    List<ClassTeam> queryStudetsByClassname(String string);

    /**
     * 根据班名查询班里学生的相关信息(多语句来实现)
     */
    List<ClassTeam> queryInfoByclassname(String string);

}
package cn.zr.mybatismore.mapper;


import cn.zr.mybatismore.entity.Student;

public interface StudentMapper {

    /**
     * 通过id来查询学生信息以及所在班级
     */
    Student queryStudentById(int i);

    /**
     * 通过id来查询学生信息以及所在班级 (多查询)
     */
    Student queryStuById(int i);

    
    
}
package cn.zr.mybatismore.utils;

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

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionManager;

import cn.zr.mybatismore.entity.ClassTeam;
import cn.zr.mybatismore.entity.Student;
import cn.zr.mybatismore.mapper.ClassTeamMapper;
import cn.zr.mybatismore.mapper.StudentMapper;

public class TestMore {
    
    public static void main(String[] args) {
        TestMore testMore = new TestMore();
//        testMore.queryStudentById();
//        testMore.queryStuById();
        
        
//        testMore.queryStudetsByClassname();
        testMore.queryInfoByclassname();
    }
    
    private static SqlSessionManager sqlSessionManager ;
    private static StudentMapper studentMapper ;
    private static ClassTeamMapper classTeamMapper;
    //通过代码块来读取配置文件
    static{
        String resource = "mybatis/config/mybatis-config.xml";
        try {
            Reader reader = Resources.getResourceAsReader(resource);
            sqlSessionManager = SqlSessionManager.newInstance(reader);
            studentMapper = sqlSessionManager.getMapper(StudentMapper.class);
            classTeamMapper = sqlSessionManager.getMapper(ClassTeamMapper.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    
    /**
     * 通过id来查询学生信息以及所在班级
     */
    public void queryStudentById() {
        
        Student student = studentMapper.queryStudentById(10011);
        if (student==null) {
            System.out.println("操作失败");
        }else {
            System.out.println(student);
        }
    }
    
    /**
     * 通过id来查询学生信息以及所在班级 (多查询)
     */
    private void queryStuById() {
        Student student = studentMapper.queryStuById(10011);
        if (student==null) {
            System.out.println("操作失败");
        }else {
            System.out.println(student);
        }

    }
    
    /**
     * 根据班名查询班里学生的相关信息
     */
    public void queryStudetsByClassname() {
        List<ClassTeam> list = classTeamMapper.queryStudetsByClassname("一班");
        if (list.isEmpty()) {
            System.out.println("操作失败");
        }else {
            System.out.println(list);
        }
    }
    
    /**
     * 根据班名查询班里学生的相关信息(多语句来实现)
     */
    public void queryInfoByclassname() {
        List<ClassTeam> list = classTeamMapper.queryInfoByclassname("一班");
        if (list.isEmpty()) {
            System.out.println("操作失败");
        }else {
            System.out.println(list);
        }
    }
}