引言
Java互联网应用可以通过mybatis框架访问数据库,使用MyBatis框架主要有一下三个优点:
- 不屏蔽SQL,开发人员可以更为精确地定位SQL语句,可以对其进行优化和改造,有利于互联网系统性能的提高
- 提供强大灵活的映射机制,提供动态SQL的功能,允许我们根据不同条件组装SQL,可维护性比较高
- 在MyBatis中,提供了Mapper的接口编程,只要一个XML和一个接口就能创建映射器,进一步简化工作,使开发人员更集中于业务逻辑
准备MyBatis环境
在搭建环境时用的是MyBatis版本为3.4.5(可能无法下载),我把它上传到了百度云盘, 密码: xwaa 方便大家下载.解压缩后会看如下文件目录
MyBatis核心组件
MyBatis组件有四部分:
- SqlSessionFactoryBuilder(构造器):它会根据配置或者代码来生成SqlSessionFactory,采用的是分步构建的Builder模式
- SqlSessionFactory(工厂接口):依靠它来生成SqlSession,使用的是工厂模式
- SqlSession(会话):既可以发送sql执行返回结果,也可以获取Mapper的接口.在现有的技术中,一般我们会让其在业务逻辑代码中小时,而使用的MyBatis体感那个的SQL Mapper接口编程技术,能提高代码的可读性和可维护性.
- SQL Mapper:MyBatis新设计的组件,它由一个Java接口和xml文件(或注解)构成,需要给出对应的映射规则.
构建SqlSessionFactory
在Mybatis中既可以通过读取配置的xml文件生成SqlSessionFactory,也可以通过Java代码的形式生成SqlSessionFactory.一般都采用xml的形式
而在MyBatis中,xml分为两类,一类是基础配置文件,一般只有一个,主要是配置一些最基本的上下文参数和运行环境;另一类是映射文件,配置映射关系、SQL、参数等信息。先看一份简易的基础配置文件,代码如下所示:
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 数据库环境配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<!--数据源配置 type=POOLED代表采用的MyBatis内部提供的连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/blogdemo"/>
<property name="username" value="root"/>
<property name="password" value="mysql123"/>
</dataSource>
</environment>
</environments>
<!--别名配置-->
<typeAliases>
<!-- 为单个类配置别名,Blogger代表ssm.blog.entity.Blogger -->
<typeAliases alias="Blogger" type="ssm.blog.entity.Blogger">
<!-- 为实体类包配置别名,整个包中的类都可以用类名作为别名 -->
<package name="ssm.blog.entity"/>
</typeAliases>
<!--映射文件配置-->
<mappers>
<package name="com.test.pojo"/>
</mappers>
</configuration>
有了基础配置文件,就可以用简短的代码生成SqlSessionFactory了,代码如下所示:
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 使用MyBatis提供的Resources类加载配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 构建SqlSession的工厂
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession getSession() {
return sqlSessionFactory.openSession();
}
}
首先读取mybatis-config.xml,然后通过SqlSessionFactoryBuilder的Builder方法去创建SqlSessionFactory。
SqlSession
在MyBatis中SqlSession是核心接口。它有两个实现类:一个是DefaultSqlSession,单线程使用;另一个是SqlSessionManager,在多线程环境下使用。SqlSession类似jdbc中的Connection对象,代表着一个资源的启用。主要有以下三个作用:
- 获取Mapper接口
- 发送SQL给数据库
- 控制数据库事务
它的创建方法也挺简单:
SqlSession sqlSession=sqlSessionFactory.openSession();
sqlSession控制数据库事务的方法:
SqlSession sqlsession=null;
try{
//打开Session会话
sqlsession=sqlSessionFactory.openSession();
//some code...
//提交事务
sqlsession.commit();
}catch(Exception e){
sqlsession.rollback;
}finally{
if(sqlsession!=null){
//确保资源被顺利关闭
sqlsession.close();
}
}