mybatis 多表关联查询的方式及缺点

一  什么是多变关联

1.所谓的多变关联,就是表结构中存在多对一,一对多的现象,当然也存在多对多。

2.在真正的工作中,经常存在多表关联的存在,就是说外键的存在。比如说:商品表goods,会关联一个分类表,将每个商品进行分类处理。

3.Bean类中的多变关联,作为分类表,应该存在有一个List对象来存放属于该分类的商品对象。而每个商品表中也应该有一个分类bean对象用于说明商品的分类信息

4.在JDBC的正常操作中,我们需要通过两次查询来依次存放数据来完成商品Bean,分类Bean对象,当然这使用MyBatis同样可以做到

5.在MyBatis中,提供了一些操作可以使我们在一次查询中将直接完成Bean

二 两种实现方式

我这里以查询作者和博客的例子为例:

1.创建实体类:

package com.baidu.mybatis207.model;

public class Author implements java.io.Serializable {

	private static final long serialVersionUID = 3888111443849552131L;
	private int tid;
	private String tname;
	private int age;
	private String gender;
	private String address;

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public int getTid() {
		return tid;
	}

	public void setTid(int tid) {
		this.tid = tid;
	}

	public String getTname() {
		return tname;
	}

	public void setTname(String tname) {
		this.tname = tname;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}
}

 

package com.baidu.mybatis207.model;

public class Blog implements java.io.Serializable {

	private static final long serialVersionUID = 571742602874294783L;
	private int id;
	private String title;
	private String content;
	private String createTime;
	//组合
    private Author author;
	public Author getAuthor() {
		return author;
	}

	public void setAuthor(Author author) {
		this.author = author;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String getCreateTime() {
		return createTime;
	}

	public void setCreateTime(String createTime) {
		this.createTime = createTime;
	}

}

2.创建mapper.xml

 方式一:



  
      
        
        
        
        

           
      
  
            
             
        
      
     
  

方式二: 



  
      
        
        
        
        
        
        
        
           
           
           
           
           
             
             
           
        
      
     
  

 

 

3.测试

package com.baidu.mybatis207.testdao;

import java.util.List;

import org.junit.Test;

import com.baidu.mybatis207.dao.BlogDao;
import com.baidu.mybatis207.model.Author;
import com.baidu.mybatis207.model.Blog;

public class TestBlogDao {
   private  static BlogDao blogDao = new BlogDao();
   @Test
   public void testQueryBlog() {
	  Blog blog = blogDao.queryBlogById(2); //blogid=2 author 1
	  if(blog!=null) {
		  System.out.println(blog.getId()+":"+blog.getTitle());
		  if(blog.getAuthor()!=null) {
			  Author author = blog.getAuthor();
			  System.out.println(author.getTid()+":"+author.getTname());
	  }
	  }
	  
   }
   @Test
   public void testQueryblogAndAuthor() {
	   List list = blogDao.queryBlogAndAuthor();
	   if(list!=null&&list.size()>0) {
		   for(Blog blog:list) {
			   System.out.println(blog.getId()+":"+blog.getTitle());
			   if(blog.getAuthor()!=null) {
				   System.out.println(blog.getAuthor().getTid()+":"+blog.getAuthor().getTname());
			   }
		   }
	   }
   }
} 

 

4.总结

        多表关联查询的方式有两种,一种方式先查询Author表,获取到id,再通过id从blog表中查询blog信息列表,这种方式要和数据库交互两次,发出两次sql语句,但是数据库返回的数据没有冗余;另一种方式是直接关联查询,只与数据库交互一次,只发出一次sql语句,但是数据库返回数据存在主表信息冗余,冗余数据为主表内容,冗余次数为从表中满足条件的记录数。 因此,应该选择哪一种方式更合理,需要根据具体的业务场景来选择,没有绝对的正确,只有相对的适合

 

 

你可能感兴趣的:(mybatis)