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简单的多。
发表回复