1. Что такое MyBatis
MyBatis изначально был проектом с открытым исходным кодом apache, iBatis, а позже был переименован в MyBatis, Это отличная структура уровня сохраняемости, которая инкапсулирует процесс работы с базой данных в jdbc, так что разработчикам нужно только уделять внимание самому SQL, не тратя энергию. Например, регистрация драйвера, создание соединения, создание оператора, ручная установка параметров, получение набора результатов и т. д. Код сложного процесса jdbc.
Mybatis настраивает различные операторы для выполнения (оператор, PrepareStatemnt, CallableStatement) через xml или аннотации и генерирует окончательный исполняемый оператор sql, сопоставляя объект Java и sql в операторе, и, наконец, среда Mybatis выполняет sql и генерирует результат Сопоставление с объектом Java и возврат.
2. Детали архитектуры MyBatis
(1) Конфигурационный файл MyBatis:
SqlMapConfig.xml: как глобальный файл конфигурации MyBatis, этот файл настраивает операционную среду и другую информацию MyBatis.
mapper.xml: файл сопоставления sql, в котором настраиваются операторы sql для работы с базой данных. Этот файл необходимо загрузить в SqlMapConfig.xml.
(2) Создайте SqlSessionFactory через среду MyBatis и другую информацию о конфигурации, то есть фабрику сеансов.
(3) sqlSession создается фабрикой сеансов, то есть сеансом, и операции с базой данных необходимо выполнять через sqlSession.
(4) Нижний уровень MyBatis настраивает интерфейс исполнителя Executor для работы с базой данных.Интерфейс Executor имеет две реализации: один является базовым исполнителем, а другой - исполнителем кэша.
(5) Mapped Statement — это базовый объект инкапсуляции MyBatis, который упаковывает информацию о конфигурации MyBatis и информацию о сопоставлении sql. SQL-запрос в файле mapper.xml соответствует объекту оператора Mapped, а идентификатор sql — это идентификатор оператора Mapped.
(6) Сопоставленный оператор определяет входные параметры выполнения sql, включая HashMap, базовый тип, pojo, а Executor сопоставляет входные объекты Java с sql через сопоставленный оператор перед выполнением sql, Отображение входных параметров — это набор параметров для подготовленного статемента в программировании jdbc. .
(7) Сопоставленный оператор определяет выходные результаты выполнения sql, включая HashMap, базовые типы и pojo. Исполнитель сопоставляет выходные результаты с объектами Java после выполнения sql с помощью сопоставленного оператора. Процесс сопоставления выходных результатов эквивалентен сопоставлению результатов в программировании jdbc.Процесс синтаксического анализа.
3. Краткое изложение традиционных проблем программирования JDBC
(1) Этапы программирования JDBC
1) Загрузите драйвер базы данных
2) Создать и получить ссылку на базу данных
3) Создайте объекты JDBCStement
4) Установите оператор sql
5) Установите параметры в операторе sql (используя подготовленный статемент)
6) Выполнить sql через оператор и получить результат
7) Разобрать результат выполнения sql
8) Ресурсы освобождения (результат, подготовленный оператор, соединение)
(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) Существует жесткое кодирование в использовании подготовленногоСтатента для передачи параметров символу занятости, потому что условие where оператора sql не обязательно, их может быть больше или меньше, и код необходимо изменить, чтобы изменить sql, и система не проста в обслуживании.
4) Существует жесткое кодирование (имя столбца запроса) для синтаксического анализа набора результатов. Изменения SQL приводят к изменениям в коде синтаксического анализа, и система не проста в обслуживании. Удобнее инкапсулировать записи базы данных в объекты pojo для синтаксического анализа.