MyBatisシリーズ:(7)一対のマルチマッピング

7575 ワード

0、SQL文の準備(mysql)
CREATE TABLE Cars(
    cid INT(5) PRIMARY KEY,
    cname VARCHAR(10)
);

CREATE TABLE Wheels(
    wid INT(5) PRIMARY KEY,
    wname VARCHAR(10),
    wcar_id INT(5),
    CONSTRAINT wheels_fk FOREIGN KEY(wcar_id) REFERENCES Cars(cid)
);

INSERT INTO Cars(cid,cname) VALUES(1,"BMW");
INSERT INTO Wheels(wid,wname,wcar_id) VALUES(1,' 1   ',1);
INSERT INTO Wheels(wid,wname,wcar_id) VALUES(2,' 2   ',1);
INSERT INTO Wheels(wid,wname,wcar_id) VALUES(3,' 3   ',1);
INSERT INTO Wheels(wid,wname,wcar_id) VALUES(4,' 4   ',1);

SELECT * FROM Cars;
SELECT * FROM Wheels;

SELECT c.cid,c.cname,w.wid,w.wname 
FROM cars c INNER JOIN wheels w ON c.cid=w.wcar_id

1、entityクラス
Car.java
package com.rk.entity;

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

public class Car {
    private Integer id;
    private String name;
    private List wheels = new ArrayList();
    
    public Car(){}

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List getWheels() {
        return wheels;
    }

    public void setWheels(List wheels) {
        this.wheels = wheels;
    }

    @Override
    public String toString() {
        return "Car [id=" + id + ", name=" + name + ", wheels=" + wheels + "]";
    }
    
}

Wheel.java
package com.rk.entity;

public class Wheel {
    private Integer id;
    private String name;
    private Car car;
    public Wheel(){}
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Car getCar() {
        return car;
    }
    public void setCar(Car car) {
        this.car = car;
    }
    @Override
    public String toString() {
        return "Wheel [id=" + id + ", name=" + name + "]";
    }
    
}

2、mybatisのマッピングファイル
CarMapper.xml

mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    
        
        
        
    
    


WheelMapper.xml

mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    
        
        
    
    

3、mybatisのメインプロファイル(マッピングファイルを導入)
mybatis.xml

configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

    
    
        
    
    
        
            
            
                
                
                
                
            
        
    
    
        
        
    

db.properties
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://127.0.0.1:3306/testdb
mysql.username=root
mysql.password=root

4、MyBatisUtils.java
package com.rk.utils;

import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;

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 MyBatisUtils {
    private static ThreadLocal threadLocal = new ThreadLocal();
    private static SqlSessionFactory sqlSessionFactory;
    static{
        try {
            Reader reader = Resources.getResourceAsReader("mybatis.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    
    private MyBatisUtils(){}
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = threadLocal.get();
        if(sqlSession == null){
            sqlSession = sqlSessionFactory.openSession();
            threadLocal.set(sqlSession);
        }
        return sqlSession;
    }
    
    public static void closeSqlSession(){
        SqlSession sqlSession = threadLocal.get();
        if(sqlSession != null){
            sqlSession.close();
            threadLocal.remove();
        }
    }
    
    public static void main(String[] args) {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        Connection conn = sqlSession.getConnection();
        System.out.println(conn);
    }
}

5、CarWheelDao.java
package com.rk.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.rk.entity.Car;
import com.rk.entity.Wheel;
import com.rk.utils.MyBatisUtils;

public class CarWheelDao {

    public Car findCarByWheelId(int wheelId){
        SqlSession sqlSession = null;
        try{
            sqlSession = MyBatisUtils.getSqlSession();
            Car car = sqlSession.selectOne("carNamespace.findCarByWheelId", wheelId);
            return car;
        }
        catch(Exception e){
            e.printStackTrace();
            sqlSession.rollback();
            throw new RuntimeException(e);
        }
        finally{
            MyBatisUtils.closeSqlSession();
        }
    } 
    
    public List findWheelsByCarName(String carName){
        SqlSession sqlSession = null;
        try{
            sqlSession = MyBatisUtils.getSqlSession();
            List list = sqlSession.selectList("wheelNamespace.findWheelsByCarName", carName);
            return list;
        }
        catch(Exception e){
            e.printStackTrace();
            sqlSession.rollback();
            throw new RuntimeException(e);
        }
        finally{
            MyBatisUtils.closeSqlSession();
        }
    }
    

    
    public static void main(String[] args) {
        CarWheelDao dao = new CarWheelDao();
        Car car = dao.findCarByWheelId(2);
        System.out.println(car);
        
        List wheels = dao.findWheelsByCarName("BMW");
        if(wheels != null && wheels.size()>0){
            for(Wheel wheel : wheels){
                System.out.println(wheel);
            }
        }
    }
}