-支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
-消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
-使用简单的XML或注解用于配置和原始映射,将接口和JAVA的POJOS(Plan Old Java Objects)即普通的Java对象映射成数据库中的记录。
总体来说,Mybatis主要完成两件事:
--根据JDBC规范建立与数据库的连接
--通过Annotation/XML+JAVA反射技术,实现JAVA对象与关系数据库之间相互转化。
Mybatis是一种典型的交互式框架:
准备交互的必要条件 | 构建会话环境 |
构建一个交互的环境 | 交换数据 |
类层次结构:
SqlSessionFactory->DefaultSqlSessionFactory->SqlSessionFactoryBuilder->Configuration
|
SqlSession->DefaultSqlSession->Executor->CachingExecutor
|->BaseExecutor->(BatchExecutor, SimpleExecutor, ReaseExecutor)
文件组成:Configuration.xml由<configuration>和<mappers>组成:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <configuration> 3 <environments default="development"> 4 <environment id="development"> 5 <transactionManager type="JDBC" /> 6 <dataSource type="POLLED"> 7 <property name="driver" value="${driver}" /> 8 <property name="url" value="${url}" /> 9 <property name="user" value="${username}" /> 10 <property name="password" value="${password}" /> 11 </dataSource> 12 </environment> 13 </environments> 14 </configuration> 15 <mappers> 16 <mapper resource="org.mybatis.builder.AuthorMapper.xml" /> 17 <!-- <mapper url="file://var/samples/AuthorMapper.xml" /> --> 18 </mappers>
Mapper.xml: 定义具体SQL映射语句的文件,文件结构:
-cache:配置给定命名空间的缓存
-cache-ref:从其他命名空间引用缓存配置
-resultMap:最复杂,也是最具力量的元素,用来描述如何从数据库结果集中来加载对象
-resultType:从语句中返回的期望类型的类的完全限定名或别名
-sql:可以重用的SQL块,也可以被其他语句引用
-insert:映射插入语句
-update:映射更新语句
-delete:映射删除语句
-select:映射查询语句
输出属性参数:resultType,resultMap,二者不能同时使用
resultType-返回的期望类型的类的完全限定名或别名,注意集合情况,应该是集合可以包含的类型,而不是集合本身
resultMap-命名引用外部的resultMap,返回map是mybatis最具力量的特性,对其有一个很好的理解的话,许多复杂的映射的情况就能被解决了
二者的区别:
<resultMap id="BaseResultMap" type="com.garinzhang.vo.Area"> <id column="area_id" jdbcType="INTEGER" property="areaId" /> <id column="code" jdbcType="VARCHAR" property="code" /> <id column="parent" jdbcType="INTEGER" property="parent" /> </resultMap> <select id="selectUsers" paramenterType="int" resultType="com.garinzhang.model.User"> SELECT ID, USERNAME, PASSWORD FROM USER WHERE ID=#{id} </select> <mapper namespace="org.mybatis.example.BlogMapper"> <select id="selectBlog" parameterType="int" resultType="Blog" > SELECT * FROM Blog WHERE ID="#{id}" </select> </mapper>
调用方式:
// 1. 使用完全限定名词调用映射语句 Bolg b = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 1); // 2. 采用映射接口调用映射语句 BlogMapper m = session.getMapper(BlogMapper.class); Blog blog = m.selectBlog(1);
Insert: 如果User表已经对id使用了自动生成的列类型
<insert id="insertUser" parameterType="com.garinzhang.model.User" userGeneratedKeys="true" keyProperty="id"> INSERT INTO USER(USERNAME, PASSWORD, EMAIL, PHONE) VALUES(#{username}, #{password}, #{email}, #{phone}) </insert>
Insert: 如果User表主键生成策略采用OID, Sequence
<insert id="insertUser" parameterType="com.garinzhang.model.User"> <selectKey resultType="long" keyProperty="id" order="BEFORE"> SELECT nextval FOR SEQ_USER FROM DUAL </selectKey> INSERT INTO USER(ID, USERNAME, PASSWORD, EMAIL, PHONE) VALUES(#{id}, #{username}, #{password}, #{email}, #{phone}) </insert>
Update:
<udpate id="updateUser" parameterType="com.garinzhang.model.User"> UPDATE USER SET USERNAME=#{username}, PASSWORD=#{password}, EMAIL=#{email}, PHONE=#{phone} WHERE ID=#{id} </udpate>
Delete:
<delete id="deleteUser" parameterType="int"> DELETE FROM USER WHERE ID=#{id} </delete>
动态SQL: Mybatis的一个强大的特性之一,通常是它的动态SQL能力
SQLSessionFactory:
SqlSessionFactory有三个方法可以用来创建SqlSession实例
SqlSession openSession(ExecuterType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection conn)
Configuration getConfiguration();
默认的openSession方法没有参数:它会创建有如下特性的sqlSession:
1. 会开启一个事务,也就是不会自动提交
2. 连接对象会从由活动环境配置的数据源实例中得到
3. 事务隔离级别将会使用驱动或数据源的默认设置
4. 预处理语句不会被复用,也不会批量处理