共计 8228 个字符,预计需要花费 21 分钟才能阅读完成。
ORM(Object/Relational Mapping),即对象关系映射,它实现面向对象的编程语言到关系数据库的映射。ORM 工具的惟一作用是:把长久化对象的保留、批改、删除等操作,转换成对数据库的操作。
ORM 根本映射关系:
数据表映射类。数据表的行映射对象(实例)。数据表的列(字段)映射对象的属性。
MyBatis 简介:
MyBatis 是反对定制化 SQL、存储过程以及高级映射的优良的长久层框架。MyBatis 防止了简直所有的 JDBC 代码和手动设置参数以及对后果集的检索封装。MyBatis 能够对配置和原生 Map 应用简略的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects(一般的 Java 对象))映射成数据库中的记录。MyBatis 次要思维是将程序中的大量 SQL 语句抽取进去,配置在配置文件中,以实现 SQL 的灵便配置。MyBatis 并不齐全是一种 ORM 框架,它的设计思维和 ORM 类似,只是它容许间接编写 SQL 语句,使得数据库拜访更加灵便。MyBatis 提供了一种“半自动化”的 ORM 实现,是一种“SQL Mapping”框架。
MyBatis 性能构造
1. API 接口层:
提供给内部应用的接口 API,开发人员通过这些本地 API 来操纵数据库。接口层接管到调用申请就会调用数据处理层来实现具体的数据处理。
2. 数据处理层:
负责具体的 SQL 查找、SQL 解析、SQL 执行和执行后果映射解决等。它次要的目标是依据调用的申请实现一次数据库操作。
3. 根底撑持层:
负责最根底的性能撑持,包含连贯治理、事务管理、配置加载和缓存解决,这些都是共用的货色,将他们抽取进去作为最根底的组件,为下层的数据处理层提供最根底的撑持。
MyBatis 框架结构
1. 加载配置:
MyBatis 应用程序依据 XML 配置文件加载运行环境,创立 SqlSessionFactory, SqlSession,将 SQL 的配置信息加载成为一个个 MappedStatement 对象(包含了传入参数映射配置、执行的 SQL 语句、后果映射配置),存储在内存中。(配置来源于两个中央,一处是配置文件,一处是 Java 代码的注解)
2. SQL 解析:
当 API 接口层接管到调用申请时,会接管到传入 SQL 的 ID 和传入对象(能够是 Map、JavaBean 或者根本数据类型),MyBatis 会依据 SQL 的 ID 找到对应的 MappedStatement,而后依据传入参数对象对 MappedStatment 进行解析,解析后能够失去最终要执行的 SQL 语句和参数。
3. SQL 的执行:
SqlSession 将最终失去的 SQL 和参数拿到数据库进行执行,失去操作数据库的后果。
4. 后果映射:
将操作数据库的后果依照映射的配置进行转换,能够转换成 HashMap、JavaBean 或者根本数据类型,并将最终后果返回,用完之后敞开 SqlSession。
SqlSessionFactory:
每个基于 MyBatis 的利用都是以一个 SqlSessionFactory 的实例为外围的。SqlSessionFactory 是单个数据库映射关系通过编译后的内存映像。SqlSessionFactory 的实例能够通过 SqlSessionFactoryBuilder 取得。而 SqlSessionFactoryBuilder 则能够从 XML 配置文件或一个事后定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。SqlSessioFactory 是创立 SqlSession 的工厂。
SqlSession:
SqlSession 是执行长久化操作的对象,它齐全蕴含了面向数据库执行 SQL 命令所需的所有办法。能够通过 SqlSession 实例来间接执行已映射的 SQL 语句,在应用完 SqlSession 后咱们应该应用 finally 块来确保敞开它。
Mybatis.xml 配置文件:
配置文件包含:
1. configuration 配置
2. properties 配置
可内部配置且动静替换。例如:在 resource 资源目录下配置 config.properties 配置文件,在 Mybatis.xml 中配置如下。<properties resource="config.properties"/>
也能够通过 properties 的子元素传递值:<properties resource="config.properties">
<property name="username" value="root"/>
<property name="password" value="123"/>
</properties>
3. settings 设置
settings 是 Mybatis.xml 文件中极其重要的设置,它们会扭转 MyBatis 的运行时行为,如开启二级缓存、开启提早加载等。
4. typeAliases 类型别名
typeAliases 只和 XML 配置无关,用来缩小类齐全限定名的冗余。第一种配置办法:<typeAliases>
<typeAlias alias="User" type="com.shiyanlou.mybatis.model.User"/>
</typeAliases>
这里将全门路的 com.shiyanlou.mybatis.model.User(User 是包 com.shiyanlou.mybatis.mode 下的办法)起一个别名 User,在映射文件中 parameterType 和 resultType 就能够间接应用别名 User,无需应用全门路。第二种配置办法:<typeAliases>
<package name="com.shiyanlou.mybatis.model" />
</typeAliases>
指定一个包名起别名,MyBatis 会在包名下搜寻须要的 JavaBean,将 Java 类的类名作为类的类别名。
5. typeHandlers 类型处理器
typeHandlers 的作用是实现 JDBC 类型和 Java 类型之间的转换,MyBatis 中默认的类型处理器根本能满足日常需要。
6. objectFactory 对象工厂
7. plugins 插件
8. environments 环境
MyBatis 的环境配置理论是数据源的配置,MyBatis 能够配置多个环境,帮忙你将 SQL 映射对应到多种数据库。留神:只管能够配置多个环境,每个 SqlSessionFactory 实例只能对应一个数据库,有几个数据库就须要创立几个 SqlSessionFactory 实例。接管环境配置的两个办法:SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, environment,properties);
如果疏忽了环境参数,默认环境将会被加载:SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader,properties);
9. transactionManager:事务管理器
MyBatis 中有两种事务管理器,即 type=”\[JDBC | MANAGED\]”;JDBC:间接应用 JDBC 的提交和回滚设置。MANAGED:让容器来治理事务的整个生命周期。
10. dataSource:数据源
dataSource 元素应用规范的 JDBC 数据源接口来配置 JDBC 连贯对象的资源。MyBatis 三种内建的数据源类型,即 type=”\[UNPOOLED | POOLED | JNDI\]”;
1. UNPOOLED:不反对 JDBC 数据源连接池,实现的只是每次被申请时关上和敞开连贯。属性有:1)driver:JDBC 驱动的 Java 类的齐全限定名,如 MySQL 的 com.mysql.jdbc.Driver
2)url:数据库的 JDBC URL 地址。3)username:数据库的用户名。4)password:数据库的明码。5)defaultTransactionIsolationLevel:默认的连贯事务隔离级别。2. POOLED:反对 JDBC 数据源连接池,利用“池”的概念将 JDBC 连贯对象组织起来,防止了创立新的连贯实例时所必须的初始化和认证工夫。3. JNDI:反对内部数据源连接池,它的实现是为了能在如 EJB 或应用服务器这类容器中应用。
11. databaseIdProvider 数据库厂商标识
12. mappers 映射器
mappers 映射器用于援用曾经定义好的映射文件,通知 MyBatis 去哪寻找映射 SQL 的语句。常见的办法有:1)通过 resource 加载单个映射文件
<mappers>
<mapper resource="com/shiyanlou/mybatis/mapper/UserMapper.xml"/>
</mappers>
2)通过齐全限定资源定位符(绝对路径前加上“file:///”)加载单个映射文件。<mappers>
<mapper url="file:///home/project/MyBatisTest/src/com/shiyanlou/mybatis/mapper/UserMapper.xml"/>
</mappers>
3)通过 mapper 接口对象加载单个映射文件。<mappers>
<mapper class="com.shiyanlou.mybatis.mapper.UserMapper"/>
</mappers>
4)通过 mapper 接口包加载整个包的映射文件。<mappers>
<package name="com.shiyanlou.mybatis.mapper" />
</mappers>
以下是一个简略的 MyBatis.xml 的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-[//mybatis.org//DTD](//mybatis.org//DTD) Config 3.0//EN" "[http://mybatis.org/dtd/mybatis-3-config.dtd](http://mybatis.org/dtd/mybatis-3-config.dtd)">
<configuration>
<!-- 为 JavaBean 起类别名 -->
<typeAliases>
<!-- 指定一个包名起别名,将包内的 Java 类的类名作为类的类别名 -->
<package name="com.springMybatis.demo" />
</typeAliases>
<!-- 配置 mybatis 运行环境 -->
<environments default="development">
<environment id="development">
<!-- type="JDBC" 代表间接应用 JDBC 的提交和回滚设置 -->
<transactionManager type="JDBC" />
<!-- POOLED 示意反对 JDBC 数据源连接池 -->
<!\-\- 数据库连接池,由 Mybatis 治理,数据库名是 mybatis,MySQL 用户名 root,明码为空 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" /
<property name="username" value="root" />
<property name="password" value="数据库明码" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 通过 mapper 接口包加载整个包的映射文件 -->
<package name="cn.dbOperation.demo" />
</mappers>
</configuration>
MyBatis 映射文件:
映射文件是所有 SQL 语句搁置的中央,写好 SQL 语句映射文件后,须要在 mybatis.xml 配置文件的 mappers 标签中援用。
映射文件蕴含的顶级元素:
1. cache:给定命名空间的缓存配置。2. cache-ref:其余命名空间缓存配置的援用。3. resultMap:形容如何从数据库后果集中来加载对象。4. sql:可被其它语句援用的可重用语句块。5. insert:映射插入语句。6. updata:映射更新语句。7. delete:映射删除语句。8. select:映射查问语句。
resultMap:
在映射文件中也是最简单最弱小的,resultMap 的设计就是简略语句不须要明确的后果映射,而很多简单语句的确须要形容它们的关系。
resultMap 的子元素包含:
1. constructor:用来将后果注入到一个实例化好的类的构造方法中。2. idArg:ID 参数,标记后果作为 ID。3. arg:注入到构造方法的一个一般后果。4. id:一个 ID 后果,标记后果作为 ID。5. result:注入到字段或 JavaBean 属性的一般后果。6. association:简单的类型关联,多个后果合成的类型。7. collection:简单类型的集,也能够援用一个内部后果映射。8. discriminator:应用后果值来决定应用哪个后果集。9. case:根本一些值的后果映射。
resultMap 的属性包含:
1. id:以后命名空间中的一个惟一标识,用于标识一个 resultMap
2. type:类的全限定名,或者一个类型别名。3. automapping:为这个 ResultMap 开启或敞开主动映射,改属性会笼罩全局的属性 autoMappingBehavior,默认值为:unset
动静 SQL 语句:
MyBatis 罕用的动静 SQL 元素包含:
1. if
2. choose(when, otherwise)
3. trim(where, set)
4. foreach
5. bind
if
if 在 where 子句中做简略的条件判断;如果 addres 为空,则 where id = #{id}。如果 addres 不为空,则 where id = #{id} and addres = #{addres};
<select id="selectUserTest" parameterType="int" resultType="User">
select * from User where id = #{id} <if test="addres != null"> and addres = #{addres} </if>
</select>
choose(when, otherwise):
choose 的用法和 java 的 switch 相似。依照程序执行,当 when 中有条件满足时,则跳出 choose,当所有 when 的条件都不满足时就输入 otherwise 的内容。<!\-\- select id="selectUserTest" parameterType="int" resultType="User">
select * from User where id = #{id}
<choose>
<when test="username != null">
and username = #{username}
</when>
<when test="phone != null">
and phone = #{phone}
</when>
<otherwise>
and addres = #{addres}
</otherwise>
</choose>
</select -->
trim(where, set):
trim 元素能够给本人蕴含的内容加上前缀 (prefix) 或加上后缀(suffix)。也能够把蕴含内容的首部 (prefixOverrides) 或尾部 (suffixOverrides) 某些内容移除;<select id="selectUserTest" parameterType="int" resultType="User">
select * from User
<trim prefix="where" prefixOverrides="and | or">
<if test="id != null">
id = #{id}
</if>
<if test="addres != null">
and addres = #{addres}
</if>
</trim>
</select>
where 元素晓得只有在一个以上的 if 条件满足的状况下才去插入 where 子句,而且可能智能地解决 and 和 or 条件;<select id="dynamicWhereTest" resultType="User">
select * from user
<where>
<if test="address != null">
address = #{address}
</if>
<if test="phone != null">
and phone like #{phone}
</if>
</where>
</select>
set 元素能够被用于动静蕴含须要更新的列,而舍去其余的
<update id="dynamicSetTest">
update User
<set>
<if test="phone != null">phone=#{phone},</if>
<if test="address != null">address=#{address}</if>
</set> where id=#{id}
</update>
foreach:
foreach 元素罕用到须要对一个汇合进行遍历时,在 in 语句查问时特地有用:
foreach 元素的次要属性:
1. item:本次迭代获取的元素;2. index : 以后迭代的次数;3. open:开始标记;4. separator:每次迭代之间的分隔符;5. close:完结标记;6. collection:该属性必须指定(1、单参数且为 List 时,值为 list。2、单参数且为 array 时,值为 array。3、多参数需封装成一个 Map,map 的 key 就是参数名)<select id="selectUser" parameterType="int" resultType="User">
select * from User where id in
<foreach collection="list" item="item" index="index"
open = "(" separator="," close=")">
#{item}
</foreach>
</select>
bind:
bind 元素能够从 OGNL 表达式中创立一个变量并将其绑定到上下文。<select id="selectUser" parameterType="int" resultType="User">
<bind name="pattern" value="'%' + _parameter.getPhone() + '%'"/>
select * from User where phone like #{pattern}
</select>
MyBatis、JDBC、Hibernate 的区别:
MyBatis 也是基于 JDBC 的,Java 与数据库操作仅能通过 JDBC 实现。MyBatis 也要通过 JDBC 实现数据查问、更新这些动作。MyBatis 仅仅是在 JDBC 根底上做了 OO 化、封装事务管理接口这些货色。MyBatis 和 Hibernate 都屏蔽 JDBC API 的底层拜访细节,使咱们不必跟 JDBC API 打交道就能够拜访数据库。然而,Hibernate 是全自动的 ORM 映射工具,能够主动生成 SQL 语句。MyBatis 须要在 xml 配置文件中写 SQL 语句。因为 Hibernate 是主动生成 SQL 语句的,在写简单查问时,Hibernate 实现比 MyBatis 简单的多。
正文完