1. 在了解 myBatis 之前,首先需要知道什么是 ORM
ORM,即对象关系映射,为了解决 面对对象 和 数据库 存在的互不匹配的问题,简单来说就是将关系数据库中的数据转换成面向对象程序中的对象。
常用的 ORM 框架有:Hibernate 和 myBatis,也就是 ssh 中的 h 和 ssm 中的 m
1.1 Hibernate 和 myBatis 的特点和区别:
Hibernate 提供了对数据库结构的完整的封装,不需要我们自己写 sql 语句,Hibernate 能自动生成 SQL 语句,Hibernate 符合 JPA 规范(JPA 是 Java 持久层 API,JavaEE 提供)
myBatis 简化了数据库交互的操作,封装了 JDBC 代码,其原理主要是通过映射文件配置,将 SQL 语句的参数和返回的结果字段映射到指定的对象中。myBatis 需要自己定义 sql 语句。
这两个框架都是对 JDBC 操作的封装,简化了数据库的交互方式。Hibernate 要简化的更彻底一些,我们不再需要自己写 sql 语句。但对于程序员来说,sql 语句控制在自己手里当然要好一些(当然具体使用因人而异),当然使用 myBatis 的第二个重要的原因就是 myBatis 是一个轻量级框架,而 Hibernate 是一个重量级的框架。
2. 什么是 MyBatis
MyBatis 是一个简化和实现了 Java 数据持久化层(persistence layer)的开源框架,它抽象了大量的 JDBC 冗余代码,并提供了一个简单易用的 API 和数据库交互方式。
在 Java 应用程序中,数据持久化层涉及到的工作有:
1)将从数据库查询到的数据封装成成所需要的 Java 对象;
2)将 Java 对象中的数据通 SQL 持久化到数据库中。
MyBatis 通过抽象底层的 JDBC 代码,自动化 SQL 语句的结果集封装成的 Java 对象、自动化 Java 对象的数据持久化保存进数据库中的过程,从而使得 SQL 的使用变得容易。
2.1 myBatis 的下载
MyBatis 的前身是 iBATIS,iBATIS 于 2002 年由 ClintonBegin 创建
ibatis 的官网 http://ibatis.apache.org/ 进去官网会看到下面提示:
apache ibatis is retired at the apache software foundation (2010/06/16)
the original project team has moved to mybatis hosted at google code. see http://www.mybatis.org/ for more.
然而 http://www.mybatis.org/ 这个地址一直处于打不开状态 …
但是我们可以在 github 中找到 mybatis 的相关下载的:
mybatis 在 github 中的地址:https://github.com/mybatis/mybatis-3
最新版本的 mybatis 的下载地址:https://github.com/mybatis/mybatis-3/releases
以及 doc 文档:http://www.mybatis.org/mybatis-3/
2.2 myBatis 的特点当前有很多 Java 实现的持久化框架,而 MyBatis 流行起来有以下原因:
1)它消除了大量的 JDBC 冗余代码
Java 通过 JDBC 的 API 来操作关系型数据库,但是 JDBC 是一个非常底层的 API,我们需要书写大量的代码来完成对数据库的操作。例如一个插入操作,但是使用 mybatis 来完成相同的插入操作要简单方便灵活的多:
第一步:在 SQLMapper 映射配置文件中配置 SQL 语句,假定为 StudentMapper.xml
<insert id="insertStudent" parameterType="Student">
INSERT INTO STUDENTS(ID,NAME,EMAIL)
VALUES(#{id},#{name},#{email})
</insert>
第二步:创建一个 StudentMapper 接口
public interface StudentMapper{void insertStudent(Student student);
}
第三步:编写 java 代码完成插入操作:
SqlSession session = getSqlSessionFactory().openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
mapper.insertStudent(student); `
2)它有低的学习曲线
MyBatis 能够流行的首要原因之一在于它学习和使用起来非常简单,它取决于你 Java 和 SQL 方面的知识,如果开发人员很熟悉 Java 和 SQL,他们会发现 MyBatis 入门非常简单。
3)它能很好地与传统数据库协同工作
类比其他 ORM 框架,例如 相比较于 hibernate,mybatis 可以更加灵活的和数据库交互,sql 语句掌握在自己手里,可以灵活修改,而 hibernate 框架则是需要将实体类完全映射到数据到表中,这使得修改起来比较麻烦。
4)它可以接受 SQL 语句
类比其他 ORM 框架,例如 hibernate,hibernate 框架推荐让框架自动生成 sql 语句,这样以来就不能完全利用到数据库的一些特有的特性。
而 mybatis 框架则是推荐程序自己控制 sql 语句,这样就可以充分利用数据库特有的特性并且可以准备自定义的查询。
5)它提供了与 Spring 框架的集成支持
MyBatis 提供了与 Spring 框架的集成支持,这将进一步简化 MyBatis 的使用
6)它提供了与第三方缓存类库的集成支持
MyBatis 有内建的 SqlSession 级别的缓存机制,用于缓存 Select 语句查询出来的结果。
除此之外,MyBatis 提供了与多种第三方缓存类库的集成支持,如 EHCache,OSCache 等。
7)更好的性能
MyBatis 支持数据库连接池,消除了为每一个请求创建一个数据库连接的开销。
MyBatis 提供了内建的缓存机制,在 SqlSession 级别提供了对 SQL 查询结果的缓存。即:如果你调用了相同的 select 查询,MyBatis 会将放在缓存的结果返回,而不会去再查询数据库。
2.3 myBatis 使用三要素
1)在项目中导入 mybatis 的 jar 包
mybatis 的核心包只有一个 mybatis-3.x.x.jar,另外还有一些【可选】的依赖包(日志、代理等所需要的),在下载的压缩包中可以找到.
2)mybatis 框架中一般需要俩个文件(xml):
1> mybatis 的配置文件: mybatis-config.xml
配置信息包括有:数据库连接信息,类型别名,映射文件路径等等
特点:名字一般是固定的,位置是 src 下面
示例:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="Student" type="com.briup.pojo.Student" />
</typeAliases>
<environments default="development">
<environment id="development">
<transaction Manager type="JDBC" />
<dataSource type="POOLED">
<!--
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
-->
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE" />
<property name="username" value="test" />
<property name="password" value="test" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/briup/pojo/StudentMapper.xml" />
</mappers>
</configuration>
2> mybatis 的映射文件:XxxxMapper.xml
这个 xml 文件中包括 Xxxx 类所对应的数据库表的各种增删改查 sql 语句,例如:StudentMapper.xml 文件中是 Student 类对应的表的各种 select、insert、update、delete;
特点:名字一般为 XxxxMapper.xml,Xxxx 是对应类的名字,位置不固定,一般放到一个专门的 package 里面
示例:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.briup.pojo.StudentMapper">
<resultMap type="Student" id="StudentResult">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="email" column="email" />
</resultMap>
<select id="findAllStudents" resultMap="StudentResult">
SELECT * FROM STUDENTS
</select>
<select id="findStudentById" parameterType="int" resultType="Student">
SELECT ID AS STUDID, NAME, EMAIL
FROM STUDENTS WHERE ID=#{Id}
</select>
<insert id="insertStudent" parameterType="Student">
INSERT INTO STUDENTS(ID,NAME,EMAIL)
VALUES(#{id},#{name},#{email})
</insert>
</mapper>
3)mybatis 中的映射接口 XxxxMapper.java(对 XxxxMapper.xml 中的 sql 语句进行映射)
mybatis 中除了必须的 jar 包、各种 xml 配置文件之外,一般还需要有调用 sql 语句执行的接口:XxxxMapper.java
示例:
public interface StudentMapper{List<Student> findAllStudents();
Student findStudentById(Integer id);
void insertStudent(Student student);
}
注意 1:接口中的方法的名字和 XML 文件定义的 SQL 映射语句的名称要相同
注意 2:我们不需要去实现该接口,因为 mybatis 中提供了相应的方式在运行期间动态生成该接口的实现类对象.