Говоря о полуавтоматической развязке mybatis и реализации ORM

Java

В ходе разработки JAVA появилась серия фреймворков ORM, JPA, Hibernate, Mybatis и Spring jdbc, В этой серии Mybatis будет изучаться в будущем.

      

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

1. Согласно исходному коду Mybatis, он абстрагируется на три уровня: уровень базовой поддержки, уровень базовой обработки и уровень интерфейса.

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

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

4. Уровень интерфейса в основном предоставляет JAVA API.

      

В данной статье на основе схемы фреймворка будут решены следующие задачи:

Q1: Как сочетается принцип CRUD mybatis с анализом кода?

Q2: Почему полуавтоматический Mybatis более популярен, чем автоматизированный Hibernate?

Q3: Почему Mybatis может достичь слабой связи?

Принцип CRUD mybatis


Чтобы решить эту проблему, давайте взглянем на следующий код:

Функция, реализованная этим кодом, такова: запрашивать информацию о пользователе в соответствии с user_id. Из кода видно, что он примерно разделен на пять шагов:

Первый шаг: прочитать содержимое файла глобальной конфигурации mybatis mybatis-config.xml

Шаг 2. Создайте фабрику сеансов SqlSessionFactory.

Шаг 3. Создайте сеанс SQL SqlSession в соответствии с SqlSessionFactory.

Шаг четвертый: выполнить операцию запроса

在这里插入图片描述

Итак, давайте взглянем на содержимое Mybatis-config.xml:

Из содержимого видно, что в узлах , , и есть три подузла.

Итак, что же представляют собой эти три узла?

1. Узел свойств представляет собой узел свойств, который можно использовать для динамического получения ресурсов извне и использования полученных ресурсов для контекстного использования.Давайте посмотрим на содержимое jdbc.properties

#mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db_test?characterEncoding=UTF-8
username=root
password=root

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

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

Содержимое, которое узел свойств получает из jdbc.properties.

3. Узел сопоставления, узел сопоставления, используется для связывания файла сопоставления.Давайте посмотрим на содержимое файла сопоставления:

