Mybatis学习笔记之多对一与一对多关系

Mybatis一对多关系

一、数据库与数据表的建立

学生与班级是一对多的关系,首先创建一个学生表

create table tb_student(
    -> id int not null auto_increment,
    -> name varchar(10),
    -> sex bool default true,
    -> age int,
    -> address varchar(100),
    -> telphone varchar(100),
    -> classmateid int not null,
    -> primary key(id)
    -> );

添加学生信息

insert into tb_student(name,age,address,telphone) values('张三丰',108,'武当山','13262183425');
insert into tb_student(name,age,address,telphone) values('张无忌',24,'光明顶','13423678543');

其次,创建班级表

create table tb_classmate(
    -> id int not null auto_increment,
    -> name varchar(20),
    -> primary key(id)
    -> );

添加测试数据

insert into tb_classmate(name) values('武功速成171班');

二、创建Java项目

1.配置数据库连接信息

1)mybatis-config.xml文件,内容如下:

<?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="msqldatasource.properties"/>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--
        <mapper resource="com/sky/demo/dao/AccountMapper.xml" />
        -->
        <package name="com.sky.dao"/>
    </mappers>
</configuration>

数据库连接信息msqldatasource.properties内容如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisstudy
username=root
password=123456

三、创建Java bean

1.Student.java内容如下

public class Student {
    private int id;
    private String name;
    private boolean sex;
    private int age;
    private String address;
    private String telphone;
    private int classmateid;
      private ClassMate classMate;
  //省略其setter和getter方法
}

2.ClassMate.java内容如下:

public class ClassMate {
    private int id;
    private String name;
      private List<Student> students;
  //省略其setter和getter方法
}

四、创建数据访问层

1.创建Student数据访问层接口

package com.sky.dao;

import com.sky.bean.Student;

import java.util.List;

public interface StudentMapper {
    /**
     * 根据班级编号取得所有的学生信息
     * @param id 班级编号
     * @return
     */
    public List<Student> getStudentsByClassMateId(int id);
}

2.创建Student的SQL映射

<?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="com.sky.dao.StudentMapper">
    <resultMap id="studentMap" type="com.sky.bean.Student">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="sex" property="sex"/>
        <result column="age" property="age"/>
        <result column="address" property="address"/>
        <result column="telphone" property="telphone"/>
    </resultMap>

    <select id="getStudentsByClassMateId" resultMap="studentMap">
        select * from tb_student where classmateid = #{id}
    </select>

</mapper>

3.创建ClassMate数据访问层接口

package com.sky.dao;

import com.sky.bean.ClassMate;

public interface ClassMateMapper {
    /**
     * 根据班级id取得班级的信息
     * @param id 班级id
     * @return 返回该班级的信息
     */
    public ClassMate getClassMateById(int id);
}

4.创建ClassMate的SQL映射

<?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="com.sky.dao.ClassMateMapper">
    <resultMap id="classMateMap" type="com.sky.bean.ClassMate">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <collection property="students" column="id" ofType="Student"
                    select="com.sky.dao.StudentMapper.getStudentsByClassMateId">
        </collection>
    </resultMap>

    <select id="getClassMateById" resultMap="classMateMap">
        select * from tb_classmate where id = #{id}
    </select>

</mapper>

此是一对多关系的实现,在ClassMate的映射中,

<collection property="students" column="id" ofType="Student"
                    select="com.sky.dao.StudentMapper.getStudentsByClassMateId">
        </collection>

为取得学生表中的信息,其中property的值与ClassMateMapper.java中的属性名相同,column的值,因为取得学生信息,是根据班级表的id信息取得的,所以此处的值为 id,select的值,注意要写全类名,否则,会找不到相应的映射信息。

最后,执行结果如下:

package com.sky;

import com.sky.bean.ClassMate;
import com.sky.dao.ClassMateMapper;
import com.sky.util.DBUtil;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class MyDemo1 {
    public static void main(String[] args) {
        SqlSession session=DBUtil.getSession();

        ClassMateMapper mateMapper=session.getMapper(ClassMateMapper.class);

        ClassMate classMate=mateMapper.getClassMateById(1);
        System.out.println(classMate.toString());

    }
}

ClassMate{id=1, name='武功速成171班', students=[Student{id=1, name='张三丰', sex=true, age=108, address='武当山', telphone='13262183425', classmateid=1, classMate=null}, Student{id=2, name='张无忌', sex=true, age=24, address='光明顶', telphone='13423678543', classmateid=1, classMate=null}]}

五、多对一的关系

1.修改Student的接口与映射文件

package com.sky.dao;

import com.sky.bean.Student;

import java.util.List;

public interface StudentMapper {
    /**
     * 根据班级编号取得所有的学生信息
     * @param id 班级编号
     * @return
     */
    public List<Student> getStudentsByClassMateId(int id);

    /**
     *  根据学生编号取得学生信息
     * @param id 学生编号
     * @return 学生信息
     */
    public Student getStudentById(int id);
}

<?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="com.sky.dao.StudentMapper">
    <resultMap id="studentMap" type="com.sky.bean.Student">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="sex" property="sex"/>
        <result column="age" property="age"/>
        <result column="address" property="address"/>
        <result column="telphone" property="telphone"/>
        <association property="classMate" column="classmateid"
                     select="com.sky.dao.ClassMateMapper.getClassMateById">
        </association>
    </resultMap>

    <select id="getStudentsByClassMateId" resultMap="studentMap">
        select * from tb_student where classmateid = #{id}
    </select>

    <select id="getStudentById" resultMap="studentMap">
        select * from tb_student where id=#{id}
    </select>
</mapper>

运行结果如下:

package com.sky;

import com.sky.bean.ClassMate;
import com.sky.bean.Student;
import com.sky.dao.ClassMateMapper;
import com.sky.dao.StudentMapper;
import com.sky.util.DBUtil;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class MyDemo1 {
    public static void main(String[] args) {
        SqlSession session=DBUtil.getSession();

        StudentMapper studentMapper=session.getMapper(StudentMapper.class);


        Student stu=studentMapper.getStudentById(1);

        ClassMate classMate=stu.getClassMate();

        System.out.println(stu.getName()+"\t"+stu.getAge()+"\t"+stu.getAddress());
        System.out.println(classMate.getName());
        /*
        ClassMateMapper mateMapper=session.getMapper(ClassMateMapper.class);

        ClassMate classMate=mateMapper.getClassMateById(1);
        System.out.println(classMate.toString());
        */

    }
}

张三丰    108 武当山
武功速成171班

猜你喜欢

转载自my.oschina.net/u/3537796/blog/1836705