`
Rempor
  • 浏览: 13604 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Mybatis 学习笔记

FAQ 
阅读更多

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 学习笔记”将带你深入理解 MyBatis 的核心概念和主要功能。 1. **MyBatis 概述**: MyBatis 是一个轻量级的 Java ORM(对象关系映射)框架,它的核心是 SQL 映射文件和 SqlSessionFactory。ORM 技术...

    MyBatis学习笔记1

    【标题】"MyBatis学习笔记1" 涉及的知识点主要集中在MyBatis这一流行的持久层框架上。MyBatis是一个优秀的Java ORM(对象关系映射)框架,它允许开发者将SQL查询与Java代码分离,使得数据库操作更加灵活且易于维护。...

    MyBatis学习笔记

    ### MyBatis学习笔记 #### 一、MyBatis简介及环境搭建 **MyBatis** 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis...

    MyBatis学习笔记.zip

    在"MyBatis学习笔记.zip"这个压缩包中,包含了四天的学习内容,分别以"MyBatis_day1"、"MyBatis_day2"、"MyBatis_day3"和"MyBatis_day4"命名,这些笔记可能详细阐述了MyBatis的核心概念和使用方法。让我们逐一解析...

    Mybatis学习笔记(狂神).md

    Mybatis学习笔记(狂神).md

    Mybatis学习笔记+学习源码.zip

    在本学习资源中,你将找到一份详尽的Mybatis学习笔记和源码,这将极大地助力你的学习过程,尤其是对自学者而言。这份笔记被认为是非常有价值且深入的,作者在其中倾注了大量的精力,确保了内容的全面性和实用性。 ...

    Mybatis学习笔记整合架构

    1.课程计划 第一天: 1、Mybatis的介绍 2、Mybatis的入门 a)使用jdbc操作数据库存在的问题 b)Mybatis的架构 c)Mybatis的入门程序 3、Dao的开发方法 a)原始dao的开发方法 ... 从入门学习到使用精通。

    Mybatis学习笔记

    本学习笔记是作者在大学期间深入学习Mybatis后的整理,旨在帮助初学者快速入门并掌握其核心概念与功能。 笔记共分为11个章节,涵盖Mybatis的基础到高级应用,以下是主要知识点的详细讲解: 1. **Mybatis简介**:...

    马士兵 mybatis学习笔记

    马士兵老师的MyBatis学习笔记主要涵盖了以下几个核心知识点: 1. **MyBatis安装与环境搭建**:首先,你需要配置Java开发环境,并了解Maven或Gradle构建工具,因为MyBatis通常与这些工具结合使用来管理依赖。然后,...

    mybatis学习笔记.md

    个人mybatis学习笔记,是个人学习后记录所得,记录内容仅供参考,如如果有什么不对的地方,欢迎指正。

    Mybatis学习笔记整理,全面详实,通俗易懂.md

    Mybatis学习笔记整理,全面详实,通俗易懂.md

    mybatis学习笔记LBY.pdf

    ### Mybatis学习笔记知识点 #### 1. Mybatis 相关概念 ##### 1.1 什么是 Mybatis Mybatis 是一款优秀的持久层框架,它支持普通的 SQL 查询、存储过程以及高级映射等功能。该框架简化了 JDBC 的使用,允许开发者以...

    mybatis学习笔记和相关帮助文档jar包

    标题中的“mybatis学习笔记”指的是对MyBatis框架的学习记录,通常包括基础概念、核心组件、配置文件解析、SQL映射文件的编写、动态SQL、事务管理、缓存机制等内容。学习笔记可能还会涵盖如何集成Spring框架实现依赖...

Global site tag (gtag.js) - Google Analytics