На языке Layman MyBatis: JDBC и представить MyBatis

база данных Hibernate MyBatis SQL

Недавно я был в отпуске по уходу за ребенком, и время было относительно раздроблено, я собираюсь прочитать две книги, чтобы обогатиться, одна «MyBatis простыми словами: технические принципы и практика», другая «Битва RabbitMQ: Эффективное развертывание распределенных очереди сообщений», чтобы углубить память и понять, организовать, расширить и документировать.

Цель чтения книги не в том, чтобы запомнить все детали, а в том, чтобы понять, на что способна технология в целом, ее особенности, базовые модули, принципы реализации и распространенные сценарии использования.

Эта статья представляет собой первую часть книги MyBatis. Сначала я вспоминаю связанные концепции JDBC, понимаю самый простой способ доступа к базе данных, предоставляемой Java, а затем знакомлю с основными функциями и основными компонентами MyBatis. Наконец, я расскажу говорить об общей структуре книги и понимать продолжение.Общее содержание статьи.

Понятия, связанные с JDBC

Программа на Java подключается к базе данных через JDBC. JDBC запрограммирован на SQL. JDBC - это некоторая спецификация столбца, предложенная Sun, определена только спецификация интерфейса. Конкретная реализация реализуется каждым производителем базы данных, это типичная переходный режим. .

Режим моста является структурным шаблоном проектирования, его основной особенностью является реализация абстракции и поведения отдельно от, соответственно, определения интерфейса, вы можете поддерживать независимость каждой части и иметь дело с их расширениями.

Спецификация JDBC

Так называемая спецификация должна сама определить стандартный интерфейс и сделать следующие абстракции: использовать Connection для представления соединения с базой данных, использовать Statement для выполнения SQL и использовать ResultSet для представления результата, возвращаемого SQL, что обеспечивает удобство. для данных. Оператор может быть создан из соединения, а оператор выполняет запрос для получения ResultSet.

Упомянутые выше Connection, Statement и ResultSet должны быть интерфейсами, а конкретная реализация предоставляется каждым поставщиком базы данных. Благодаря спецификации вы можете получить доступ к нескольким типам баз данных через унифицированный интерфейс и можете переключаться между базами данных по своему желанию.

управляемый базой данных

Как было сказано выше, реализация интерфейса предоставляется различными производителями, поэтому имена классов классов реализации не будут унифицированы.При создании объекта Connection код будет записывать определенный класс реализации на смерть.При переключении базы данных, код нужно изменить, чтобы Великий. Для решения этой проблемы абстрагируется понятие Драйвер.

Connection con=MySqlConnectionImpl("127.0.0.1",3306,"mi_user",userName,pwd);

Каждая база данных должна реализовать интерфейс Драйвера, а соединение с базой данных Соединение можно получить через Драйвер, который создается динамически с помощью механизма отражения.

Class.forName("com.mysql.jdbc.Drier");

Эта же программа может получить доступ к различным базам данных, управлять драйверами через DRIVERMANAGER, водитель должен быть зарегистрирован в Drivermanager при инициализации.

DriverManager предоставляет метод getConnection для установления соединения с базой данных:

Connection con=DriverManager.getConnection("127.0.0.1",3306,"mi_user",userName,pwd);

Если имеется несколько драйверов базы данных, как DriverManager их различает? Это необходимо указать в URL-адресе подключения к базе данных. Например, mysql необходимо добавить префикс jdbc:mysql:

String url= "jdbc:mysql://127.0.0.1:3306/mi_user";
Connection con=DriverManager.getConnection(url,userName,pwd)
источник данных

Источник данных DataSource содержит две части: пул соединений и управление пулом соединений, которые принято называть пулом соединений. При инициализации системы соединение с базой данных сохраняется в памяти в виде объекта, а когда к базе данных требуется доступ, из пула соединений извлекается установленный бездействующий объект соединения.

