初识MyBatis
MyBatis框架及ORM
MyBatis框架简介
MyBatis是一个开源的数据持久层框架。
持久化是程序数据在瞬时状态和持久状态间转换的过程
它的其主要思想是将程序中的大量sql语句剥离出来,配置在配置文件中,实现SQL的灵活配置,它的好处就是将SQL与程序代码分类,可以在不修改程序代码的情况下,直接在配置文件中修改SQL语句。
MyBatis 的前身是iBatis,本是Apache的一个开源项目,2010年这个项目由Apache Software Foundation迁移到Google Code,并改名为MyBatis,2013年迁移到Github。
官方网站
http://mybatis.org
ORM框架
ORM(Object/Relational Mapping)即对象/关系映射,是一种数据持久化技术。
实体类和SQL语句之间建立映射关系
其特点
基于SQL语法,简单易学
能了解底层封装过程
SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
方便程序代码调试
使用MyBatis的开发步骤
下载mybatis-3.2.2.jar包并导入工程
编写MyBatis核心配置文件(configuration.xml)
创建实体类-POJO
DAO层-SQL映射文件(mapper.xml)
创建测试类
- 读取核心配置文件mybatis-config.xml
- 创建SqlSessionFactory对象,读取配置文件
- 创建SqlSession对象
- 调用mapper文件进行数据操作
MyBatis依赖包中文件说明
asm-3.3.1.jar:操作java字节码的类库
cglib-2.2.2.jar:用来动态集成java类或实现接口
commons-logging-1.1.1.jar:通用日志处理
javassist-3.17.1-GA.jar:分析、编辑和创建java字节码的类库
log4j-1.2.17.jar:日志系统
slf4j-api-1.7.5.jar:日志系统的封装,对外提系统统一的API接口
slf4j-log4j12-1.7.5.jar:slf4j对log4j的相应驱动,完成slf4j绑定log4j
MyBatis框架优缺点
优点
与JDBC相比,减少了50%以上的代码量
最简单的持久化框架,小巧并简单易学
SQL代码从程序代码中彻底分离,可重用
提供XML标签,支持编写动态SQL
提供映射标签,支持对象与数据库的ORM字段映射
缺点
SQL语句编写工作量大,对开发人员有一定要求
数据库移植性差
MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案,适用于性能要求较高或者需求多变的互联网项目
MyBatis-config.xml文件常用元素:
configuration:配置文件的根元素节点
properties:通过resource属性从外部指定properties属性文件,该属性文件描述数据库连接的相关配置(Driver,URL,用户名,密码)在resources目录下
settings:设置MyBatis运行中的一些行为
environments:表示配置MyBatis的多套运行环境,将SQL映射到不同的数据库上,可以配置多个,但是必须指定一个默认运行环境
environment:配置MyBatis的一套运行环境,需指定运行环境ID,事务管理,数据源配置
mappers:找SQL映射文件
mapper:mappers的子元素节点,具体指定sql映射文件的路径
(元素节点有顺序,不按顺序报错)
基本元素:
核心接口和类、
- SqlSessionFactoryBuilder
- SqlSessionFactory
- SqlSession
MyBatis核心配置文件(mybatis-config.xml)
SQL映射文件(mapper.xml)
SqlSessionFactoryBuilder的作用:
SqlSessionFactoryBuilder负责构建SqlSessionFactory,并且提供多个build()方法的重载
特点:
用过即丢,最佳范围存在于方法体内,局部变量
SqlSessionFactory
SqlSessionFactory是每个MyBatis应用的核心
作用:创建SqlSession实例(用openSession()方法获取)
生命周期:
一直存在,不建议多次创建,最佳作用域(Application)
SqlSession:(sqlSession.selectList()、sqlSession.getMapper(Mapper.class)调用接口方法)
用于执行持久化操作对象,类似于JDBC中的Connection
包含了执行SQL所需的所有方法
对应一次数据库会话,会话结束必须关闭
线程级别,不能共享
(在SqlSession里可以执行多次SQL语句,但一旦关闭了SqlSession就需要重新创建)
mybatis-config.xml配置顺序:
- configuration 配置
- properties 可以配置在java属性配置文件中
- settings 修改MyBatis在运行时的行为方式
- typeAliases 为Java类型命名一个别名
- typeHandlers 类型处理器
- objectFactory 对象工厂
- plugins 插件
- environments 环境
- environment 环境变量
- transactionManager 事务管理器
- dataSource 数据源
- mappers 映射器
SQL映射文件(*元素):
-
mapper:映射文件的根元素节点,只有一个属性(namespace命名空间)
-
用于区分不同的mapper,全局唯一
-
绑定DAO接口,面向接口编程(namespace命名必须跟接口同名)
-
cache:配置给定命名空间的缓存
-
cache-ref:从其他命名空间引用缓存配置
-
resultMap:用来描述数据库结果集和对象的对应关系
-
sql:可以重用的SQL块,也可以被其他语句引用
-
insert:映射插入语句
-
update:映射更新语句
-
delete:映射删除语句
select:映射查询语句
使用select完成单条件查询
id:命名空间中唯一的标识符
parameterType:查询语句传入参数的类型的完全限定名获别名,支持基本、复杂数据类型
resultType:查询语句返回结果类型的完全限定名获别名
parameterType:
基础数据类型
int、String、Date等
只能传入一个,通过#{参数名}即可获取传入的值
复杂数据类型
Java实体类、Map等
通过#{属性名}或者#{map的keyName}即可获取传入值
resultType :直接表示返回类型(手动映射)
- 基本数据类型
- 复杂数据类型
resultMap :对外部resultMap的引用(自动映射)
应用场景:
- 数据库字段信息与对象属性不一致
- 复杂的联合查询,*控制映射结果
(二者不能同时存在,本质上都是Map数据结构)
resultMap的基本配置:
- id:resultMap的唯一标识
- type:表示该resultMap的映射结果类型
association:一对多
- javaType:完整java类名或者别名
- property:映射到一个HashMap,应该指定javaType,确保所需行为
- peoperty:映射到数据库列的实体对象的属性
association的子元素:
- id。
-
result:
- property:映射数据库列的实体对象的属性
- column:数据库列名或别名
collection:(集合)
- ofType:完整java类名或者别名,即集合所包含的类型
- property:映射数据库的实体对象的属性
resultMap自动映射级别:
- NONE:禁止自动匹配
- PARTIAL(默认):自动匹配所有属性,有内部嵌套(association、collection)的除外
- FULL:自动匹配所有
MyBatis缓存:
- 一级缓存
- 二级缓存
- <settings>
- <setting name = “cacheEnabled” value=”true”/>
- </settings>
- <cache eviction="FIFO" flushInterval="60000"
- size="512" readOnly="true"/>
- <select id="selectAll" resultType="Emp"
- useCache="true">
动态SQL元素:
- if:利用if实现简单的条件选择
- choose(when,otherwise):相当于java中switch语句,通常与when和otherwise搭配
- where:简化SQL语句中where的条件判断
- set:解决动态更新语句
- trim:可以灵活地去掉多余的关键字
- foreach:迭代一个集合,通常用于in条件
trim属性:
- prefix:前缀,如where
- suffix:后缀
- prefixOverrides:对于trim包含内容的首部进行指定内容的忽略
- suffixOverrides:对于trim包含内容的首尾进行指定内容的忽略
foreach基本属性:
- item:表示集合中每一个元素进行迭代时的别名
- index:指定一个名称,用于表示迭代过程中,每次迭代到的位置
- open:表示该语句以什么开始
- separator:表示在每次进行迭代之间以什么符号作为分隔符(即in条件语句,必须以“,”作分隔符)
- close:表示语句以什么结束;
- collection:最关键并最容易出错的属性,属性值:
- 若入参为单参数类型是List,collection属性值为List;
- 若入参为单参数且参数类型是数组,collection属性值为array
- 若入参参数为多参数:封装为Map
MyBatis 框架优缺点:
优:
与JDBC相比,减少了50%以上代码量
小巧简单,易学
相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML中。从程序中彻底分离,降低耦合度,便于统一管理和优化,并可重用
提供XML标签,支持编写动态SQL语句
提供映射标签,支持对象与数据库的ORM字段关系映射
缺:
工作量大,对开发人员编写SQL语句功底有要求
依赖数据库,导致数据库移植性差,不能随便更换
适用场合:
需求变化较多的项目
增删改查关键代码:
- 添加:insert into 表名(列名) values()
- 删:delete from 表名 where id=。。。。
-
改:update 表名 set 列名=#{},列名=#{}
- where id=。。。。
-
查:select *
- from 表名
- inner join 表名 on x=x
- where
- group by
- order by
- limit 起始行,行数