mybatis 一對一關聯

木子小僧發表於2016-01-05

首先建表:

CREATE TABLE teacher(
    t_id INT PRIMARY KEY AUTO_INCREMENT, 
    t_name VARCHAR(20)
);
CREATE TABLE class(
    c_id INT PRIMARY KEY AUTO_INCREMENT, 
    c_name VARCHAR(20), 
    teacher_id INT
);
ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);    

INSERT INTO teacher(t_name) VALUES('LS1');
INSERT INTO teacher(t_name) VALUES('LS2');

INSERT INTO class(c_name, teacher_id) VALUES('bj_a', 1);
INSERT INTO class(c_name, teacher_id) VALUES('bj_b', 2);

再cn.beam包下,簡歷兩個Class類。分別是Classes.java和Teacher.java

public class Classes {
    private int id;
    private String name;
    private Teacher teacher;
}
public class Teacher {
    private int id;
    private String name;
}

然後分別構造方法,做get和set方法。

配置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="db.properties"/>

    <typeAliases>
        <typeAlias type="cn.bean.Classes" alias="Classes"/>
        <typeAlias type="cn.bean.Teacher" alias="Teacher"/>
    </typeAliases>
    <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="cn/test5/ClassMapper.xml"/>
    </mappers>
</configuration>

配置db.properties

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

配置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.test5.ClassMapper">
    <!-- 根據班級id查詢班級資訊(帶老師的資訊) -->
    <select id="getClass" parameterType="int" resultMap="classResultMap">
        SELECT * FROM class c ,teacher t WHERE c.c_id = t.t_id and c.c_id=#{id}
    </select>
    
    <resultMap type="Classes" id="classResultMap">
        <id property="id" column="c_id"/>
        <result property="name" column="c_name"/>
        
        <association property="teacher" javaType="Teacher">
            <id property="id" column="t_id"/>
            <result property="name" column="t_name"/>
        </association>
    </resultMap>
</mapper>

做一個utils

import java.io.InputStream;

import junit.framework.Test;

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtils {
    public static SqlSessionFactory getFactory(){
        String resource = "conf.xml";
        
        InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
        
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        
        return factory;
    }
}

做一個測試,測試結果:

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

import cn.bean.Classes;
import cn.utils.MyBatisUtils;

public class Test5 {
    @Test
    public void selectTeacherByCid(){
        SqlSessionFactory factory = MyBatisUtils.getFactory();
        SqlSession session = factory.openSession(true);
        String statement = "cn.test5.ClassMapper.getClass";
        Classes c = session.selectOne(statement, 1);
        System.out.println(c);
    }
}

結果如下:

Classes [id=1, name=bj_a, teacher=Teacher [id=1, name=LS1]]

相關文章