Mybatis是什么?使用它我们可以做什么?
MyBatis是一个开源的数据持久层框架,它内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询、存储过程和高级映射,几乎消除了所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis作为持久层框架,其主要思想是将程序中大量SQL语句剥离出来,配置在配置文件中,实现SQL的灵活配置。这样做的好处是将SQL与程序代码分离,可以在不修改程序代码的情况下,直接在配置文件中修改SQL。Mybatis通过简单的XML或者注解进行配置和原始映射,将实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。
MyBatis官网:http://mybatis.org
Github:https://github.com/mybatis
MyBatis环境搭建
导入maven依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
MyBatis核心配置文件
properties元素
properties元素描述的都是外部化,可替代的属性。有以下两种方式实现:
-
可通过外部指定的方式,即配置在典型的Java属性配置文件中,并使用这些属性对配置项实现动态配置。
-
直接配置为xml,并使用这些属性对配置项实现动态配置。
settings元素
settings元素的作用是设置一些非常重要的设置选项,用于设置和改变MyBatis运行中的行为。
typeAliases元素
typeAliases元素的作用是配置类型别名,通过与MyBatis的SQL映射文件相关联,减少输入多余的完整类名,以简化操作。
environments元素
MyBatis可以配置多套运行环境,我们可以灵活选择不同的配置,从而将SQL映射应用到不同的数据库环境上。不管增加几套运行环境,都必须要明确选择出当前的唯一一个运行环境。
mappers元素
mappers:映射器,用来定义SQL的映射语句。
<mappers>
<mapper resource="url">
</mappers>
-
使用类资源路径获取资源
-
使用URL获取资源
配置mybaits核心配置文件SqlMapConfig.xml
引入外部properties配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_mybatis
jdbc.name=root
jdbc.password=dy123
引用properties文件配置SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 1、mybatis使用properties来引入外部properties配置文件的内容
resource 引入类路径下资源
url 引入网络路径或磁盘路径下资源 -->
<properties resource="db.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.name}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="cn/bdqn/mybatis/mapper/xxx.xml"></mapper>
</mappers>
</configuration>
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核心配置文件中添加标签:
<settings>
<setting name="autoMappingBehavior" value="FULL" />
</settings>
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:可以灵活地去除多余的关键字。
属性:
prefix:前缀,作用是通过自动识别是否有返回值后,在trim包含的内容上加上前缀。
suffix:后缀,作用是在trim包含的内容上加上后缀。
prefixOverrides:对于trim包含的首部进行指定内容的忽略。
suffixOverrides:对于trim包含内容的首尾部进行指定内容的忽略。
foreach:迭代一个集合,通常用于in条件。foreach主要用在构建in条件中,它可以在SQL语句中迭代一个集合。
属性:
item:表示集合中每一个元素进行迭代时的别名。
index:指定一个名称,用于表示在迭代过程中,每次迭代到的位置。
open:表示该语句以什么开始。(如果是in条件语句,以“(”开始)
separator:表示在每次进行迭代之间以什么符号作为分隔符。(如果是in条件语句,以“,”作为分隔符)
close:表示该语句以什么结束。(如果是in条件语句,以“)”结束)
collection:该属性必须指定,不同情况下,该属性的值是不一样的。主要有三种情况:
若入参为单参数且参数类型是一个List的时候,collection属性值为list。
若入参为单参数且参数类型是一个数组的时候,collection属性值为array。
若传入参数为多参数,就需要把它们封装为一个Map进行处理。
最后总结:
Mybatis优点
- Mybatis与JDBC相比,减少了50%以上的代码量。
- MyBatis是最简单的持久化框架,小巧并且简单易学。
- MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。
- 提供XML标签,支持编写动态SQL语句。
- 提供映射标签,支持对象与数据库的ORM字段关系映射。
Mybatis缺点
- SQL语句的编写工作量较大,对开发人员编写SQL语句的功底有一定要求。
- SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。