【Java】关于MyBatis框架的总结

  • 格式:pdf
  • 大小:695.89 KB
  • 文档页数:6

【Java】关于MyBatis框架的总结

最近在学习MyBatis框架,我在这⾥记录⼀下学习MyBatis过程中的⼼得体会。

Mybatis是什么?使⽤它我们可以做什么?

MyBatis是⼀个开源的数据持久层框架,它内部封装了通过JDBC访问数据库的操作,⽀持普通的SQL查询、存储过程和⾼级映射,⼏乎消除了所有的JDBC代码和参数的⼿⼯设置以及结果集的检索。MyBatis作为持久层框架,其主要思想是将程序中⼤量SQL语句剥离出来,配置在配置⽂件中,实现SQL的灵活配置。这样做的好处是将SQL与程序代码分离,可以在不修改程序代码的情况下,直接在配置⽂件中修改SQL。Mybatis通过简单的XML或者注解进⾏配置和原始映射,将实体类和SQL语句之间建⽴映射关系,是⼀种半⾃动化的ORM实现。MyBatis环境搭建

这⾥我们使⽤的编译程序以Eclipse为例。

下载jar包==>部署jar包==>编写configuration核⼼配置⽂件==>创建pojo实体类==>创建DAO接⼝==>创建SQL映射⽂件==>编写测试类

需要的jar包:

创建MyBatis核⼼配置⽂件configuration.xmlMyBatis核⼼配置⽂件主要⽤于配置数据库连接和MyBatis运⾏时所需的各种特性,包含了设置和影响MyBatis⾏为的属性

MyBatis的核⼼接⼝和类

1)每个MyBatis的应⽤程序都以⼀个SqlSessionFactory对象的实例为核⼼。

2)⾸先获取SqlSessionFactoryBuilder对象,可以根据XML配置⽂件或Configuration类的实例构建该对象。

3)然后获取SqlSessionFactory对象,该对象实例可以通过SqlSessionFactoryBuilder对象来获得。

4)使⽤SqlSessionFactory对象获取SqlSession实例。

SqlSessionFactoryBuilder

负责构建SqlSessionFactory,提供多个build()⽅法的重载,主要分为三个:build(Reader reader,String environment,Properties properties)

build(InputStream inputStream,String environment,Properties properties)

build(Configuration config)

最⼤的特点是⽤过即丢,⼀旦创建了SqlSessionFactory对象之后,这个类就不再需要存在了,因此SqlSessionFactoryBuilder的最佳作⽤范围就是存在于⽅法体内,也就是局部变量。SqlSessionFactory

相当于创建SqlSession实例的⼯⼚,可以通过SqlSessionFactory提供的openSession()⽅法来获取SqlSession实例。SqlSessionFactory对象⼀旦创建,就会在整个应⽤运⾏过程中始终存在,没有理由去销毁或再创建它,并且在应⽤运⾏中也不建议多次创建SqlSession。因此SqlSessionFactory的最佳作⽤与是Application,即随着应⽤的⽣命周期⼀同存在。这就是所谓的单例模式(指在应⽤运⾏期间有且仅有⼀个实例)。

这⾥把SqlSessionFactory的代码进⾏优化,最简单的实现⽅式就是放在静态代码块下:

这⾥使⽤了ThreadLocal管理Mybatis中SqlSession对象,保证SqlSession在线程(准确的说是⼀次请求)中的唯⼀性。SqlSession

SqlSession是⽤于执⾏持久化操作的对象,类似于JDBC中的Connection。它提供了⾯向数据库执⾏SQL命令所需的所有⽅法,可以通过SqlSession实例直接运⾏已映射的SQL语句。

SqlSession对应着⼀次数据库回话。由于数据库会话不是永久的,因此SqlSession的⽣命周期也不应该是永久的。相反,在每次访问数据库时都需要创建它。需要注意的是,每个线程都有⾃⼰的SqlSession实例,SqlSession实例不能被共享,也不是线程安全的。因此最佳的作⽤域范围是request作⽤域或者⽅法体作⽤域内。SqlSession的两种使⽤⽅式

1)通过SqlSession实例来直接执⾏已映射的SQL语句。

2)基于mapper接⼝⽅式操作数据。(接⼝的⽅法必须与SQL映射⽂件中SQL语句的ID⼀⼀对应)

MyBatis核⼼配置⽂件

properties元素

properties元素描述的都是外部化,可替代的属性。有以下两种⽅式实现:

1)可通过外部指定的⽅式,即配置在典型的Java属性配置⽂件中,并使⽤这些属性对配置项实现动态配置。

2)直接配置为xml,并使⽤这些属性对配置项实现动态配置。

settings元素

settings元素的作⽤是设置⼀些⾮常重要的设置选项,⽤于设置和改变MyBatis运⾏中的⾏为。

