MyBatis框架学习总结

MyBatis框架学习总结

1.Mybatis介绍

一个优秀的基于java的持久层框架,内部封装了jdbc,使开发者只需要关心sql语句本身,而不需要花费经历在如何加载驱动,创建链接,创建statement等繁杂的过程, mybatis通过注解和xml配置的方式将要执行各种statement配置起来。并通过java对象和statement中的动态参数进行映射生成最终执行的sql语句
最后mybatis框架执行sql语句并将其封装为java对象返回采用ORM思想解决了实体与数据库映射的问题,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。

原始jdbc开发存在的问题如下:
1.数据库创建及频繁释放造成系统资源浪费
2.sql语句在代码中硬编码,实际运用中sql的变化较大,sql变动需要改变java代码
3.查询操作,需要手动将结果集里的数据封装到实体中,插入操作时,需要手动将实体的数据设置到sql语句的占位符

解决方案:

1.使用数据库连接池技术
2.使用xml配置的方式配置sql语句
3.使用反射内省的技术自动将实体和表进行属性与字段的自动映射

ORM(Object Relational Mapping)对象关系映射,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 ,即将程序中的对象自动的持久化到关系数据库中

ORM简介:

O(对象模型):
实体对象,即我们在程序中根据数据库表结构建立的一个个实体Entity。

R(关系型数据库的数据结构):

即我们建立的数据库表。

M(映射):

从R(数据库)到O(对象模型)的映射,可通过XML文件映射。
如图:当表实体发送变化时,ORM会帮助我们把实体的变化映射到数据库表。

在这里插入图片描述

作用

ORM框架自动实现Entity实体的属性与关系型数据库字段的映射。CRUD的工作则可以交给ORM来自动生成代码方式实现。隐藏了数据访问细节,“封闭”的通用数据库交互,他使得我们的通用数据库交互变得简单易行,并且完全不用考虑SQL语句。大大提高我们开发效率, 这样一来也减少我们维护一个复杂 缺乏灵活性数据访问层的成本。

2.一对一映射

1.嵌套结果

是关联的意思,常被用来表示(has-one)类型的关联。就是对象1里面关联另
一个对象2

<!-- 独立的Address封装映射 -->
<resultMap type="Address" id="AddressResult">
<id property="addrId" column="addr_id" />
<result property="street" column="street" />
<result property="city" column="city" />
<result property="state" column="state" />
<result property="zip" column="zip" />
<result property="country" column="country" />
</resultMap>
<!-- Student封装映射,里面关联上Address的封装映射 -->
<resultMap type="Student" id="StudentWithAddressResult">
<id property="studId" column="stud_id" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="dob" column="dob" />
<result property="phone" column="phone" />
<association property="address" resultMap="AddressResult" />
</resultMap>
<select id="selectStudentWithAddress" parameterType="int"
resultMap="StudentWithAddressResult">
select
s.stud_id, s.name, s.email,s.dob,s.phone,
a.addr_id, a.street, a.city, a.state, a.zip, a.country
from
students s
left outer join addresses a on s.addr_id = a.addr_id
where
stud_id = #{id}
</select>
2.嵌套查询
<!-- 独立的Address封装映射 -->
<resultMap type="Address" id="AddressResult">
<id property="addrId" column="addr_id" />
<result property="street" column="street" />
<result property="city" column="city" />
<result property="state" column="state" />
<result property="zip" column="zip" />
<result property="country" column="country" />
</resultMap>
<!-- 独立的select查询,专门查询Address -->
<select id="findAddressById" parameterType="int" resultMap="AddressResult">
select * from addresses
where addr_id=#{id}
</select>
<!-- Student封装映射,里面关联了查询address使用的select语句,并指定数据库表中的这个关联的外
键列的名字,这里是addr_id -->
<resultMap type="Student" id="StudentWithAddressResult">
<id property="studId" column="id" />
    <result property="name" column="name" />
<result property="email" column="email" />
<result property="dob" column="dob" />
<result property="phone" column="phone" />
<association property="address" column="addr_id" select="findAddressById" />
</resultMap>
<!-- 查询Student的select语句,这里不用写多表查询,因为对于address的关联查询,已经在上边定义
好了,并且在结果映射中关联进来了 -->
<select id="selectStudentWithAddress" parameterType="int"
resultMap="StudentWithAddressResult">
select
id,name,email,dob,phone,addr_id
from
students
where
id = #{id}
</select>

在此方式中, 元素的select属性被设置成了id为findAddressById的语句。
两个分开的SQL语句将会在数据库中分别执行,第一个通过id查询student信息,而第二个调用
findAddressById来加载address信息。
addr_id列的值将会被作为输入参数传递给selectAddressById语句作为参数进行条件查询。

总结对比:
嵌套结果
一条sql语句,查询出所有表中的数据,然后交给一个ResultMap去映射,这个ResultMap只负责映射
封装一部分数据,另一部分数据交给第二个ResultMap来映射,这个俩个ResultMap之间,使用标签
进行关联
例如,
嵌套查询
把之前一条sql语句,拆分成多条sql语句,每条sql语句只查询一张表并封装一部分数据,然后使用
标签 将多条sql语句关联起来,最后把结果合并起来就是完整的查询结果
例如,

3.一对多映射

标签可以用来将多行课程结果映射成一个课程Course对象的集合。

类似于一对多

4.多对多映射

参照一对多

5.动态(动态SQL是Mybatis强大的特性之一)

if

被用来通过条件嵌入SQL片段,如果条件为true,则相应地SQL片段将会被添加到SQL语句中。
假定有一个课程搜索界面,设置了讲师(Tutor)下拉列表框,课程名称(CourseName)文本输入框,
开始时间(StartDate)输入框,结束时间(EndDate)输入框,作为搜索条件,其中课讲师下拉列表是必
须选的,其他的都是可选的。

choose

有时候,查询功能是以查询 类别 为基础的。
例如,页面中有一个下拉列表,可以选择查询的类别,可以选择根据讲师查询、或者根据课程名查询、
或者根据时间查询等等,选择了列表之后,再输入关键字进行查询。

搭配使用

where

有时候,所有的查询条件应该是可选的。
在需要使用至少一种查询条件的情况下,可以直接使用WHERE子句,如果有多个条件,需要在条件中添
加AND或OR。

foreach

另外一个强大的动态SQL语句构造标签是
它可以迭代遍历一个数组或者集合,构造AND/OR条件或一个IN子句。
假设查询tutor_id为 1,3,6的讲师所教授的课程,我们可以传递一个tutor_id组成的列表给映射语句,然
后通过 遍历此列表构造动态SQL。

trim

元素和 元素类似,同时 提供了添加 前缀/后缀 或者 移除 前缀/后缀 的功能。

<select id="searchCourses" parameterType="map" resultMap="CourseResult">
SELECT * FROM COURSES
<trim prefix="WHERE" suffixOverrides="and">
<if test=" tutorId != null ">
TUTOR_ID = #{tutorId} and
</if>
<if test="courseName != null">
name like #{courseName} and
</if>
</trim>
</select>

prefix表示有一个if成立则插入where语句
suffix表示后缀,和prefix相反
suffixOverrides="and"表示如果最后生成的sql语句多一个and,则自动去掉.
prefixOverrides的意思是处理前缀,和suffixOverrides相反

set

元素和 元素类似,但是set元素只是针对update更新语句使用的。

<update id="updateStudent" parameterType="Student">
update students
<set>
<if test="name != null">name=#{name},</if>
<if test="email != null">email=#{email},</if>
<if test="phone != null">phone=#{phone},</if>
</set>
where id=#{studId}
</update>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值