文章目录
1 什么是MyBatis
MyBatis的读音是:[mai’bətɪs],中文音译:麦-波蒂斯,MyBatis的前世是ibatis,这个词是由"internet"和"abatis"组合而成,创始人是Clinton Begin。
abatis的读音是:['æbətɪs],其含义是:篱笆墙。篱笆墙又叫栅栏、护栏,是用来保护院子的一种设施,一般都是由木头,棍子,竹子,芦苇、灌木或者石头构成,常见于我国北方农村以及欧美等地广人稀的国家,用于保护院子。
ibatis一词来源于"internet"和"abatis"的组合,其目的是想当做互联网的篱笆墙,是围绕着数据库提供持久化服务的一个框架。并且是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML注解来配置和映射原始类型、接口和Java POJO(Plain Old Java Object,普通老式Java对象)为数据库中的记录。
(1)持久层框架
(2)自定义SQL、存储过程以及高级映射
(3)免除大部分JDBC代码以及设置参数和获取结果集的工作
(4)通过XML注解来配置和映射原始类型、接口和POJO为数据库中的记录
MyBatis是一个优秀的持久层框架,它对JDBC的操作数据库的过程进行封装。这个封装的路线是这样的:java.sql.Statement -> MyBatis的Executor -> MyBatis的SqlSession
MyBatis使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建Connection、创建Statement、手动设置参数、结果集检索等JDBC繁杂的过程代码。
MyBatis通过xml或注解的方式将要执行的各种Statement(Statement、PreparedStatement、CallableStatement)配置起来,并通过Java对象和Statement中的SQL进行映射生成最终执行的SQL语句,最后由MyBatis框架执行SQL并将结果映射成Java对象并返回。
Mybatis主要分为三层:
(1)API接口层,暴露给开发者使用。
(2)核心处理层,实现MyBatis内部流程。
(3)基础模块层,提供通用的模块功能,例如缓存、反射等等功能。
2 分析原生态JDBC程序中存在的问题
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)