resultSets在学习Mybatis的过程中,应该或多或少的都会遇到一些问题,先整理如下。
Mybatis是什么,为什么使用?
答:MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs映射成数据库中的记录。使用的原因因为流行、简单、易维护优化、提高开发效率、开源、性能不错。
什么是N+1问题,如何解决?
使用Mapper XML配置的时候,查询一个list的结果集,需要执行N+1次SQL进行查询,如果数据量大的话,会带来很大的性能问题。
举例:
<resultMap id="blogResult" type="Blog">
<association property="author" column="author_id" javaType="Author" select="selectAuthor"/>
</resultMap>
<select id="selectBlog" resultMap="blogResult">
SELECT * FROM BLOG WHERE ID = #{id}
</select>
<select id="selectAuthor" resultType="Author">
SELECT * FROM AUTHOR WHERE ID = #{id}
</select>
Blog的结果集中需要执行selectAuthor来获取Author的属性。假设BLOG表有10条记录,每条记录对应AUTHOR表也有10条记录,那么执行blogResult查询,需要进行了1+10次查询。简而言之,原因是:
- 你执行一个SQL语句来获取结果(“+1”)的列表;
- 对于返回的每条记录,你执行了一个查询语句来为每个加载细节(在“N”);
解决办法:
- SQL使用连接查询;
- Mybatis在3.2.3以后,可以使用Association关联多个ResultSet;
例如:
定义存储过程如下
SELECT * FROM BLOG WHERE ID = #{id}
SELECT * FROM AUTHOR WHERE ID = #{id}
Mapper XML的配置中增加resultSets,如下
<select id="selectBlog" resultSets="blogs,authors" resultMap="blogResult">
{call getBlogsAndAuthors(#{id,jdbcType=INTEGER,mode=IN})}
</select>
配置resultMap的地方可以引用resultSets中的内容,如下
<resultMap id="blogResult" type="Blog">
<id property="id" column="id" />
<result property="title" column="title"/>
<association property="author" javaType="Author" resultSet="authors" column="author_id" foreignColumn="id">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="email" column="email"/>
<result property="bio" column="bio"/>
</association>
</resultMap>
如何处理“is-a”、“has-a”关系?
extends处理is-a;
association处理has-a;
collection处理has-many;
在Nested Select解决has-many的情况下,collection标签中,各个字段的理解?
<collection property="Java属性名" ofType="另一Java类名" javaType="ArrayList" column="关联主键ID(用于嵌套查询SQL语句传入参数,多个用逗号分开,必须和数据库列对应)" select="另一个select映射SQL的ID"/>
<select parameterType="int" resultType="另一Java类名" id="另一个select映射SQL的ID">
例如:
<resultMap type="org.demo.mybatis.po.Deptartment" id="deptResultMap">
<id column="dept_id" property="deptId" javaType="int" />
<result column="dept_name" property="deptName" javaType="string" />
<result column="dept_address" property="deptAddress" javaType="string" />
<!-- column是必填的,同时必须是数据库的列,关联SQL中的入参-->
<collection property="employees" column="dept_id" ofType="org.demo.mybatis.po.Employee" select="selectEmployeeForDept" />
</resultMap>
<!-- 嵌套的SQL语句将被多次执行 -->
<select id="selectEmployeeForDept" resultType="org.demo.mybatis.po.Employee">
select
e_id,
dept_id,
e_name
from employee
<!--any的值可以随意填写,但是必须写,同时不能使用${}取代,最好使用和colum对应的property,这里使用deptId提高可读性 -->
where dept_id = #{any}
</select>
#{..} vs ${...}?
#{…}是一个参数标记,而${…}只是简单的字符串替换。一般而言,为避免SQL注入攻击,传递参数应使用#{…}方式,因为这样MyBatis会处理好特殊字符转义的问题;但在SQL语句的某些地方,又不能使用#{…}方式。上述文档举出的例子是不能用这种方式指定表名,而根据我们的经验,在order by子句中也不能用这种方式。从中我们可以总结出:对于诸如表名、字段名(如order by子句后的排序字段)这些表本身或其字段的名字,和SQL关键字(如order by子句后的asc关键字),是不能使用#{…}方式的,而只能使用字符串替换的${…}方式。
官网:http://code.google.com/p/mybatis/wiki/faq
分享到:
相关推荐
这篇“mybatis 学习笔记”将带你深入理解 MyBatis 的核心概念和主要功能。 1. **MyBatis 概述**: MyBatis 是一个轻量级的 Java ORM(对象关系映射)框架,它的核心是 SQL 映射文件和 SqlSessionFactory。ORM 技术...
【标题】"MyBatis学习笔记1" 涉及的知识点主要集中在MyBatis这一流行的持久层框架上。MyBatis是一个优秀的Java ORM(对象关系映射)框架,它允许开发者将SQL查询与Java代码分离,使得数据库操作更加灵活且易于维护。...
### MyBatis学习笔记 #### 一、MyBatis简介及环境搭建 **MyBatis** 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis...
在"MyBatis学习笔记.zip"这个压缩包中,包含了四天的学习内容,分别以"MyBatis_day1"、"MyBatis_day2"、"MyBatis_day3"和"MyBatis_day4"命名,这些笔记可能详细阐述了MyBatis的核心概念和使用方法。让我们逐一解析...
Mybatis学习笔记(狂神).md
在本学习资源中,你将找到一份详尽的Mybatis学习笔记和源码,这将极大地助力你的学习过程,尤其是对自学者而言。这份笔记被认为是非常有价值且深入的,作者在其中倾注了大量的精力,确保了内容的全面性和实用性。 ...
1.课程计划 第一天: 1、Mybatis的介绍 2、Mybatis的入门 a)使用jdbc操作数据库存在的问题 b)Mybatis的架构 c)Mybatis的入门程序 3、Dao的开发方法 a)原始dao的开发方法 ... 从入门学习到使用精通。
本学习笔记是作者在大学期间深入学习Mybatis后的整理,旨在帮助初学者快速入门并掌握其核心概念与功能。 笔记共分为11个章节,涵盖Mybatis的基础到高级应用,以下是主要知识点的详细讲解: 1. **Mybatis简介**:...
马士兵老师的MyBatis学习笔记主要涵盖了以下几个核心知识点: 1. **MyBatis安装与环境搭建**:首先,你需要配置Java开发环境,并了解Maven或Gradle构建工具,因为MyBatis通常与这些工具结合使用来管理依赖。然后,...
个人mybatis学习笔记,是个人学习后记录所得,记录内容仅供参考,如如果有什么不对的地方,欢迎指正。
Mybatis学习笔记整理,全面详实,通俗易懂.md
### Mybatis学习笔记知识点 #### 1. Mybatis 相关概念 ##### 1.1 什么是 Mybatis Mybatis 是一款优秀的持久层框架,它支持普通的 SQL 查询、存储过程以及高级映射等功能。该框架简化了 JDBC 的使用,允许开发者以...
标题中的“mybatis学习笔记”指的是对MyBatis框架的学习记录,通常包括基础概念、核心组件、配置文件解析、SQL映射文件的编写、动态SQL、事务管理、缓存机制等内容。学习笔记可能还会涵盖如何集成Spring框架实现依赖...