1. MyBatis的概念:
MyBatis是支持定制化、SQL、存储过程以及高级映射的优秀的持久层的框架。MyBatis避免了几乎所有的JDBC代码和手工设置参数以及抽取结果集。MyBatis使用简单的XML或注解来配置和映射基本体,将接口和Java的POJO(plain old java Objects,普通的java对象)映射成数据库中的记录。
MyBatis让程序主要精力放在sql上,通过MyBatis提供的映射方式,自由灵活生成满足需要的sql语句,MyBatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。
2. MyBatis的执行流程:
MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一个是配置文件,一个是java代码的注解,将sql的配置信息加载成一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。获取一个SqlSession,SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。
SQL解析:当api接口层接收到调用请求时,会接收到传入sql的id和传入对象(可以是map或者基本数据类型),MyBatis会根据sql的id找到相应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析以后可以得到最终要执行的sql语句和参数。
SQL执行:将最终得到SQL和参数拿到数据可进行执行,得到操作数据库的结果。
结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
传统的Dao层开发:(Hibernate框架开发):
使用MyBatis框架开发:
3. MyBatis的执行过程:
1. 配置mybatis的配置文件,SqlMpConfig.xml(名称不固定)。
2. 通过配置文件,加载mybatis运行环境,创建SqlSessionFactory(单例模式)工厂。
3. 通过SqlSessionFactory创建SqlSession(SqlSession是一个面向用户接口(提供数据库操作方法),实现对象是线程不安 全的,建议SqlSession应用场合在方法体内。
4. 调用SqlSession的方法去操作数据。(如果需要提交事务,需要执行SqlSession的commit()方法)。
5. 释放资源,关闭SqlSession。
4. MyBatis的使用流程:
1. 先导入mybatis-3.x.jar和数据库驱动jar包。
2. 在数据库访问层中添加如下文件:
一个核心配置文件(例如:SqlMapConfig.xml)
多个接口映射文件:XXXMapper.xml
3.编写代码:解析核心配置文件,创建SqlSessionFactory工厂。
4.通过SqlSessionFactory工厂创建一个SqlSession实例,进一步得到映射接口的实例。
5.在业务逻辑层中调用映射器接口中的方法进行业务处理。
6. 关闭SqlSession对象。
5. MyBatis的核心配置文件SqlMapConfig.xml(名称不固定):
核心配置文件的内容:配置mybatis的运行环境,数据源,事务等
Properties:
properties元素主要是用来定义配置外在化,比如数据库的连接属性等。这些属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,亦可以通过properties元素的子元素来传递。例如:
其中的属性就可以在整个配置文件中使用来替换需要动态配置的属性值。比如在数据源中使用的例子:
Settings:
setting是指定MyBatis的一些全局配置属性,这是MyBatis中极为重要的调整设置,它们会改变MyBatis的运行时行为,所以我们需要清楚的知道这些属性的作用及默认值。
一个完整的settings元素示例如下:
typeAliases:
类型别名是为Java类型设置一个短的名字。它只和xml配置有关,存在的意义仅在于用来减少类完全限定名的冗余,例如:
当这样配置时,Blog可以用在任何使用domain.blog.Blog的地方。
插件(plugins):
MyBatis允许你在已映射的语句执行过程中的某一点进行拦截调用。默认情况下,Mybatis允许使用插件来拦截的方法调用包括:
Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)
ParameterHandler(getParameterObejct,setParameters)
ResultSetHandler(handlerResultSets,handlerOutputParameters)
StatementHandler(prepare,parameterize,batch,update,query)
配置环境(environments):
MyBatis可以配置成适应多种环境,这种机制有助于将sql映射应用于多种数据库中,现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者共享相同的Schema的多个生产数据库,想使用相同的sql映射。许多类似的用例。
尽管可以配置多个环境,但是每个SqlSessionFactory实例只能选择其一。
所以,如果想连接两个数据库,就需要创建两个SqlSessionFactory实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推。
注意这里的关键点:
默认环境的ID(比如:default="development")
每个environment元素定义的环境ID(比如:id="development")
事务管理器的配置(比如:type="JDBC")
数据源的配置(比如:type="POOLED")
映射器(mappers):
既然MyBatis的行为已经由上述元素配置完了,现在就要定义SQL映射语句了。但是首先需要告诉MyBatis到哪里去找到这些语句。Java在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉MyBatis到哪里去找映射文件。可以使用相对于类路径的资源引用、或完全限定资源定位符(包括file:///的URL),或类名和包名等等。例如:
6. MyBatis的Mapper映射文件:
Mapper映射文件就是所有sql语句放置的地方
INSERT INTO wxcms_article (
TITLE,
AUTHOR,
CONTENT,
DIGEST,
SHOW_COVER_PIC,
URL,
PIC_URL,
THUMB_MEDIA_ID,
MEDIA_ID,
CONTENT_SOURCE_URL,
NEWS_ID,
NEWS_INDEX)
VALUES (
#{title},
#{author},
#{content},
#{digest},
#{showCoverPic},
#{url},
#{picUrl},
#{thumbMediaId},
#{mediaId},
#{contentSourceUrl},
#{newsId},
#{newsIndex})
insert into wxcms_article
(TITLE,
AUTHOR,
CONTENT,
DIGEST,
SHOW_COVER_PIC,
URL,
PIC_URL,
THUMB_MEDIA_ID,
MEDIA_ID,
CONTENT_SOURCE_URL,
NEWS_ID,
NEWS_INDEX)
values
(
#{item.title},
#{item.author},
#{item.content},
#{item.digest},
#{item.showCoverPic},
#{item.url},
#{item.picUrl},
#{item.thumbMediaId},
#{item.mediaId},
#{item.contentSourceUrl},
#{item.newsId},
#{item.newsIndex})
UPDATE wxcms_article SET
TITLE=#{title},
AUTHOR=#{author},
CONTENT=#{content},
SHOW_COVER_PIC=#{showCoverPic},
THUMB_MEDIA_ID=#{thumbMediaId},
PIC_URL=#{picUrl},
DIGEST=#{digest},
CONTENT_SOURCE_URL=#{contentSourceUrl}
WHERE ar_id = #{arId}
DELETE FROM wxcms_article WHERE ID = #{id}
DELETE FROM wxcms_article WHERE NEWS_ID = #{id}
SQL 映射XML 文件一些初级的元素:
1. cache – 配置给定模式的缓存
2. cache-ref – 从别的模式中引用一个缓存
3. resultMap – 这是最复杂而却强大的一个元素了,它描述如何从结果集中加载对象
4. sql – 一个可以被其他语句复用的SQL 块
5. insert – 映射INSERT 语句
6. update – 映射UPDATE 语句
7. delete – 映射DELEETE 语句
8. select - 映射SELECT语句
(1)resultMap:
引用外部的resultMap名,结果集映射是MyBatis中最强大的特性,许多复杂的映射都可以轻松解决。
可以通过resultMap完成一些高级映射:
将关联查询的列映射到一个pojo属性中(一对一)
将关联查询的列映射到一个List
type、id:
type为java实体类,id为此resultMap的标识
(2)id、result:
id,result是最简单的映射,id为主键映射,result是数据库表字段到实体类属性的映射。
id,result语句属性配置细节:
property: 需要映射到JavaBean的属性名称
column: 数据表的列明或者标签别名
(3)Mapper:
(4)insert:
Id,parameterType,resultType
id:标识mapper中的方法
parameterType:指定输入参数的类型
resultType:指定mapper.java中方法返回值的类型
(4)select:
Id,parameterType,resultType
id:标识mapper中的方法
parameterType:指定输入参数的类型
resultType:指定返回参数的类型
(5)delete:
Id,parameterType,resultType
id:标识mapper中的方法
parameterType:指定输入参数的类型
resultType:指定返回参数的类型
(6)update:
Id,parameterType,resultType
id:标识mapper中的方法
parameterType:指定输入参数的类型
resultType:指定返回参数的类型
(7)#{id}
#{}:标识一个占位符
id: 标识接收输入的参数,参数名称就是id
${}:标识拼接sql串,将接收到参数的内容不加任何修饰拼接到sql中
#{}:中指定pojo的属性名,接收到pojo对象的属性值,MyBatis通过OGNL获取对象的属性值。
7. MyBatis的优缺点:
优点:
缺点:
8. myBatis和hibernate的区别:
1、hibernate 是一个标准的ORM框架(对象关系映射框架),不需要程序写sql,sql语句自动生成,对sql语句进行优化、修改 比较困难。全自动的、完全面向对象的持久层框架
2、mybatis专注于sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。是一个不完全的ORM框架,虽然程序员自 己写sql,mybatis也可以实现映射(输入映射,输出映射)半自动化的持久层框架。
3、Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
4、Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
5、Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
6、Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
7、MyBatis可以进行更为细致的SQL优化,可以减少查询字段。