Используйте источник данных, получите его объект DataSource и динамически получите подключение к базе данных через объект. Кроме того, объект DataSource можно зарегистрировать в службе имен (JNDI), а объект DataSource можно получить через службу имен без жесткого кодирования драйвера.

DriverManager предоставляется JDBC1, а DataSource — это новая функция JDBC2, обеспечивающая лучший способ подключения к источникам данных.

Сравнение Hibernate и MyBatis

Благодаря приведенному выше введению традиционное программирование JDBC дает нам функцию подключения к базе данных, но его рабочая нагрузка относительно велика. Сначала подключитесь, затем обработайте базовую транзакцию JDBC, обработайте типы данных, а также захватите и обработайте возможные исключения. И закройте ресурс. правильно.

В практической работе JDBC редко используется для программирования, и предлагается модель ORM, которая в основном решает взаимное отображение между данными базы данных и объектами POJO.

И Hibernate, и Mybatis являются моделями ORM, Hibernate предоставляет модель отображения полной таблицы с высокой степенью инкапсуляции JDBC. Но Hibernate также имеет много недостатков, перечисленных ниже:

  • Неудобства, принесенные полным отображением стола, такие как необходимость отправки всех полей при обновлении;
  • Невозможно собрать другой SQL на основе разных условий;
  • Плохая поддержка многотабличных ассоциаций и сложных SQL-запросов, вам нужно написать свой собственный SQL, а после возврата вам нужно самостоятельно собрать данные в POJO;
  • не может эффективно поддерживать хранимые процедуры;
  • Хоть и есть HQL, но производительность оставляет желать лучшего, а большие интернет-системы часто нуждаются в оптимизации SQL, чего не умеет Hibernate.

В крупномасштабной интернет-среде гибкость, оптимизация SQL и сокращение передачи данных являются самыми основными методами оптимизации.Hibernate не может удовлетворить требования, и MyBatis предоставляет вам гибкий и удобный способ, который представляет собой полуавтоматическую структуру сопоставления.

MyBatis необходимо вручную сопоставить и предоставить POJO, SQL и отношение сопоставления, в то время как Hibernate для полного сопоставления таблиц необходимо только предоставить POJO и отношение сопоставления.

MyBatis может настроить динамический SQL, который может решить проблему изменения имени таблицы Hibernate в зависимости от времени, и перечислены различные условия. Он может оптимизировать SQL, определять правила сопоставления SQL с помощью конфигурации и поддерживать хранимые процедуры, что более удобно для некоторых сложных запросов SQL, требующих оптимизированной производительности.

основные компоненты

Основные компоненты в основном включают следующее:

  • SqlSessionFactoryBuilder: SqlSessionFactory будет создан в соответствии с кодом или информацией о конфигурации;
  • SqlSessionFactory: полагаться на фабрику для создания SqlSession;
  • SqlSession: это интерфейс, который может не только отправлять SQL для выполнения и возвращать результаты, но и получать Mapper;
  • SQL Mapper: Это недавно разработанный компонент MyBatis. Он состоит из интерфейса Java и файла XML. Необходимо указать соответствующие правила SQL и сопоставления. Он отвечает за отправку SQL для выполнения и возврат результата.
Построить SqlSessionFactory

Каждое приложение MyBatis сосредоточено на экземпляре SqlSessionFactory, которому поручено создание SqlSessions. SqlSession похож на объект JDBC Connection.

Существует два способа создания SqlSessionFactory: один — это способ конфигурации XML, другой — способ кода, рекомендуется использовать способ конфигурации XML.

Определите файл mybatis-config.xml следующим образом:

<? xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
 <properties resource="application.properties">
 </properties>
 
 <!-- 定义别名 -->
 <typeAliases>
 <typeAlias alias="role" type="com.learn.chapter2.po.Role"/>
 </typeAliases>
 
 <!-- 定义数据库信息.默认使用development数据库构建环境 -->
 <environments default="development">
    <environment id="development">
    <!-- 采用jdbc事务管理 -->
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
 </environments>
 
 <!-- 定义映射器 -->
 <mappers>
 <mapper resource="com\learn\chapter2\mapper\roleMapper.xml"/>
 </mappers>
