MyBatis 本是 apache 的一个开源项目 iBatis,后更名为 MyBatis,它 是一个优秀的持久层框架,对 jdbc 的操做数据库的过程进行封装,使开发者只须要关注 SQL 自己,而不须要花费精力去处理例如注册驱动、建立connection、建立statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。mysql
Mybatis 经过 xml 或注解的方式将要执行的各类 statement(statement、preparedStatemnt、CallableStatement)配置起来,并经过 Java 对象和 statement 中的 sql 进行映射生成最终执行的 sql 语句,最后由 Mybatis 框架执行 sql 并将结果映射成 Java 对象并返回。sql
(1)MyBatis 配置文件:数据库
SqlMapConfig.xml: 此文件做为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息。apache
mapper.xml: 即 sql 映射文件,文件中配置了操做数据库的 sql 语句。此文件须要在 SqlMapConfig.xml 中加载。编程
(2)经过 MyBatis 环境等配置信息构造 SqlSessionFactory, 即会话工厂。缓存
(3)由会话工厂建立 sqlSession ,即会话,操做数据库须要经过 sqlSession 进行。微信
(4)MyBatis 底层自定义了 Executor 执行器接口操做数据库,Executor 接口有两个实现,一个是基本执行器、一个是缓存执行器。mybatis
(5)Mapped Statement 是 MyBatis 一个底层封装对象,它包装了 MyBatis 配置信息及 sql 映射信息等。mapper.xml 文件中一个 sql 对应一个 Mapped Statement 对象,sql 的 id 便是 Mapped statement 的 id。架构
(6)Mapped Statement 对 sql 执行输入参数进行定义,包括 HashMap、基本类型、pojo,Executor 经过Mapped Statement 在执行 sql 前将输入的 Java 对象映射至 sql 中,输入参数映射就是 jdbc 编程中对preparedStatement 设置参数。app
(7)Mapped Statement 对 sql 执行输出结果进行定义,包括 HashMap、基本类型、pojo,Executor经过Mapped Statement 在执行 sql 后将输出结果映射至 Java 对象中,输出结果映射过程至关于 jdbc 编程中对结果的解析处理过程。
(1)JDBC 编程步骤
1)加载数据库驱动
2)建立并获取数据库连接
3)建立 jdbcstatement 对象
4)设置 sql 语句
5)设置 sql 语句中的参数(使用preparedStatement)
6)经过 statement 执行 sql 并获取结果
7)对 sql 执行结果进行解析处理
8)释放资源(resultSet、preparedstatement、connection)
(2)JDBC 程序实例
public class Test {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 经过驱动管理类获取数据库连接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root");
// 定义sql语句 ?表示占位符
String sql = "select * from user where username = ?";
// 获取预处理statement
preparedStatement = connection.prepareStatement(sql);
// 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "王五");
// 向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
// 遍历查询结果集
while (resultSet.next()) {
System.out.println(resultSet.getString("id") + " " + resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
复制代码
(3)传统 JDBC 程序问题总结
1)数据库链接建立、释放频繁形成系统资源浪费,从而影响系统性能。若是使用数据库链接池可解决此问题。
2)sql 语句在代码中硬编码,形成代码不易维护,实际应用中 sql 变化的可能较大,sql 变更须要改变 Java 代码。
3)使用 preparedStatement 向占有位符号传参数存在硬编码,由于 sql 语句的 where 条件不必定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
4) 对结果集解析存在硬编码(查询列名),sql 变化致使解析代码变化,系统不易维护,若是能将数据库记录封装成 pojo 对象解析比较方便。