`
luozhonghua2014
  • 浏览: 62376 次
文章分类
社区版块
存档分类
最新评论

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






分享到:
评论

相关推荐

    mybatis关联查询问题(一对多、多对一)

    在这个场景中,"mybatis关联查询问题(一对多、多对一)"是核心关注点,这涉及到数据库设计中的关系映射以及在Mybatis中如何处理这些关系。 1. **一对多关联**: 在数据库设计中,一对多关联是指一个表中的记录可以...

    Mybatis简单关系查询案例

    本案例主要探讨的是Mybatis中的简单关系查询,包括两种常见的处理方式:嵌套查询和嵌套结果,以及多对一查询的懒加载配置。 首先,我们来看嵌套查询,这是初学者在处理关联查询时最直观的方式。当我们在映射文件中...

    day66-mybatis面试题

    面试中可能会询问如何通过MyBatis进行SQL优化,包括使用合适的索引、避免N+1查询问题、合理使用缓存以及利用MyBatis提供的内置方法如foreach进行批量处理。 6. MyBatis与其他框架整合:MyBatis是一个轻量级的框架,...

    struts2,hibernate,mybatis验证码,分页

    - **性能**:分页时,避免一次性加载大量数据,而是采用懒加载策略,只加载当前页所需的数据,减少内存占用。 - **代码复用**:创建通用的分页Action和Service方法,以便在多个地方重用。 - **错误处理和日志**:...

    spring+myBatis架构

    在IT行业中,Spring和MyBatis是两个非常重要的框架,它们在构建企业级Java应用程序时起着关键作用。...在实际开发中,我们还需要关注性能优化,如使用缓存、避免N+1查询等问题,以提升系统的整体性能。

    大型SpringMVC,Mybatis,Redis,Solr,Nginx,SSM分布式电商项目视频教程

    - 多对多:@ManyToMany/@JoinTable。 5. **Mybatis缓存机制**: - 一级缓存:SqlSession级别的缓存。 - 二级缓存:SqlSessionFactory级别的缓存。 #### 三、Redis缓存系统实战 **Redis**是一个开源的键值存储...

    Spring+MyBatis

    通过分析流程,可以对查询进行诊断和改进,以达到进一步优化的目的。 总之,Spring+MyBatis的架构能够帮助开发者构建出既能满足高性能要求,又具备良好扩展性和维护性的企业级应用。在实际项目中,开发者应当根据...

    struts2,hibernate,spring,springmvc,mybatis

    国际化(i18n)则涉及如何支持多种语言,而防止重复提交是Web开发中的重要问题,Struts2提供了一种解决方案。 2. **Hibernate**:Hibernate是一个对象关系映射(ORM)框架,简化了数据库操作。`day57_hibernate_多...

    SSM框架下的一对多和多对一查询

    总的来说,SSM框架下的一对多和多对一查询是通过MyBatis的resultMap和相应的SQL语句来实现的,这使得我们可以方便地处理复杂的数据关系,提高了开发效率。同时,通过合理的数据库设计和查询优化,可以有效避免N+1...

    ibatis n+1选择问题 的几种解决方案

    在数据库查询优化中,"N+1 选择问题"是一个常见的性能瓶颈,特别是在使用ORM(对象关系映射)框架如iBATIS时。N+1问题发生在当我们执行一系列单独的SQL查询来获取关联数据,而不是一次性加载所有所需数据。这可能...

    SSM进阶(Spring+SpringMVC+Mybatis)

    分页是Web应用中常用的一种优化手段,可以有效地提高用户体验,避免一次性加载大量数据导致页面加载缓慢。实现分页通常需要在服务层处理分页逻辑,如计算总页数,然后在Mybatis的Mapper中编写对应的分页查询语句。 ...

    springmvc+mybatis初探

    在实际项目中,我们还需要考虑性能优化,如使用PageHelper分页插件,避免N+1查询,以及合理设计缓存策略等。 通过SpringMVC与MyBatis的整合,我们可以构建出一个清晰、高效的Web应用架构,使得开发者能更专注于业务...

    springmvc+mybatis企业应用实战

    7. **最佳实践**:学习如何优化SpringMVC和MyBatis的性能,如合理使用PageHelper进行分页,避免N+1查询问题,使用MyBatis的动态SQL提高SQL的灵活性,以及利用Spring的AOP实现事务管理。 8. **异常处理和日志记录**...

    管理系统系列--SSM(Spring+SpringMVC+Mybatis)新闻管理系统.zip

    例如,可以使用Spring Security进行权限控制,使用缓存提高数据访问效率,通过日志记录系统运行情况,以及通过i18n支持多语言环境。 总的来说,"管理系统系列--SSM(Spring+SpringMVC+Mybatis)新闻管理系统"是一个...

    springmvc+mybatis

    - **性能优化**:合理设计数据库表结构,避免 N+1 查询,使用缓存提高响应速度。 - **安全性**:对输入参数进行校验,防止 SQL 注入攻击,使用预编译的 SQL 语句(PreparedStatement)。 综上所述,Spring MVC 和...

    ssm优化后的jar包

    2. MyBatis的SQL优化:合理设计和使用预编译的SQL(PreparedStatement),避免N+1查询问题,使用JOIN替代多表查询以减少数据库交互次数。 3. SpringMVC中的拦截器(Interceptor):通过自定义拦截器,可以实现权限...

    struts2+spring+mybatis框架的代码生成工具

    4. **性能优化**:关注数据库查询性能,避免N+1查询,合理使用缓存,提升系统响应速度。 综上所述,SSM框架的代码生成工具是现代Java Web开发中的一大利器,它能有效地提高开发效率,降低项目成本,使开发者更加...

    ssm基于微信小程序加油服务系统论文ppt.rar

    【ssm基于微信小程序加油服务系统论文】\n\n本文主要探讨了如何使用SSM(Spring、SpringMVC、MyBatis)框架构建一个基于微信小程序的加油服务系统。SSM是一个广泛应用于Java Web开发的集成框架,它将Spring的核心...

    2024最新java-SSHM面试题整理.zip

    - MyBatis的缓存机制:一级缓存和二级缓存 5. **面试题常见问题** - 解释Spring的IoC和AOP概念并给出实际应用例子 - 描述一个完整的Struts 2请求处理流程 - Hibernate的懒加载和立即加载的区别,以及如何配置 ...

Global site tag (gtag.js) - Google Analytics