MyBatis学习总结
使用MyBatis的必要性:
- 与传统的JDBC代码相比,可以省掉百分之95的代码量
- MyBatis真正强大之处在于它的映射语句,XML(或者注解)的方式易于编写和应用
持久层的概念:
- 持久化:只是把数据存储在可掉电的存储介质上
- 持久层:可以把数据存储在磁盘上,具备长期存储的能力
JDBC实现:
使用JDBC存在的问题:
- 数据库链接创建,释放频繁造成系统资源浪费从而影响系统性能
- sql语句在代码中采用硬编码,造成代码不容易维护,实际应用sql变化很大,sql变动需要修改java代码
- 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,条统不易维护
- 对结果集解析存在硬编码(查询到名),sql变化导致解析代码变化,条统不易维护
解决方法:
- 采用ORM框架,应用程序不会直接访问底层数据库,而是以面向对象的方式来操作持久化对象
流行的ORM框架:
- JPA
- Hibernate
- MyBatis
Mybatis核心组件:
- SqlSessionFactoryBuilder(构造器):它会根据配置或者代码来生成SqlSessionFactory,采用的是分步构建的建造者模式。
- SqlSessionFactory(工厂接口):依靠宅来生成SqlSession,使用的是工厂模式。
- SqlSession(会话):一个既可以发送SQL执行返回结果,也可以获取Mapper的接口。在现有的技术中,一般我们会让其在业务逻辑代码中“消失”,而使用的是My Batis 提供的SQLMapper 接口编程技术,它能提高代码的可读性和可维护性o
- SQL Mapper(映射器):MyBatis 新设计存在的组件,它由一个Java接口和XML文件(或注解)构成,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果。
任用:
MyBatis配置文件结构:
属性:
properties:
setting:
typeAliases:
environment:
mapper
SQL映射文件常用元素:
- select:查询语句
- insert:插入语句
- update:更新语句
- delete:删除语句
- sql:可被其他语句引用的重用语句块
- cache 和 cache-ref: 命名空间的缓存配置引用
- resultMap:用来描述如何从数据库结果集中加载对象
元素 sql 和 resultMap 的使用:(有时候 resultMap 不行可以试试 resultType )
级联(三种):
- 一对一级联:比如身份证,每个人都是独一无二的一一对应的
- 一对多级联:比如手机对应手机号码,一部手机里面可以有很多个手机号码
-
多对多级联:(脑补吧)
-
一对多:
MyBatis的条件语句:(动态SQL)
-
if
-
choose:
-
trim:prefix属性代表的语句前级,prefixOverrides代表的是需要按需去掉的字符串
-
set:
- 在Hibernate中幸帝因为要更新某一对象,而发送所有的字段给持久对象。现实中的场景是,只想更新某一个字段,如果发送所有的属性去更新,对网络带宽消耗较大。性能最佳的办法是把主键和更新字段的值传递给SQL去更新。
- 在MyBatis中,幸帝可以使用set元素来避免这样的问题。
-
foreach:
- collection配置的是传递进来的参数名称,它可以是一个数组、List、Set等集合。
- item配置的是循环中当前的元素。
- index配置的是当前元素在集合的位置下标。
- open 和close配置的是以什么符号将这些集合元素包装起来。
- separator是各个元素的问隔符。
-
bind:(临时变量的作用)
- bind元素可以从OGNL表达式中创建一个自定义变量,这样更方便使用。
- bind元素的属性说明:name:自定义的变量名。value:变量的表达式。
MyBatis注解(去掉映射的对应xml文件,直接用注解的方式在Dao层写SQL)
-
@Results( id 方便于在别处使用)