Mybatis一對多與多對多

這次接着上次來,今天分享一對多以及多對多。

可能有的朋友看不下去,所以我先把一個巨大的坑告訴你們,免得走老路:

數據庫表的字段名千萬不要相同,屬性名最好也不要相同,比如Book和Author的主鍵不要都寫ID,分別寫爲BookID,AuthorID比較好,反正不能相同,不然會出現查詢不正確。

數據庫設計如下,Author和Book是一對多關係,數據庫設計如下所示:

Book表:

Author表:

再寫實體類:

public class Author {
    private int ID;
    private String AuthorName;
    private List<Book> books;
    //省略了getter和setter方法
}

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

public class Book {
    private int BookID;
    private String BookName;
    private Author author;
    //省略了getter和setter方法
}

配置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">
    <resultMap type="com.entity.Author" id="getAuthor">
        <id column="ID" property="ID"/>
        <result column="AuthorName" property="AuthorName"/>
        <!-- ofType="":指定關聯查詢的結果集中的對象類型即List中的對象類型 -->
        <collection property="books" ofType="com.entity.Book">
            <id column="BookID" property="BookID" />
            <result column="BookName" property="BookName"/>
        </collection>
    </resultMap>

    <select id="queryAuthor" resultMap="getAuthor" parameterType="int">
        select a.*,b.* from Author a left join Book b
        on a.ID=b.authorID 
        where a.ID=#{ID}
    </select>
</mapper>

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">   
</mapper>

記得一定要把這兩個文檔引進configuration.xml中

Test代碼:

public static void main(String[] args) {
        SqlSession session = null;
        try {
            InputStream inputStream = Resources.getResourceAsStream("configure/Configuration.xml");
            session = new SqlSessionFactoryBuilder().build(inputStream).openSession();
            Author author=session.selectOne("queryAuthor", 1);
            List<Book> books = author.getBooks();
            for (Book book : books) {
                System.out.println(book.getID()+" "+book.getName());
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (session!=null) {
                session.close();
            }
        }
    }

以上就完成了一對多。


接下來說說多對多,多對多需要一箇中間表,然後構成兩個一對多,構造中間表後就和一對多一致了。

先看數據庫設計,Order和Product是多對多關係,所以搞了箇中間表OrderDetail,就成了兩個一對多:

Product:

OrderDetail

Order:

先上實體類:

public class Order {
    private int OrderID;
    private String OrderName;
    private List<OrderDetail> orderDetails;
    //省略了getter和setter方法
}
==============================================
  public class OrderDetail {
    private int OID;
    private int PID;
    private Order order;
    private Product product;
    //省略了getter和setter方法
  }
==============================================
  public class Product {
    private int ProductID;
    private String ProductName;
    private List<OrderDetail> orderDetails;
    //省略了getter和setter方法
  }

配置xml文件:

Order.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="Order">

    <resultMap type="com.entity.Order" id="Order">
        <id column="OrderID" jdbcType="INTEGER" property="OrderID"/>
        <result column="OrderName" jdbcType="NVARCHAR" property="OrderName"/>
        <collection property="orderDetails" ofType="com.entity.OrderDetail" resultMap="OrderDetail.OrderDetail"/>
    </resultMap>

    <!-- 表名是關鍵字需要[] -->
    <select id="queryProdcutID" resultMap="Order" parameterType="int">
        select a.*,b.*,p.*
        from [Order] a 
        left join OrderDetail b
        on a.OrderID = b.OID
        left join Product p
        on B.PID = p.ProductID
        where a.OrderID=#{OrderID}
    </select>

</mapper>

OrderDetail.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="OrderDetail">

    <resultMap type="com.entity.OrderDetail" id="OrderDetail">
        <result column="OID" jdbcType="INTEGER" property="OID"/>
        <result column="PID" jdbcType="INTEGER" property="PID"/>
        <association property="product" javaType="com.entity.Product" >
            <id column="ProductID" property="ProductID"/>
            <result column="ProductName" property="ProductName"/>
        </association>
    </resultMap>

</mapper>

Product.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="Product">

</mapper>

以上就完成了所以的配置。

測試類:

public static void main(String[] args) {
        SqlSession sqlSession = null;
        try {
            InputStream inputStream = Resources.getResourceAsStream("configure/Configuration.xml");
            sqlSession = new SqlSessionFactoryBuilder().build(inputStream).openSession();
            Order order2 = (Order)sqlSession.selectOne("queryProdcutID",1);
            System.out.println(order2.getOrderName());
            List<OrderDetail> detail=order2.getOrderDetails();
            for (OrderDetail orderDetail : detail) {
                System.out.println(orderDetail.getProduct().getProductName());
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession = null;
            }
        }

    }

以上就完成了多對多配置。

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