1. 程式人生 > >Mybatis學習筆記之多對一與一對多關係

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班