![Вставьте здесь описание изображения](https://img-blog.csdnimg.cn/20190619225440276.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L6UwjMTA2MzMy

Очевидно, это добавление, удаление и модификация SQL.

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

Q3: Почему Mybatis может достичь слабой связи?

Из приведенного выше анализа мы знаем, что при использовании mybatis в качестве платформы ORM для разработки наши операторы SQL записываются в файл конфигурации xml (например, userInfo-config.xml выше), таким образом решая традиционную жестко запрограммированную проблему.

Проблема сильной связи тонко реализует процесс от «жесткого кодирования» к «мягкому кодированию».

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

Однако оператору SQL, реализованному с помощью настраиваемого метода xml, это не нужно.

Q4: Почему полуавтоматический Mybatis более популярен, чем автоматизированный Hibernate?

С функциональной точки зрения Hibernate очень мощен, но ему нужно решить несколько проблем:

(1) исследование больших затрат. Во-первых, затраты времени на изучение Hibernate намного больше, чем у Mybatis, Mybatis быстрее освоится.

(2) тяжелый. Hibernate мощная другая сторона, которая отражает громоздкую сторону

(3) Инкапсулировать SQL. Hibernate инкапсулирует SQL и предоставляет пользователям только интерфейсы API, что является фундаментальным фактором, обуславливающим его негибкость.

Однако mybatis разделяет SQL и позволяет пользователям настраивать его.

Благодаря приведенному выше сравнению, причина, по которой Hibernate автоматизирован, заключается в том, что генерация SQL, анализ, выполнение и т. д. автоматически генерируются Hibernate;

Причина, по которой Mybatis является полуавтоматическим, заключается в том, что оператор SQL должен быть настроен пользователем, а анализ и выполнение SQL выполняется Mybatis.

Можно сказать, что традиционный jdbc — ручной, Hibernate — автоматизированный, а Mybati — полуавтоматический ORM-фреймворк, основанный на jdbc и Hibernate.

 

Два полных Mybatis CRUD


(1) Создайте проект веб-приложения

Откройте Intellij IDEA=>Создать новый проект=>Java Enterprise=>Проверить веб-приложение=>Далее=>

Назовите проект MybatisCRUD=>Готово

(2) Импортируйте пакет jar

В основном сюда импортируются два пакета jar: пакет jar драйвера MySQL и пакет jar Mybatis.

Структура проекта (Ctrl+Alt+Shift+S)=>Модули=>MybatisCRUD=>Зависимости=>Выберите JARS или каталоги...

Структура после успешного импорта выглядит следующим образом:

(3) Создать тестовые данные

#创建数据库
DROP DATABASE IF EXISTS db_test
CREATE DATABASE db_test

#创建数据表 DROP TABLE IF EXISTS User_Info

CREATE TABLE user_info ( user_id INT(5) AUTO_INCREMENT PRIMARY KEY NOT NULL,#用户id user_name VARCHAR(50) NOT NULL,#用户名 user_addr VARCHAR(100) NOT NULL #地址 )

#插入模拟数据 INSERT INTO user_Info(user_name,user_addr) VALUES('A','SH-PuDong'),('B','SH-YangPu'), ('C','SH-QingPu'),('D','SH-XuHui')

(4) Создать объект UserInfo

在这里插入图片描述

(5) Создайте три файла ресурсов

1.jdbc.property

#mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db_test?characterEncoding=UTF-8
username=root
password=root

2.mybatis-config.xml

123

3.userInfo.config.xml    

在这里插入图片描述

(6) КРУД

1. Запрос

package demo.mybatis.Test;

import demo.mybatis.entity.UserInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class TestMybatis {
    public static void main(String[] args) throws IOException {
        //读取配置文件内容
        String resource = "demo/mybatis/resources/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建SqlSessionFactory
        SqlSessionFactory sqlSF = new SqlSessionFactoryBuilder().build(inputStream);
        //创建SqlSession
        SqlSession sqlS = sqlSF.openSession();

        //根据id查询
        try {
            //查询user_id=2的记录
            List<UserInfo> list = sqlS.selectList("getUserInfoById", 2);
            for (UserInfo user : list) {
                System.out.println("UserName:" + user.getUser_name() + ",Addr:" + user.getUser_addr());
            }
        } finally {
            sqlS.close();
        }
    }
}

2. Добавить

package demo.mybatis.Test;

import demo.mybatis.entity.UserInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class TestMybatis {
    public static void main(String[] args) throws IOException {
        //读取配置文件内容
        String resource = "demo/mybatis/resources/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建SqlSessionFactory
        SqlSessionFactory sqlSF = new SqlSessionFactoryBuilder().build(inputStream);
        //创建SqlSession
        SqlSession sqlS = sqlSF.openSession();

        //添加数据
        try{
            UserInfo addUser = new UserInfo();
            addUser.setUser_name("E");
            addUser.setUser_addr("BJ-DongCheng");

            sqlS.selectList("addUserInfo",addUser);

            List<UserInfo> list=sqlS.selectList("listUserInfo");
            for (UserInfo user :list){
                System.out.println("UserName:"+user.getUser_name()+",Addr:"+user.getUser_addr());
            }
        }finally {
            sqlS.close();
        }
    }
}

3. Удалить

package demo.mybatis.Test;

import demo.mybatis.entity.UserInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class TestMybatis {
    public static void main(String[] args) throws IOException {
        //读取配置文件内容
        String resource = "demo/mybatis/resources/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建SqlSessionFactory
        SqlSessionFactory sqlSF = new SqlSessionFactoryBuilder().build(inputStream);
        //创建SqlSession
        SqlSession sqlS = sqlSF.openSession();

        //删除
        try{
            sqlS.selectList("delUserInfoById",12);

            List<UserInfo> list=sqlS.selectList("listUserInfo");
            for (UserInfo user :list){
                System.out.println("UserName:"+user.getUser_name()+",Addr:"+user.getUser_addr());
            }
        }finally {
            sqlS.close();
        }
    }
}

(7) Структура каталогов кода