java - 如何在 mybatis 和 spring boot 中使用一对一映射?

标签 java spring spring-mvc spring-boot mybatis

在我的 Spring Boot 项目中,我使用 MyBatis。我想知道如何使用一对一映射以及如何为映射类创建 POJO。这是我使用过的 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)
);

POJO 是,

Language.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;
    }
}

最佳答案

您应该更改您的实体省份,包括语言属性,而不是重复它,如下所示:

    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;
        } 
    }

另一方面,您需要创建具有通过代码搜索的语言选择操作的映射器以及您应该绑定(bind)的省份的选择。您可以使用注释查看下一个示例:

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);

}

如您所见,有一个语言操作通过代码进行搜索,该操作在表省中链接。另一方面,当您搜索 Province 时,您的语言属性结果应调用链接两者的 Language findByCode 操作。我举了一个搜索所有省份或仅按 ID 的示例。

关于java - 如何在 mybatis 和 spring boot 中使用一对一映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37856666/

相关文章:

java - grails urlMappings dsl

java - 在 servlet (Java/Tomcat/Linux) 中使用我自己的类

java - 使用 Amazon SES 和 Spring Boot 发送电子邮件

java - 无法读取一次性 bean 中的 @Value 注释值

spring-mvc - 将 Redis/Spring Session 合并到我的应用程序中会阻止我部署该应用程序

java - java中的编译时库和运行时库有什么区别?

java - 当 JAR 没有包时 IntelliJ : How to use external JAR's as a library,

java - 保存后插入多对多表

java - 是否有异常(exception),可以让我处理用户尝试为 UUID 输入过多字符的情况?

spring-mvc - Apache Shiro + Spring MVC