欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

初识MyBatis

程序员文章站 2022-03-03 12:13:24
MyBatis框架及ORM MyBatis框架简介 MyBatis是一个开源的数据持久层框架。 持久化是程序数据在瞬时状态和持久状态间转换的过程 它的其主要思想是将程序中的大量sql语句剥离出来,配置在配置文件中,实现SQL的灵活配置,它的好处就是将SQL与程序代码分类,可以在不修改程序代码的情况下 ......

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)
创建测试类

  1. 读取核心配置文件mybatis-config.xml
  2. 创建SqlSessionFactory对象,读取配置文件
  3. 创建SqlSession对象
  4. 调用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 起始行,行数