MyBatis 3.5 入门介绍
前言
MyBatis的读音是:[mai'bətɪs],中文音译:麦-波蒂斯,MyBatis的前世是ibatis,这个词是由"internet"和"abatis"组合而成,创始人是Clinton Begin。
abatis的读音是:['æbətɪs],其含义是:篱笆墙。篱笆墙又叫栅栏、护栏,是用来保护院子的一种设施,一般都是由木头,棍子,竹子,芦苇、灌木或者石头构成,常见于我国北方农村以及欧美等地广人稀的国家,用于保护院子。
ibatis一词来源于"internet"和"abatis"的组合,其目的是想当做互联网的篱笆墙,是围绕着数据库提供持久化服务的一个框架。
ibatis是由Clinton Begin在2001年发起的Java开源项目,后迁移至Apache Software Foundation,其官网地址是:http://ibatis.apache.org/。其后,ibatis提供了两种语言实现的版本,包括:Java、.NET。Java语言版本的主要作者仍是Clinton Begin。
由于某种原因,ibatis在2010年6月16日从Apache Software Foundation退出,然后被谷歌托管,并更名于MyBatis,新官方网址为:http://www.mybatis.org/,后来,几经周转,MyBatis代码最后的落脚地是托管在GitHub。
1、MyBatis是什么?
MyBatis是一个优秀的持久层框架,它对JDBC的操作数据库的过程进行封装。这个封装的路线是这样的:
java.sql.Statement -> MyBatis的Executor -> MyBatis的SqlSession
推荐阅读1:MyBatis核心对象SqlSession介绍
推荐阅读2:MyBatis的工作原理以及核心流程介绍
MyBatis使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建Connection、创建Statement、手动设置参数、结果集检索等JDBC繁杂的过程代码。
MyBatis通过xml或注解的方式将要执行的各种Statement(Statement、PreparedStatement、CallableStatement)配置起来,并通过Java对象和Statement中的SQL进行映射生成最终执行的SQL语句,最后由MyBatis框架执行SQL并将结果映射成Java对象并返回。
2、分析原生态JDBC程序中存在的问题
2.1、原生态JDBC程序代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Test
{
public static void main(String[] args)
{
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try
{
//1、加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","root", "root");
//3、定义sql语句,?表示占位符
String sql = "select * from user where username = ?";
//4、获取预处理statement
preparedStatement = connection.prepareStatement(sql);
//5、设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "admin");
//6、向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
//7、遍历查询结果集
while (resultSet.next())
{
System.out.println(resultSet.getString("id") + " " + resultSet.getString("username"));
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
//8、释放资源
if (resultSet != null)
{
try
{
resultSet.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
if (preparedStatement != null)
{
try
{
preparedStatement.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
if (connection != null)
{
try
{
connection.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
}
}
2.2、JDBC问题总结
(1)数据库连接频繁开启和关闭,会严重影响数据库的性能。
(2)代码中存在硬编码,分别是数据库部分的硬编码和SQL执行部分的硬编码。
3、MyBatis框架设计与核心对象
3.1、MyBatis框架图
3.2、MyBatis核心对象
3.2.1 SqlSessionFactory 与 SqlSessionFactoryBuilder
SqlSessionFactory是MyBatis的核心对象,它是创建SqlSession的工厂类。
SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。
每一个MyBatis的应用程序都是以一个SqlSessionFactory实例为核心。同时,SqlSessionFactory是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建多次,建议使用单例模式。
3.2.2 SqlSession
SqlSession是MyBatis的关键对象,类似于JDBC中的Connection,它是应用程序与持久层之间执行交互操作的一个单线程对象。
SqlSession的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句。
SqlSession是线程不安全的,每个线程都应该有它自己的SqlSession实例,SqlSession的实例不能被共享。不能将SqlSeesion实例的引用当做一个类的静态属性。
4、MyBatis执行过程
第一步:MyBatis通过读取配置文件信息(全局配置文件和映射文件),构造出SqlSessionFactory,即会话工厂。
MyBatis配置文件,包括MyBatis全局配置文件和MyBatis映射文件,其中全局配置文件配置了数据源、事务等信息;映射文件配置了SQL执行相关的信息。
第二步:通过SqlSessionFactory,MyBatis可以创建SqlSession(即会话),MyBatis是通过SqlSession来操作数据库的。
第三步:MyBatis操作数据库。SqlSession本身不能直接操作数据库,它是通过底层的Executor执行器接口来操作数据库的。Executor接口有两个实现类,一个是普通执行器,一个是缓存执行器(默认)。Executor执行器要处理的SQL信息是封装到一个底层对象MappedStatement中。该对象包括:SQL语句、输入参数映射信息、输出结果集映射信息。其中输入参数和输出结果的映射类型包括Java的简单类型、HashMap集合对象、POJO对象类型。
代码如下所示:
public class App
{
public static void main(String[] args) throws Exception
{
// 读取mybatis-config.xml文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 初始化mybatis,创建SqlSessionFactory类的实例
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 创建Session实例
SqlSession session = sqlSessionFactory.openSession();
// 操作数据库方法一:获得xml映射文件中定义的操作语句
Person p = session.selectOne("cn.mybatis.mydemo.mapper.PersonMapper.selectPersonById", 1);
// 打印Peson对象
System.out.println(p);
// 操作数据库方法二:获得mapper接口的代理对象
PersonMapper pm = session.getMapper(PersonMapper.class);
// 直接调用接口的方法,查询id为1的Peson数据
Person p2 = pm.selectPersonById(1);
// 打印Peson对象
System.out.println(p2);
// 提交事务
session.commit();
// 关闭Session
session.close();
}
}
5、MyBatis最新版本介绍
MyBatis最新版本是:3.5.2,发布时间是:2019年7月15日,更多介绍请移步:http://www.mybatis.cn/archives/673.html
下载地址为:https://github.com/mybatis/mybatis-3/releases。
当前大多数人主要使用MyBatis 3.4版本,建议大家及时升级。
6、MyBatis技术支持
欢迎关注MyBatis中文官网,我们愿意与您一同领略MyBatis的伟大和神奇。
最后请认准官方域名:http://www.mybatis.cn/,欢迎加入网站微信技术交流群。
7、MyBatis更多介绍
横看成岭侧成峰,远近高低各不同。从不同的角度,能看到mybatis的不同侧面,更多入门介绍请移步:MyBatis更多介绍...