1.所谓的多变关联,就是表结构中存在多对一,一对多的现象,当然也存在多对多。
2.在真正的工作中,经常存在多表关联的存在,就是说外键的存在。比如说:商品表goods,会关联一个分类表,将每个商品进行分类处理。
3.Bean类中的多变关联,作为分类表,应该存在有一个List对象来存放属于该分类的商品对象。而每个商品表中也应该有一个分类bean对象用于说明商品的分类信息
4.在JDBC的正常操作中,我们需要通过两次查询来依次存放数据来完成商品Bean,分类Bean对象,当然这使用MyBatis同样可以做到
5.在MyBatis中,提供了一些操作可以使我们在一次查询中将直接完成Bean
我这里以查询作者和博客的例子为例:
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;
}
}
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());
}
}
}
}
}
多表关联查询的方式有两种,一种方式先查询Author表,获取到id,再通过id从blog表中查询blog信息列表,这种方式要和数据库交互两次,发出两次sql语句,但是数据库返回的数据没有冗余;另一种方式是直接关联查询,只与数据库交互一次,只发出一次sql语句,但是数据库返回数据存在主表信息冗余,冗余数据为主表内容,冗余次数为从表中满足条件的记录数。 因此,应该选择哪一种方式更合理,需要根据具体的业务场景来选择,没有绝对的正确,只有相对的适合