学习编程是一门动手的过程,只有一边学习一边写代码才有效果,同时把自己学习的笔记和心得记录下来。学习Mybatis那么开始我们先从搭建Mybatis的环境开始。
一 下载Mybatis
输入网址:https://github.com/mybatis/mybatis-3/releases,进入到Mybatis的官网,我们就可以下载Mybatis,如下图所示:
我们下载Mybatis所需的jar包和源码包,学习Mybatis的时候会用到。
使用Mybatis项目可以参考http://mybatis.org/mybatis-3/zh/index.html
使用Mybatis-spring项目可以参考:http://mybatis.org/spring/zh/index
二 搭建开发环境
解压下载的Mybatis开发包可以看到如下如所示的目录:
这里的jar包分为两类,一类是mybatis本身的jar,另一类在lib文件夹里,mybatis所依赖的jar,而pdf则是提供的api文档。
使用Myeclipse创建一个web项目,使用的jdk是1.8,项目结构如下所示:
上面就是初始时的目录结构,后面我们需要需要根据需要加入jar包,编写mybatis的配置文件,还没会详细进行配置。
三 mybatis的基本构成
mybatis的核心组件包括下面几个:
SqlSessionFactoryBuilder(构造器):它会根据配置信息或者代码来生成SqlSessionFactory(工厂接口)。
SqlSessionFactory:依靠工厂来生成SqlSession(会话)
SqlSession:是一个既可以发送sql去执行并返回结果,也可以获取Mapper的接口。
SQL Mapper:它是Mybatis新设计的组件,它是由一个java接口和xml文件(注解)构成的,需要给出对应的sql和映射规则。它负责发送sql去执行,并返回结果。
四 构建SqlSessionFactory
每个Mybatis的应用都是以SqlSessionFactory的实例为中心。SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得。但是需要注意,SqlSessionFactory是一个工厂接口而不是实现类,它的任务是创建SqlSession。SqlSession类似于一个jdbc的Connection对象。Mybatis提供了两种模式去创建SqlSessionFactory:一种是通过xml配置的方式;另外一种是通过java代码的方式创建。在能够使用配置文件的时候,我们尽量使用配置文件,避免应编码,方便以后的修改和维护。
Configuration类存在于Mybatis整个应用的生命周期中,以便重复读取和运用。在内存中的数据计算机读取是最快的,我们解析一次配置的xml文件然后保存到Conguration类对象中,方便我们从这个对象中读取配置信息,性能高,单例占用空间小,基本不占用存储空间,而且可以反复使用。Conguration类对象保存这我们配置的mybatis信息。在mybatis中提供了两个SqlSessionFactory的实现类,DefaultSqlSessionFactory和SqlSessionManager。不过SqlSessionManager目前还没使用,mybatis中目前常用的是DefaultSqlSessionFactory。
1,使用xml方式构建
下面配置一个简单的xml,包含了获取数据库连接实例的数据源,决定事务范围和控制方式的事务管理器和映射器。xml配置文件的内容后面在详细说明,这里给出mybatis在这http://mybatis.org/mybatis-3/zh/index.html网址里面的一个参考配置:
<?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 type="com.jack.Role" alias="role"/>
</typeAliases>
<!-- 定义数据库信息,默认使用development数据库构建环境 -->
<environments default="development">
<environment id="development">
<!--采用jdbc事务管理 -->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
对上面的配置做一个简单的说明:
1) 这里配置了一个别名role,带代表的是一个Role类,这样我们就可以在Mybatis上下文中应用它。
2)配置了环境内容,它默认使用id是developer的环境配置,包含以下两 方面的内容。
采用jdbc事务管理模式
数据库的连接信息
配置映射器
这里引入了一个xml,它的作用是提供sql和sql对pojo的映射规则定义,它保护了映射里面的信息。Mybatis将解析这个xml,来为我们生成映射器。
现在使用xml的配置,我们使用代码来实现创建SqlSessionFactory,代码如下:
package com.mybatis.sql.session.factory;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisSqlSessionFactory {
public static void main(String args[]) {
// mybatis配置文件的路径
String resource = "org/mybatis/config/mybatis-config.xml";
InputStream inputStream = null;
try {
// 获取资源的输入流
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = null;
// 获取到SqlSessionFactory对象
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
}
上面我们创建了一个xml文件输入流,用SqlSessionFactoryBuilder读取xml的信息来创建SqlSessionFactory的对象。mybatis的解析程序会将mybatis-config.xml文件配置的信息解析到Configuration类对象里面,然后利用SqlSessionFactoryBuilder读取这个对象为我们创建SqlSessionFactory。
项目的目前结构如下:
Role类的代码如下:
package org.mybatis.pojo;
public class Role {
private Long id;
private String roleName;
private String note;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
}
2,使用代码的方式构建
除了使用xml配置的方式创建以外,还能使用java代码编码的方式来实现,但是不推荐。mybatis已经给我们提供了类和方法,我们只需要配置好就行。首先构建Configuration类对象,然后往这对象里面注册我们构建SqlSessionFactory所需的信息即可。下面是java代码的实现:
// 通过java代码来创建SqlSessionFactory
public static SqlSessionFactory createSqlSessionFactoryByJavaCode() {
// 构建数据库连接池
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
dataSource.setUsername("root");
dataSource.setPassword("root");
// 构建数据库事务方式
TransactionFactory transactionFactory = new JdbcTransactionFactory();
// 创建数据库运行环境
Environment enviroment = new Environment("development", transactionFactory, dataSource);
// 构建Configuration对象
Configuration configuration = new Configuration(enviroment);
// 注册一个mybatis上下文别名
configuration.getTypeAliasRegistry().registerAlias("role", Role.class);
// 加入一个映射器
configuration.addMapper(RoleMapper.class);
//
SqlSessionFactory selSesionFactory = new SqlSessionFactoryBuilder().build(configuration);
return selSesionFactory;
}
上面的代码做了如下的事情:
1)初始化一个数据库连接池
2)定义了jdbc的数据库事务管理方式
3)用数据库连接池和事务管理方式创建了一个数据库运行环境,并命名为development。
4)创建了一个Configuration类对象,并把数据库运行回家注册给它。
5)注册了一个Role的别名
6)加入了一个映射器
7)用SqlSessionFactoryBuilder通过Configuration对象创建SqlSessionFactory
五 创建SqlSession
SqlSession是一个接口类,而真正干活的是Executor接口。在Mybatis中SqlSession接口的实现类有两个,分别是DefaultSqlSession和SqlSessionManager。暂时不深入讨论Executor接口及其涉及的其他类,之关心SqlSession的用户即可。我们构建了SqlSessionFactory,然后生成Mybatis的门面接口SqlSession。SqlSession接口类似于jdbc中的connection接口对象,我们需要保证每次用完正常关闭它,所以正确的做饭是把关闭SqlSession接口的代码写到finally中,保证每次用完就关闭,把资源还给数据库。下面是伪代码的实现
SqlSession sqlSession = null;
try{
sqlSession =sqlSessionFactory.openSession();
//to do something
sqlSession.commit();
}catch(Exception ex){
System.err.println(ex.getMessage());
sqlSession.rollback();
}finally{
//在 finally中确保资源的关闭
if(sqlSession != null){
sqlSession.close();
}
}
这样sqlSession就被创建出来了,在finally语句中我们保证了它合理的关闭,让连接资源还给数据库,以便后续使用。
SqlSession的用途主要有以下两种:
1)获取映射器,让映射器通过命名空间和方法名称找到对应的sql,发送给数据库执行后返回结果。
2)直接通过命名信息去执行sql返回结果,这是ibatis版本留下的方式。在SqlSession层我们可以通过update,insert,select,delete等方法,带上SQL的id来操作xml配置好的sql,从而完成我们的工作;与此同时它也支持事务,通过commit,rollback方法提交或者回滚事务。
关于SqlSessionFactory和SqlSession的介绍就到这里了,有关详细的使用后续还会总结。