2017-08-30 2 views
0

私はテーブル:Person(int (primary key), varchar, varchar, varchar)Skill(int (references to person id), varchar, integer)を持っています。テーブルからさまざまなタイプを取得し、myBatisを使用してマップします

Personテーブルには、カラムkindが含まれています。これは、人のタイプを示すvarcharです。異なるタイプの人は異なるスキルを持っています - だからSkillテーブル。いいえ、Javaクラスで抽象モデルPersonと具体的な種類があり、A,B,Cと呼ぶことができます。

mybatisでデータを取得する際に、実際のクラスインスタンスを作成してList <Pokemon>を返す必要があります。私はこの効果に到達する方法を知らない。私を助けてくれますか? PersonSkillと結合されるので、リスト内の異なるインスタンスは異なる属性を持つことに注意してください。

答えて

0

MyBatis ducuments MyBatis3 - Mapper XML Filesを読んでみましょう。 この種のO/Rマッパーでは、実際のモデルクラスを示すマ​​ッパーファイルを作成する必要があります。その後、テーブルを結合するためのいくつかの設定を記述する必要があります。設定された後、あなたがキーを持つ2つのテーブルを結合することができ

CREATE TABLE `person` (
    `id` INT(10) 
    , `first_name` VARCHAR(18) 
    , `last_name` VARCHAR(18) 
    , `kind` VARCHAR(1) 
    , `age` INT); 

CREATE TABLE `skill` (
    `id` INT(10) 
    , `person_id` INT(10) 
    , `desc` VARCHAR(200) 
); 

INSERT INTO `person`(`id`, `first_name`, `last_name`, `kind`, `age`) 
VALUES (1, 'John', 'Smith', 'E', 33) 
, (2, 'Jane', 'Smith', 'A', 24) 
, (3, 'Jonny', 'Smith', 'B', 55) 
, (4, 'J', 'J', 'T', 45) 
, (5, 'Alan', 'Turing', 'C', 4); 

INSERT INTO `skill`(`id`, `person_id`, `desc`) 
VALUES (1, 1, 'John Smith is Engineer') 
, (2, 2, 'Jane Smith is Artist') 
, (3, 3, 'Jonny Smith is Butcher') 
, (4, 4, 'J.J is Teacher') 
, (5, 5, 'Alan Turing is Computer'); 

DDL

私はあなたのテーブルの設定は、次のようなものですね。それはあなたのPokemonのリストです。

SELECT * FROM `person` p 
LEFT JOIN `skill` s 
ON s.person_id = p.id; 

SQLFiddleリンク→SQL Fiddle

私はあなたのperson_idは、レコードを一意に決めることができると信じて。

モデルクラス

Personクラス

// @Data <-- lombok can generate getter/setter easily 
public class Person { 
    private Integer id; 
    private String firstName; 
    private String lastName; 
    private String kind; // <-- it might be better to use enum 
    private Integer age; 
    // with getter/setter or annotations 
} 

スキルクラス

// @Data 
public class Skill { 
    private Integer id; 
    private Integer personId; 
    private String desc; 
    // with getter/setter or annotations 
} 

参加PersonSkillクラス

@Data 
public class PersonSkill { 
    private Integer id; 
    private String firstName; 
    private String lastName; 
    private String kind; 
    private Integer age; 
    private Integer skillId; 
    private String desc;  
} 

マッパーファイル

モデルクラスとして結果セットを保存するためのXML構成

PersonSkillMapper.xml

<?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="jp.gr.java_conf.hangedman.mybatis_join_sample.mappers.PersonSkillMapper"> 
    <resultMap id="personSkillResultMap" type="PersonSkill"> 
     <result property="id"  column="id" /> 
     <result property="firstName" column="first_name" /> 
     <result property="lastName" column="last_name" /> 
     <result property="kind"  column="kind" /> 
     <result property="age"  column="age" /> 
     <result property="skillId" column="skill_id" /> 
     <result property="desc"  column="desc" /> 
    </resultMap> 
    <select id="selectList" resultMap="personSkillResultMap"> 
     SELECT 
      p.* 
      , s.id AS skill_id 
      , s.desc AS desc 
     FROM `person` p 

     LEFT JOIN `skill` s 
     ON s.person_id = p.id 
    </select> 
</mapper> 

実行

public class App { 
    public static void main(String[] args) throws IOException { 
     try (InputStream in = App.class.getResourceAsStream("/mybatis-config.xml")) { 
      SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); 

      try (SqlSession session = factory.openSession()) { 

       List<PersonSkill> pskills = session 
         .selectList("jp.gr.java_conf.hangedman.mybatis_join_sample.mappers.PersonSkillMapper.selectList"); 
       for (PersonSkill ps : pskills) { 
        System.out.println(ps.toString()); 
       }   
      } 
     } 
    } 
} 

PS 変数属性を作成する場合は、Genericsを使用すると便利です。それを使用したい場合はコメントしてください。

関連する問題