Mybatis之一對一關聯關係

今天分享的是一對一關聯關係查詢。

我們先設計數據庫,由於爲了方便後面的一對多關係,這裏假設作者和書是一對一關聯關係。

Book表:

Author表:

再來創建實體類:

public class Author {
    private int ID;
    private String AuthorName;  

    public int getID() {
        return ID;
    }

    public void setID(int iD) {
        ID = iD;
    }

    public String getName() {
        return AuthorName;
    }

    public void setName(String name) {
        AuthorName = name;
    }

    public Author(int iD, String name) {
        super();
        ID = iD;
        AuthorName = name;
    }

    public Author() {
        // TODO Auto-generated constructor stub
    }
}

=========================================================

  public class Book {
    private int ID;
    private String Name;
    private Author author;  

    public Author getAuthor() {
        return author;
    }

    public void setAuthor(Author author) {
        this.author = author;
    }

    public int getID() {
        return ID;
    }

    public void setID(int iD) {
        ID = iD;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public Book(int iD, String name) {
        super();
        ID = iD;
        Name = name;
    }

    public Book() {
    }
}

實體類創建後配置xml文件

Author.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="Author">
</mapper>

由於查詢都在Book.xml裏面配置了,所以Author.xml就不用配置了。

Book.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="Book">
    <!-- 方法一  嵌套結果 使用嵌套結果映射來處理重複的聯合結果的子集封裝聯表查詢的數據(去除重複的數據)-->
    <select id="queryBookName" parameterType="int" resultMap="getBookMap">
        select a.*,b.*
        from Book b,Author a
        where a.ID=b.authorID AND a.ID=#{ID}
    </select>

    <resultMap type="com.entity.Book" id="getBookMap">
        <id column="ID" property="ID" />
        <result column="Name" property="Name"/>
        <association property="author" javaType="com.entity.Author">
            <id column="ID" property="ID"/>
            <result column="AuthorName" property="AuthorName"/>
        </association>
    </resultMap>


    <!-- 方法二  嵌套查詢:通過執行另外一個SQL映射語句來返回預期的複雜類型 -->
    <select id="queryBookName2" parameterType="int" resultMap="getBookMap2">
        select b.ID,b.Name,b.authorID from Book b where b.ID=#{ID}  
    </select>

    <!-- select中的字段名必須與實體類中的名字對應 即此處字段AuthorName 
    那麼實體中必須爲字段名,或者將字段名改爲實體中屬性名,否則出錯 -->
    <select id="getAuthor" parameterType="int" resultType="com.entity.Author">
        select a.ID ,a.AuthorName from Author a where a.ID=#{authorID} 
    </select>

    <resultMap type="com.entity.Book" id="getBookMap2">
        <id column="ID" property="ID" />
        <result column="Name" property="Name"/>
        <association property="author" select="getAuthor" column="authorID">
        </association>
    </resultMap>

</mapper>

記得要將這兩個xml文件放入configuration文件中。

最後測試代碼:

public class AssociationTest {
    public static void main(String[] args) {
        SqlSession session = null;
        try {
            InputStream inputStream = Resources.getResourceAsStream("configure/Configuration.xml");
            session = new SqlSessionFactoryBuilder().build(inputStream).openSession();
            Book book = session.selectOne("queryBookName", 1);
            System.out.println(book.getAuthor().getID()+" "+book.getAuthor().getName());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (session!=null) {
                session.close();
            }
        }
    }
}

以上就完成了一對一關聯關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章