mybatis性能优化二之多对多查询:用一次请求解决n次请求查询

简介: <resultMap type="com.cn.vo.Teacher" id="teacher"> <id property="id" column="id" javaType="int" jdbcType="INTEGER" /> <result property="name" column="name" javaType="string" j
<resultMap type="com.cn.vo.Teacher" id="teacher">
		<id property="id" column="id" javaType="int" jdbcType="INTEGER" />
		<result property="name" column="name" javaType="string"
			jdbcType="VARCHAR" />

	<!-- 	<collection property="students" column="t_s_id" ofType="com.cn.vo.Student">
			<id property="sid" column="sid" javaType="int" jdbcType="INTEGER" />
			<result property="sname" column="sname" javaType="string"
				jdbcType="VARCHAR" />
		</collection> -->
		
		<collection property="students" resultMap="studentResultMap" />
		<collection property="goods" resultMap="goodsResultMap" />
	</resultMap>
	
	<resultMap type="com.cn.vo.Student" id="studentResultMap">
	        <id property="sid" column="sid" javaType="int" jdbcType="INTEGER" />
			<result property="sname" column="sname" javaType="string" jdbcType="VARCHAR" />
	</resultMap>
 
	<resultMap type="com.cn.vo.GoodItem" id="goodsResultMap">
	        <id property="gid" column="gid" javaType="int" jdbcType="INTEGER" />
			<result property="goodName" column="goodName" javaType="string" jdbcType="VARCHAR" />
			<result property="price" column="price" javaType="float" jdbcType="FLOAT" />
			<result property="good_sid" column="good_sid" javaType="int" jdbcType="INTEGER" />
	</resultMap>
	

	<select id="one2many" parameterType="int" resultMap="teacher">
		<!-- select
		t.id,t.name,s.t_s_id,s.sid,s.sname
		from teacher t 
		left join student s on t.id = s.t_s_id 
		left join goodItem g on g.good_sid=s.t_s_id
		where t.id = #{id}  --> 
		select
		t.id,t.name,s.t_s_id,s.sid,s.sname,g.gid,g.goodname,g.price,g.good_sid
		from teacher t 
		left join student s on   t.id = s.t_s_id 
		left join goodItem g on  g.good_sid = s.sid
		where t.id = #{id}
    </select>  


以上是优化的结论:用一次请求解决n次请求查询

题目:在teacher 表中找到该 teacher下面的n个student并找出n个学生每个学生有多少个goods。

sql:

CREATE TABLE  teacher  (
   id number  NOT NULL  ,
  name varchar(100) DEFAULT NULL,
  PRIMARY KEY (id)
) ;


CREATE TABLE  student  (
  sid number  NOT NULL  ,
  sname varchar(100) DEFAULT NULL,
  t_s_id number  NOT NULL  ,
  PRIMARY KEY (sid) 
) ;

 insert into teacher(id,name) values(111,'zhangsan');
 insert into teacher(id,name) values(222,'lisi');
 insert into student(sid,sname,t_s_id) values(1,'xs1',111);
 insert into student(sid,sname,t_s_id) values(2,'xs2',111);
 insert into student(sid,sname,t_s_id) values(3,'xs3',222);
 insert into student(sid,sname,t_s_id) values(4,'xs4',111);
 
select * from student;
select * from teacher;


select t.id,t.name,s.t_s_id,s.sid,s.sname
		from teacher t 
    left join student s 
    on t.id = s.t_s_id where t.id = 111 
    
    
    create table goodItem(
     gid number not null,
     goodName varchar(10),
     price float,
     good_sid number
    )
    
    insert into goodItem(gid,Goodname,Price,Good_Sid)
    values(1,'iphone6','6000',2);
    insert into goodItem(gid,Goodname,Price,Good_Sid)
    values(2,'iphone5','5000',2);
    insert into goodItem(gid,Goodname,Price,Good_Sid)
    values(3,'iphone4','4000',2);
     insert into goodItem(gid,Goodname,Price,Good_Sid)
    values(4,'iphone3','3000',1);
    
    


vo:

package com.cn.vo;

public class Student {
	private int sid;
	private String sname;
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}

	 

}


package com.cn.vo;

import java.util.List;



public class Teacher {
	private int id;
	private String name;
	private List<Student> students;
	private List<GoodItem> goods;
	
	

	public List<GoodItem> getGoods() {
		return goods;
	}

	public void setGoods(List<GoodItem> goods) {
		this.goods = goods;
	}

	public int getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public List<Student> getStudents() {
		return students;
	}

	public void setStudents(List<Student> students) {
		this.students = students;
	}
}


package com.cn.vo;

public class Item {
	private  Integer  gid;
	private String goodName;
	private float price;
	private Integer good_sid;
	public Integer getGid() {
		return gid;
	}
	public void setGid(Integer gid) {
		this.gid = gid;
	}
	public String getGoodName() {
		return goodName;
	}
	public void setGoodName(String goodName) {
		this.goodName = goodName;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	public Integer getGood_sid() {
		return good_sid;
	}
	public void setGood_sid(Integer good_sid) {
		this.good_sid = good_sid;
	}
	
	
}


package com.cn.vo;

import java.util.List;

public class GoodItem extends Item{

/*	private List<Student> students;
	private List<Teacher> teachers;
	
	public List<Student> getStudents() {
		return students;
	}
	public void setStudents(List<Student> students) {
		this.students = students;
	}
	public List<Teacher> getTeachers() {
		return teachers;
	}
	public void setTeachers(List<Teacher> teachers) {
		this.teachers = teachers;
	}
	 */
	
	
}






目录
相关文章
|
3月前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
264 8
|
7天前
|
XML Java 数据库连接
Mybatis实现RBAC权限模型查询
通过对RBAC权限模型的理解和MyBatis的灵活使用,我们可以高效地实现复杂的权限管理功能,为应用程序的安全性和可维护性提供有力支持。
26 5
|
26天前
|
SQL Java 数据库连接
spring和Mybatis的各种查询
Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。
39 3
|
1月前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
33 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
79 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
2月前
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
90 1
|
3月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
5月前
|
Java 数据库连接 mybatis
Mybatis查询传递单个参数和传递多个参数用法
Mybatis查询传递单个参数和传递多个参数用法
83 11
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程