6.1 Mybatis简介
My Batis 的官方定义为: MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。MyB atis 避免了几乎所有的JDBC 代码和于动设置参数以及获取结果集。MyBatis 可以对配置和原生Map 使用简单的XML 或注解, 将接口和Java 的POJO ( Plain Old Java O均ect,普通的Java对象)映射成数据库中的记录。从这个官方定义可以看出,MyBatis 是基于一种SQL 到POJO 的模型,它需要我们提供SQL 、映射关系( XML 或者注解, 目前以XML 为主)和POJO 。但是对于SQL 和POJO 的映射关系, 它提供了自动映射和驼峰映射等, 使开发者的开发工作大大减少:由于没有屏蔽SQL ,这对于追求高响应和性能的互联网系统是十分重要的, 因此我们可以尽可能地通过SQL 去优化性能,也可以做少量的改变以适应灵活多变的互联网应用。与此同时, 它还能支持动态SQL ,以适应需求的变化。这样一个灵动的、高性能的持久层框架就呈现在我们面前,这些很符合当前互联网的需要。
My Batis 的配置文件包括两个大的部分, 一是基础配置文件, 一个是映射文件。在使用MyBatis 框架时需要将它的核心包和依赖包引入到应用程序中。如果是Web 应用,只需将核心包和依赖包复制到/WEB-INF/ lib 目录中。
6.2 导入开发包
如果用Maven的同学,这里引入maven依赖就好了
导入Mybatis开发包
- mybatis-3.1.1.jar
- commons-logging-1.1.1.jar
- log4j-1.2.16.jar
- cglib-2.2.2.jar
- asm-3.3.1.jar
导入mysql/oracle开发包
- mysql-connector-java-5.1.7-bin.jar
- Oracle 11g 11.2.0.1.0 JDBC_ojdbc6.jar
6.3 准备测试工作
创建一张表
create table students( id int(5) primary key, name varchar(10), sal double(8,2) );
|
创建实体:
public class Student { private Integer id; private String name; private Double sal;
public Student() { }
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Double getSal() { return sal; }
public void setSal(Double sal) { this.sal = sal; } }
|
6.4 创建mybatis配置文件
创建mybatis的配置文件,配置数据库的信息....数据库我们可以配置多个,但是默认的只能用一个...
<?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> <!-- 加载类路径下的属性文件 --> <properties resource="db.properties"/>
<!-- 设置一个默认的连接环境信息 --> <environments default="mysql_developer"> <!-- 连接环境信息,取一个任意唯一的名字 --> <environment id="mysql_developer"> <!-- mybatis使用jdbc事务管理方式 --> <transactionManager type="jdbc"/> <!-- mybatis使用连接池方式来获取连接 --> <dataSource type="pooled"> <!-- 配置与数据库交互的4个必要属性 --> <property name="driver" value="${mysql.driver}"/> <property name="url" value="${mysql.url}"/> <property name="username" value="${mysql.username}"/> <property name="password" value="${mysql.password}"/> </dataSource> </environment> <!-- 连接环境信息,取一个任意唯一的名字 --> <environment id="oracle_developer"> <!-- mybatis使用jdbc事务管理方式 --> <transactionManager type="jdbc"/> <!-- mybatis使用连接池方式来获取连接 --> <dataSource type="pooled"> <!-- 配置与数据库交互的4个必要属性 --> <property name="driver" value="${oracle.driver}"/> <property name="url" value="${oracle.url}"/> <property name="username" value="${oracle.username}"/> <property name="password" value="${oracle.password}"/> </dataSource> </environment> </environments> </configuration>
|
6.5 编写工具类测试是否获取到连接
使用Mybatis的API来创建一个工具类,通过mybatis配置文件与数据库的信息,得到Connection对象
package cn.itcast.javaee.mybatis.util;
import java.io.IOException; import java.io.Reader; import java.sql.Connection; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisUtil { private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); private static SqlSessionFactory sqlSessionFactory;
static{ try { Reader reader = Resources.getResourceAsReader("mybatis.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } }
private MybatisUtil(){}
public static SqlSession getSqlSession(){ SqlSession sqlSession = threadLocal.get(); if(sqlSession == null){ sqlSession = sqlSessionFactory.openSession(); threadLocal.set(sqlSession); } return sqlSession; }
public static void closeSqlSession(){ SqlSession sqlSession = threadLocal.get(); if(sqlSession != null){ sqlSession.close(); threadLocal.remove(); } }
public static void main(String[] args) { Connection conn = MybatisUtil.getSqlSession().getConnection(); System.out.println(conn!=null?"连接成功":"连接失败"); } }
|
6.6 创建实体与映射关系文件
配置实体与表的映射关系
<?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">
<!-- namespace属性是名称空间,必须唯一 --> <mapper namespace="cn.javaee.mybatis.Student"> <!-- resultMap标签:映射实体与表 type属性:表示实体全路径名 id属性:为实体与表的映射取一个任意的唯一的名字 --> <resultMap type="student" id="studentMap"> <!-- id标签:映射主键属性 result标签:映射非主键属性 property属性:实体的属性名 column属性:表的字段名 --> <id property="id" column="id"/> <result property="name" column="name"/> <result property="sal" column="sal"/> </resultMap>
</mapper>
|
现在我们已经有了Mybatis的配置文件和表与实体之前的映射文件了,因此我们要将配置文件和映射文件关联起来
<mappers> <mapper resource="StudentMapper.xml"/> </mappers>
|
在测试类上,我们是可以获取得到连接的
6.7 编写DAO
public class StudentDao {
public void add(Student student) throws Exception { SqlSession sqlSession = MybatisUtil.getSqlSession(); sqlSession.insert(); }
public static void main(String[] args) throws Exception {
StudentDao studentDao = new StudentDao();
Student student = new Student(1, "zhongfucheng", 10000D); studentDao.add(student);
} }
|
到现在为止,我们实体与表的映射文件仅仅映射了实体属性与表的字段的关系...
我们在Hibernate中如果想要插入数据什么的,只要调用save()方法就行了。Hibernate是自动化屏蔽掉了数据库的差异,而我们Mybatis是需要自己手动编写SQL代码的...
那么SQL代码是写在哪里的呢???明显地,我们作为一个框架,不可能在程序中写SQL,我们是在实体与表的映射文件中写的!
Mybatis实体与表的映射文件中提供了insert标签【SQL代码片段】供我们使用
<insert id="add" parameterType="Student">
INSERT INTO ZHONGFUCHENG.STUDENTS (ID, NAME, SAL) VALUES (#{id},#{name},#{sal}); </insert>
|
在程序中调用映射文件的SQL代码片段
public void add(Student student) throws Exception { SqlSession sqlSession = MybatisUtil.getSqlSession(); try{ sqlSession.insert("StudentID.add", student); sqlSession.commit(); }catch(Exception e){ e.printStackTrace(); sqlSession.rollback(); throw e; }finally{ MybatisUtil.closeSqlSession(); } }
|
值得注意的是:Mybatis中的事务是默认开启的,因此我们在完成操作以后,需要我们手动去提交事务!
6.8 Mybatis工作流程
- 通过Reader对象读取Mybatis映射文件
- 通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象
- 获取当前线程的SQLSession
- 事务默认开启
- 通过SQLSession读取映射文件中的操作编号,从而读取SQL语句
- 提交事务
- 关闭资源