1. 程式人生 > 實用技巧 >MyBatis註解之多對多

MyBatis註解之多對多

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