1 简介:
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
以上简介是MyBatis官方文档的介绍,我以这个为切入点,结合我们的项目,学习了解XML配置文件,SqlSessionFactory的获取,SqlSession的获取和使用。
2. 从XML中构建SqlSessionFactory(为后面的MyBatis-Spring打基础):
String resource ="com/accp/mybatis/data/Configuration.xml";
Reader reader =Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
那看看XML中配置了什么?
2.1 xml配置文件如下:
<configuration> <properties resource="properties/datasource.properties" />
<typeAliases> <typeAlias type="com.accp.mybatis.model.Blog" alias="Blog"/> </typeAliases>
<environments default="accp"> <environment id="accp"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> <property name="driver.encoding" value="${encoding}" /> </dataSource> </environment> </environments>
<mappers> <mapper resource="com/accp/mybatis/data/BlogMapper.xml" /> </mappers> </configuration> |
由此可知xml配置文件的核心设置,以及这样配置的作用:
数据源:获取数据库实例
事物管理器:决定事物的范围和控制
mapper:告诉MyBatis 去哪寻找映射SQL 的语句。
typeAliases:配置Java对象的别名(Mapper配置需要使用)。
Java中的JDBC执行步骤是:
C(Class.forName()),
C(Connection),
S(Statement) ,
R(ResultSet)。
结合JDBC,个人是这样理解这些配置的:
数据源是为了获取Connection(对应CC),
mapper以及transactionManager是为了执行SQL(对应S),
(具体的Mapper.xml文件中有SQL语句,Java对象与SQL返回类型的映射。MyBatis中SQL执行结果是Map<String,Object>,这样配置以后,MyBatis可以将执行结果转换为我们想要的Java对象。)
2.2 SqlSessionFactory
一个environment对应一个SqlSessionFactory,SqlSessionFactory 应该在应用执行期间都存在,可以通过单例模式使其生命周期在一个应用范围内。
3. SqlSession
3.1 SqlSession的获取:从SqlSessionFactory获取SqlSession。
SqlSession session = sqlSessionFactory.openSession(); try { // do work Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101); } finally { session.close(); } |
SqlSession介绍:
Sqlsession对应着一次数据库会话,每次访问数据库时都需要创建它,会话结束后要关闭session。
3.2使用SqlSession执行SQL语句:
3.2.1 只使用Map文件编程:
SqlSession提供了许多方法供我们使用,在我们项目中常用的有如下方法:
select(), selectOne(), insert(), update(),delete()。
项目中使用这种方式,用法和以下这句Java是一样的:
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101); |
3.2.2 以接口方式编程:
本项目中未用。
BlogMapper mapper = session.getMapper(BlogMapper.class); Blog blog = mapper.selectBlog(101); |
原理和使用全名调用Java对象的方法是相似的,编写一个映射类,使用一个名称, 参数和返回值和已映射的查询 语句都一样的方法即可。
4.Mapper XML文件
在Mapper XML文件中可以配置SQL语句和result映射,相比较JDBC,可以节省大量的代码量,而且又是以SQL语句为核心。我个人觉得这个是它强大处之一,顺便可以让我练习写SQL语句(Hibernate让我快遗忘掉SQL了)。
结合我们项目:以下是文件中常用的元素:
sql – 可以重用的 SQL 块,也可以被其他语句引用。 insert – 映射插入语句 update – 映射更新语句 delete – 映射删除语句 select – 映射查询语句 resultMap – 将数据库结果集转换为你设置的对象 <![CDATA[ ]]> - 被包裹的内容会被解析器忽略(忽略特殊字符) |
动态SQL,在项目中没怎么用到,我就不写了,用到的时候可以查看官网:http://mybatis.github.io/mybatis-3/zh/dynamic-sql.html
5. 和Hibernate比较:
Hibernate和mybatis有一个共同点:
1. 从配置文件(通常是XML配置文件中)得到 sessionfactory.
2. 由sessionfactory 产生 session
3. 在session 中完成对数据的增删改查和事务提交等.
4. 在用完之后关闭session 。
5. 都可以将查询的结果集映射为Java对象
我Hibernate用的不是很多,从个人使用和网上搜来的结果,简单总结了如下:
Hibernate特点:
1. 功能强大,DAO层开发简单
2. 比较笨重,不方便优化
MyBatis特点:
1. 比较轻,可以细致优化SQL
2. MyBatis容易掌握,而Hibernate门槛较高。