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"
			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;
	}
	 */

}
时间: 2024-09-02 21:27:20

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

mybatis性能优化之减少数据库连接

做性能优化的最重要的功能就是减少数据库的交互,很多程序员一般在开发的时候只考虑简单的实现功能,不管业务简单复杂,只要实现就行. mybatis有个重要的功能就是考虑在联合查询时技巧: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org

Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法_Android

前言: 最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来.所以决定抽空学习总结一下这方面的知识,以及分享一下我们是如何检测内存泄漏的.我们公司使用开源框架LeakCanary来检测内存泄漏. 什么是内存泄漏? 有些对象只有有限的生命周期.当它们的任务完成之后,它们将被垃圾回收.如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,这就会导致内存泄漏

AngularJS 性能优化二三事 【已翻译100%】

在过去的两年中,angularjs 的使用率有了很大的提升.简单的双向绑定是促使其流行的主要原因之一,但与此同时,它导致了在一个应用中出现了大量的 watcher.在后台,angularJS 会执行所谓的 "脏值检查".之所以要做脏值检查目的是为了检查在 "scope" 中的数据是否发生了变化;框架必须周期性的检测数据是否发生了变化- 脏值检查会每 40ms 更新一次.. 想想看.. 如果它需要检查超多数据的时候; Crap!! 让我们来看看如何改善 angular

SET STATISTICS IO和SET STATISTICS TIME 在SQL Server查询性能优化中的作用

原文:SET STATISTICS IO和SET STATISTICS TIME 在SQL Server查询性能优化中的作用 近段时间以来,一直在探究SQL Server查询性能的问题,当然也漫无目的的查找了很多资料,也从网上的大神们的文章中学到了很多,在这里,向各位大神致敬.正是受大神们无私奉献精神的影响,所以小弟也作为回报,分享一下关于SET STATISTICS IO和SET STATISTICS TIME这两条T_SQL命令,在查询优化性能中的作用.       首先我想说明一下这篇文章

HTTP/2 与 WEB 性能优化(三)

在连续写了两篇关于「HTTP/2 与 WEB 性能优化」的文章后,今天来写这个系列的最后一篇.在正式开始之前,我们先来简单回顾下之前两篇文章: 「HTTP/2 与 WEB 性能优化(一)」的结论是:HTTP/2 的 Server Push 机制,可以让重要的 JS.CSS 等资源尽快加载,从而不再需要 HTTP/1 中「将重要资源内联在页面头部」的优化方案了. 「HTTP/2 与 WEB 性能优化(二)」的结论是:HTTP/2 支持了多路复用,HTTP 连接变得十分廉价,之前为了节省连接数所采用

Mysql数据库性能优化三(分表、增量备份、还原)_MsSql

接上篇Mysql数据库性能优化二 对表进行水平划分           如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻辑上可以划分.一个好的划分依据,有利于程序的简单实现,也可以充分利用水平分表的优势.比如系统界面上只提供按月查询的功能,那么把表按月拆分成12个,每个查询只查询一个表就够了.如果非要按照地域来分,即使把表拆的再小,查询还是要联合所有表来查,还不如不拆了.所以一个好的拆分依据

19个MySQL性能优化要点解析_Mysql

以下就是跟大家分享的19个MySQL性能优化主要要点,一起学习学习. 1.为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了. 这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的.因为,我们某些查询语句会让MySQL不使用缓存.请看下面的示例: // 查询缓存不开启 $r = mysq

Mysql数据库性能优化三(分表、增量备份、还原)

接上篇Mysql数据库性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻辑上可以划分.一个好的划分依据,有利于程序的简单实现,也可以充分利用水平分表的优势.比如系统界面上只提供按月查询的功能,那么把表按月拆分成12个,每个查询只查询一个表就够了.如果非要按照地域来分,即使把表拆的再小,查询还是要联合所有表来查,还不如不拆了.所以一个好的拆分依据是 最重要的.关键字

【原创】Python 之快速性能优化(第二部分)

本文为翻译,原文地址:< Quick Python Performance Optimization: Part II >  This is the Part II of Quick Python Performance Optimizations. 本文是 Python 性能优化二两发的第二部分.  11. Use Map, Reduce and Filter instead of for loop where ever possible. 11. 尽可能使用 Map,Reduce 和 Fi