简体   繁体   English

如何使用Spring Boot在Mybatis中使用一对一映射?

[英]How could use one to one mapping in mybatis with spring boot?

In my Spring Boot project I am using MyBatis. 在我的Spring Boot项目中,我正在使用MyBatis。 I want to know how to use one to one mapping and how to created POJOs for the mapping classes. 我想知道如何使用一对一映射以及如何为映射类创建POJO。 This is the SQL dump I have used: 这是我使用的SQL转储:

CREATE TABLE IF NOT EXISTS LANG(
ID  BIGINT(10) NOT NULL AUTO_INCREMENT,     
CODE VARCHAR(3) UNIQUE,
NAME VARCHAR(150),
PRIMARY KEY (ID)
);

CREATE TABLE IF NOT EXISTS PROVINCE(
ID  BIGINT(10) NOT NULL AUTO_INCREMENT, 
CODE VARCHAR(10) UNIQUE,        
NAME VARCHAR(200),
LANG_CODE VARCHAR(3),
PRIMARY KEY (ID),
FOREIGN  KEY(LANG_CODE) REFERENCES LANG(CODE)
);

and POJOs are, 和POJO是

Language.java 语言.java

public class Language {

    private long id;

    private String code;

    private String name;

    public long getId() {
        return id;
    }

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

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

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

Province

public class Province {

    private long id;

    private String code;

    private String name;

    private String lang_code;

    public long getId() {
        return id;
    }

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

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

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

    public String getLang_code() {
        return lang_code;
    }

    public void setLang_code(String lang_code) {
        this.lang_code = lang_code;
    }
}

You should change your entity Province including Language property instead of repeat it, it would be as next: 您应该更改包含“语言”属性的实体“省”,而不是重复它,如下所示:

    public class Province {

        private long id;

        private Language language;

        public long getId() {
            return id;
        }

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

        public Language getLanguage() {
            return language;
        }

        public void setLanguage(Language language) {
            this.language = language;
        } 
    }

On other hand you need to create Mapper with a Language select operation searching by code and the select of province you should binding. 另一方面,您需要使用语言选择操作来创建Mapper,该操作通过代码和您应绑定的省份进行搜索。 You may look at the next example using annotations: 您可以使用注释查看下一个示例:

public interface MapperProvince {

    @Select("select * from PROVINCE")
    @Results({
        @Result(id=true, property = "id", column = "ID"),
        @Result(property="language", column="LANG_CODE",
        one=@One(select="com.example.MapperProvince.findByCode"))
      })
    public List<Province> findAll();

    @Select("select * from PROVINCE where ID = {id}")
    @Results({
        @Result(id=true, property = "id", column = "ID"),
        @Result(property="language", column="LANG_CODE",
        one=@One(select="com.example.MapperProvince.findByCode"))
      })
    public Province findById(long id);


    @Select("select * from LANGUAGE where CODE = {code}")
    @Results({
        @Result(id=true, property = "id", column = "id"),
        @Result(property = "code", column = "code"),
        @Result(property = "name", column = "name")
      })
    public Language findByCode(String code);

}

As you see, there is a Language operation searching by code which it is linked in Table Province. 如您所见,在Table Province中有一个语言操作,它通过代码进行搜索。 On other hand when you search Province your Result for language property should call the Language findByCode operation linking both. 另一方面,当您搜索“省”时,您的“语言”结果的属性应调用将两个链接都链接在一起的“语言” findByCode操作。 I have put an example searching all the Provinces or just by ID. 我举了一个搜索所有省份或仅按ID搜索的示例。

Setup using mybatis-spring-boot-starter ( https://github.com/mybatis/spring-boot-starter ) 使用mybatis-spring-boot-starter进行设置( https://github.com/mybatis/spring-boot-starter

LanguageMapper.java LanguageMapper.java

@Mapper
public class LanguageMapper{
   List<Language> queryLang();
}

LanguageMapper.xml LanguageMapper.xml

<select id="queryLang" resultType="Language">
   select id,
          code,
          name
   from LANG
</select>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM