初识MyBatis

Posted caotian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识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)
创建测试类

  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 起始行,行数
































以上是关于初识MyBatis的主要内容,如果未能解决你的问题,请参考以下文章

第6章 初识MyBatis

初识MyBatis及第一个MyBatis程序(基于Maven创建)

甩给他

mybatismybatis资料

mybatisMyBatis Generator

MybatisMyBatis 注解方式的基本 用法