MyBatis註解之多對多
阿新 • • 發佈:2020-10-25
MyBatis註解之多對多
準備Mapper
- ProductMapper中追加get方法:
@Select("select * from product_ where id = #{id}")
public Product get(int id);
點選檢視完整ProductMapper
package com.nyf.mappers;
import java.util.List;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import com.nyf.pojo.Product;
public interface ProductMapper {
@Select(" select * from product_ where cid = #{cid}")
public List listByCategory(int cid);
@Select(" select * from product_ ")
@Results({
@Result(property="category",column="cid",one=@One(select="com.nyf.mappers.CategoryMapper.get2"))
})
public List listManyToOne();
@Select("select * from product_ where id = #{id}")
public Product get(int id);
}
- 新建OrderItemMapper,新增一個listByOrder方法,如下:
@Select(" select * from order_item_ where oid = #{oid}")
@Results({
@Result(property="product",column="pid",one=@One(select="com.nyf.mappers.ProductMapper.get"))
})
public List<OrderItem> listByOrder(int oid);
點選檢視完整
package com.nyf.mappers;
import java.util.List;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import com.nyf.pojo.OrderItem;
public interface OrderItemMapper {
@Select(" select * from order_item_ where oid = #{oid}")
@Results({
@Result(property="product",column="pid",one=@One(select="com.nyf.mappers.ProductMapper.get"))
})
public List listByOrder(int oid);
}
- 新增OrderMapper,提供list方法,這裡會與OrderItem建立一對多關係,如下所示:
@Select("select * from order_") @Results({ @Result(property = "id", column = "id"), @Result(property = "orderItems", javaType = List.class, column = "id", many = @Many(select = "com.how2java.mapper.OrderItemMapper.listByOrder")) }) public List<Order> list();
點選檢視完整OrderMapper
package com.nyf.mappers;
import java.util.List;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import com.nyf.pojo.Order;
public interface OrderMapper {
@Select("select * from order_")
@Results({
@Result(property = "id", column = "id"),
@Result(property = "orderItems", javaType = List.class, column = "id",
many = @Many(select = "com.how2java.mapper.OrderItemMapper.listByOrder"))
})
public List list();
}
修改配置檔案
- 修改mybatis-config.xml,新增Mapper類的對映,如下所示:
<mapper class="com.nyf.mappers.OrderItemMapper"/>
<mapper class="com.nyf.mappers.OrderMapper"/>
點選檢視完整mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- environments配置要連線的資料庫 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/nyf?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- mappers,指明實體類對應的配置檔案 -->
<mappers>
<mapper class="com.nyf.mappers.CategoryMapper"/>
<mapper class="com.nyf.mappers.ProductMapper"/>
<mapper class="com.nyf.mappers.OrderItemMapper"/>
<mapper class="com.nyf.mappers.OrderMapper"/>
</mappers>
</configuration>
編寫測試類ManyToMany
點選檢視完整ManyToMany
package com.nyf.tests;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.nyf.mappers.OrderMapper;
import com.nyf.pojo.Order;
import com.nyf.pojo.OrderItem;
import com.nyf.pojo.Product;
public class ManyToMany {
public static void main(String[] args) throws IOException {
String resource = "com/nyf/config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
listOrder(session);
session.commit();
session.close();
}
private static void listOrder(SqlSession session) {
OrderMapper mapper =session.getMapper(OrderMapper.class);
List os = mapper.list();
for (Order o : os) {
System.out.println(o.getCode());
List ois= o.getOrderItems();
if(null!=ois){
for (OrderItem oi : ois) {
System.out.format("\t%s\t%f\t%d%n", oi.getProduct().getName(),oi.getProduct().getPrice(),oi.getNumber());
}
}
}
}
}
結果驗證
- 正確結果一個如下所示:
code000A
product a 88.879997 100
product b 88.879997 100
product c 88.879997 100
code000B
product b 88.879997 100
product c 88.879997 100
product x 88.879997 100