這次接着上次來,今天分享一對多以及多對多。
可能有的朋友看不下去,所以我先把一個巨大的坑告訴你們,免得走老路:
數據庫表的字段名千萬不要相同,屬性名最好也不要相同,比如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;
}
}
}
以上就完成了多對多配置。