Spring Mvc那点事---(13)Spring Mvc之mybatis多表联合查询

     在系统开发中,经常会遇到多个表关联查询。关联查询有返回的结果有多种形式,一对一形式,一对多形式。接下来我们看看怎样使用mybatis进行关联表查询,在这一节中,我们会接触到以下几个关键字association,collection,resultMap,result等,请注意用法。

     首先我们创建两个表,skus表和category分类表,通过分类ID进行关联

CREATE TABLE `category` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `CategoryName` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8
 
CREATE TABLE `skus` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `SkuName` varchar(50) DEFAULT NULL,
  `SkuCode` varchar(50) DEFAULT NULL,
  `CategoryId` int(11) DEFAULT '0',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8

1.一对一查询

     首先我们定义一个实体类,查询商品信息,并获得商品所在的分类,每个商品只能属于一个分类。
    一对一查询主要用到association关键字
    
package dto;

public class skus {

	private int Id ;
	
	public int getId() {
		return Id;
	}

	public void setId(int id) {
		Id = id;
	}

	private String SkuName ;
	
	public String getSkuCode() {
		return SkuCode;
	}

	public void setSkuCode(String skuCode) {
		SkuCode = skuCode;
	}

	public String getSkuName() {
		return SkuName;
	}

	public void setSkuName(String skuName) {
		SkuName = skuName;
	}

	private String SkuCode;
	
	/**
	 * 定义分类属性
	 */
    private Category  category;

	public Category getCategory() {
		return category;
	}

	public void setCategory(Category category) {
		this.category = category;
	}
 
}
    mapper.xml配置
    
  <!-- 关联分类表查询商品和分类信息 -->
     <select id="getSkuList"  resultMap="skusResultMap">
     SELECT 
s.Id,
s.SkuName,
s.SkuCode,
c.Id,
c.CategoryName
FROM skus s INNER JOIN category  c ON s.categoryid=c.id
     
     </select>
     
     <resultMap type="dto.skus" id="skusResultMap">
     <id property="Id" column="Id"/>
     <result property="SkuName" column="SkuName"/>
      <result property="SkuCode" column="SkuCode"/>
      <association property="category" javaType="dto.Category">
             <id property="Id" column="Id"/>
            <result property="CategoryName" column="CategoryName"/>
        </association>
   
     </resultMap>
     resultMap表示返回的结果类型. Id表示主键,javaType表示对象返回类型

查询结果   
@RequestMapping(value="GetSkuList")
	public String GetSkuList()
	{
		   String resource = "/conf.xml";
	        //加载mybatis的配置文件
	        InputStream inputstream =this.getClass().getResourceAsStream(resource);
	       
	        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
	      
	        SqlSession session = sessionFactory.openSession();
	       
	        String statesql= "mapping.skusMapper.getSkuList";//在skusMapper.xml中有命名空间+方法名
	        
	       
	        java.util.List<skus> listResult= session.selectList(statesql);
	
           session.close();
	        
           for(dto.skus item:listResult)
           {
        	   System.out.println(item.getId()+"--"+item.getSkuCode()+"--"+item.getSkuName()+"--"+item.getCategory().Id+"--"+item.getCategory().CategoryName);
           
           }
          
	    	return "index";
		
	}

     2.一对多查询

          下面这个查询表示查询分类下的所有商品信息。使用collection来实现一对多的结果集查询
package dto;

import java.util.List;

public class Category {

	
	public int Id;
	
	public String CategoryName;

	public int getId() {
		return Id;
	}

	public void setId(int id) {
		Id = id;
	}

	public String getCategoryName() {
		return CategoryName;
	}

	public void setCategoryName(String categoryName) {
		CategoryName = categoryName;
	}
	
	
	//分类下的商品集合
	public List<skus> skuList;

	public List<skus> getSkuList() {
		return skuList;
	}

	public void setSkuList(List<skus> skuList) {
		this.skuList = skuList;
	}
}
    配置SQL
   
  <!-- 查询分类信息 -->
       <select id="getCateogy" resultMap="categoryResultMap" parameterType="int">
 SELECT 
c.Id,
c.CategoryName from
category  c
WHERE c.Id=#{Id}
       </select>
       
        <resultMap type="dto.Category" id="categoryResultMap">
     <id property="Id" column="Id"/>
     <result property="CategoryName" column="CategoryName"/>
      <collection  property="skuList" ofType="dto.skus" column="Id" select="getsinglesku" >
        </collection >
     </resultMap>
       <!-- ofType指定集合中的对象类型-->
       <select id="getsinglesku" parameterType="int" resultType="dto.skus">
        
SELECT s.Id,
s.SkuName,
s.SkuCode
FROM skus  s WHERE s.`CategoryId`=#{Id}
       </select>
    查询结果
   
@RequestMapping(value="GetCategory")
	public String GetCategory()
	{
		
		 String resource = "/conf.xml";
	        //加载mybatis的配置文件
	        InputStream inputstream =this.getClass().getResourceAsStream(resource);
	       
	        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
	      
	        SqlSession session = sessionFactory.openSession();
	       
	        String statesql= "mapping.skusMapper.getCateogy";//在skusMapper.xml中有命名空间+方法名
	        
	       //根据分类ID查询
	        Category dto= session.selectOne(statesql,6);
	
   
	        System.out.println(dto.getId()+"--"+dto.getCategoryName());
	        
        for(dto.skus item:dto.getSkuList())
        {
      
               System.out.println(item.getId()+"--"+item.getSkuCode()+"--"+item.getSkuName());
        
        }
       
	    	return "index";
	}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值