</configuration>

Создать фабрику SqlSessionFactory

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
Создание SqlSession

SqlSession — это класс интерфейса, который играет роль фасада, а настоящая работа — это интерфейс Executor. Необходимо следить за тем, чтобы он был должным образом закрыт каждый раз, когда он израсходован.

SqlSession sqlSession=null;
try{
    sqlSession=sqlSessionFactory.openSession();
    //some code
    sqlSession.commit();
} catch(Exception ex){
    sqlSession.roolback();
} finally{
    if(sqlSession!=null){
        sqlSession.close();
    }
}
картограф

Mapper - это интерфейс Java, а файл XML (или заметки), состоящий из роли, следующим образом:

  • Определенные типы параметров
  • кеш описания
  • Описать оператор SQL
  • Определите отношение отображения между результатами запроса и объектами POJO.

Сначала определите интерфейс Java:

public interface RoleMapper{
    public Role getRole(Long id);
}

Затем определите XML-файл сопоставления, RoleMapper.xml.

<? xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 
 <mapper namespace ="com.learn.chapter2.mapper.RoleMapper">
    <select id="getRole" paramterType="long" resultType="role" >
        select id,role_name as roleName , note from t_role where id=#{id}
    </select>
 </mapper>

Определение роли объекта POJO относительно простое, поэтому оно не приводится. #{id} — параметр этого SQL.Псевдоним столбца SQL соответствует имени свойства POJO, и результат запроса этого оператора будет автоматически сопоставлен со свойством Role, которое является автоматическим сопоставлением.

Выполнить запрос

RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);
Role role=roleMapper.getRole(1L);
String roleName=role.getRoleName();
жизненный цикл компонента

SqlSessionFactory во всем жизненном цикле приложения MyBatis каждой базе данных соответствует только один SqlSessionFactory, который может реализовать класс инструмента и получить объект в одноэлементном режиме.

Жизненный цикл SqlSession находится в процессе запроса базы данных для обработки транзакций, это объект, небезопасный для потоков, и следует соблюдать особую осторожность, когда задействована многопоточность. Он выдерживает запросы и операции приложения и может выполнять несколько SQL-запросов для обеспечения согласованности транзакций.

Роль Mapper состоит в том, чтобы отправить SQL, а затем вернуть требуемые результаты, или выполнить SQL для изменения данных в базе данных, поэтому он должен быть в методе транзакции SqlSession, точно так же, как выполнение оператора SQL в JDBC, его максимальная область. такое же, как у SqlSession .

общая структура книги

Эта книга разделена на 3 части, которая последовательно вносит основное приложение, принцип и плагин и практическое применение MyBatis.

Основное применение

В основном расскажите, как эффективно использовать MyBatis:

  • Возможности MyBatis
  • Основные компоненты и их жизненный цикл
  • Конфигурация MyBatis
  • картограф
  • Динамический SQL
Принцип MyBatis

Углубленный исходный код для понимания внутреннего принципа работы MyBatis, а также методов и навыков разработки плагинов:

  • Познакомьтесь с анализом и принципом работы MyBatis, узнайте о методе построения SqlSession и о том, как работают четыре основных объекта.
  • Представляем плагины MyBatis
Практическое применение

В основном на некоторых практических сценариях MyBatis:

  • Познакомить с MyBatis-Spring и объяснить, как интегрировать приложения MyBatis в проекты Spring.
  • Представьте практические сценарии MyBatis, выберите несколько типичных сценариев и проанализируйте некоторые ошибки и потери производительности, которых разработчикам следует избегать в каждом сценарии.

В следующей части будет представлена ​​соответствующая конфигурация MyBatis, улучшенная настройка MyBatis для применения к различным бизнес-сценариям и предоставленные нам расширения.

Добро пожаловать, чтобы отсканировать QR-код ниже и подписаться на мою личную общедоступную учетную запись WeChat~

情情说