关于mysql:MyBatis-原理介绍

42次阅读

共计 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 简单的多。

正文完
 0