settings元素⽀持的属性设置项描述允许值默认值cacheEnabled对在此配置⽂件下的所有cache进⾏全局性开/关设置true | falsetruelazyLoadingEnabled全局性设置懒加载。如果设置为false,则所有相关联的都会被初始化加载true | falsetrueautoMappingBehaviorMyBatis对于resultMap⾃动映射的匹配级别NONE|PARTIAL|FULLPARTIAL

typeAliases元素

typeAliases元素的作⽤是配置类型别名,通过与MyBatis的SQL映射⽂件相关联,减少输⼊多余的完整类名,以简化操作。

environments元素

MyBatis可以配置多套运⾏环境,我们可以灵活选择不同的配置,从⽽将SQL映射应⽤到不同的数据库环境上。不管增加⼏套运⾏环境,都必须要明确选择出当前的唯⼀⼀个运⾏环境。mappers元素

mappers:映射器,⽤来定义SQL的映射语句。

1)使⽤类资源路径获取资源

2)使⽤URL获取资源

SQL映射⽂件

下⾯是关于SQL映射⽂件的⼏个顶级元素:mapper:映射⽂件的根元素节点,只有⼀个属性namespace(命名空间),作⽤:

⽤于区分不同的mapper,全局唯⼀。

绑定DAO接⼝,即⾯向接⼝编程。当namespace绑定某⼀接⼝之后,可以不⽤写该接⼝的实体类,MyBatis会通过接⼝的完整限定名查找到对应的mapper配置来执⾏SQL语句。因此namespace的命名必须要和接⼝同名。

cache:配置给定命名空间的缓存。(性能较低,不推荐使⽤)

cache-ref:从其他命名空间引⽤缓存配置。

resultMap:⽤来描述数据库结果集和对象的对应关系。

sql:可以重⽤的SQL块,也可以被其他语句引⽤。

insert:映射插⼊语句。

update:映射更新语句。

delete:映射删除语句。

select:映射查询语句。

namespace的命名必须跟某个DAO接⼝同名,通属于DAO层,所以映射⽂件与该DAO接⼝应放置在同⼀package下。在不同的mapper⽂件中,⼦元素的id可以相同,MyBatis通过namespace和⼦元素的id联合区分。接⼝中的⽅法与映射⽂件中的SQL语句id应⼀⼀对应。resultType

resultType直接表⽰返回类型,包括基础数据类型和复杂数据类型。

resultMap

id属性:唯⼀标识,此id值⽤于select元素的resultMap属性的引⽤。

type属性:表⽰该resultMap的映射结果类型。

result⼦节点:⽤于标识⼀些简单属性,其中column属性表⽰从数据库中查询的字段名,property则表⽰查询出来的字段对应的值赋给实体对象的哪个属性。resultMap是对外部resultMap定义的引⽤,对应外部resultMap的id,表⽰返回结果映射到某⼀个resultMap上。主要应⽤:数据库字段信息与对象属性不⼀致或者需要做复杂的联合查询以便⾃由控制映射结果。resultType和resultMap本质上是⼀样的,都是Map数据结构。但是不能同时存在,只是⼆者选其⼀使⽤。

association

association:映射到JavaBean的某个复杂类型属性,即JavaBean内部嵌套⼀个复杂数据类型属性。association仅处理⼀对⼀的关联关系。

属性:javaType:完整Java类名或者别名。

property:映射数据库列的实体对象的属性。

id

result:

property:映射数据库列的实体对象的属性。

column:数据库列名或别名。collection

collection元素的作⽤和association元素的作⽤类似,只不过collection元素映射的属性是⼀个集合列表,即JavaBean内部嵌套⼀个复杂数据类型(集合)属性。

属性:ofType:完整Java类型或者别名,即集合所包含的类型。

property:映射数据库列的实体对象的属性。

collection的⼦元素与association基本⼀致。

resultMap⾃动映射级别

在MyBatis核⼼配置⽂件中添加标签: MyBatis对resultMap⾃动映射有三个匹配级别:

NONE:禁⽌⾃动匹配。

PARTIAL(默认):⾃动匹配所有属性,有内部嵌套(association、collection)的除外。

FULL:⾃动匹配所有。

使⽤动态SQL完成多条件查询if:利⽤if实现简单的条件选择。

choose(when,otherwise):相当于Java中的switch,通常与when和otherwise搭配。

where:简化SQL语句中where的条件判断,并能智能地处理and和or,不必担⼼多余关键字导致的语法错误。

set:解决动态更新语句。主要功能和where类似,是在包含的语句前输出⼀个set,若包含的语句是以逗号结束的,会⾃动把该逗号忽略掉,再配合if元素就可以动态地更新需要修改的字段。trim:可以灵活地去除多余的关键字。

属性: