предисловие
Каковы основные компоненты мибатиса? Как это работает?
Что означают параметры конфигурационного файла mybatis?
MyBatis добавляет только занятия интерфейсами и никаких классов реализации. Почему я могу запросить напрямую?
Каково значение каждого параметра файла сопоставления картографа mybatis?
Какие механизмы mybatis-spring предоставляет для упрощения родного mybatis?
Как mybatis-springboot-starter упрощает и делает mybatis таким удобным в использовании? Каков процесс вызова кода?
содержание
Введение в jdbc
Знакомство с мибатисом
mybatis-spring
mybatis-spring-boot-starter
анализ исходного кода mybatis
инструмент генерации кода mybatis mybatis-generator
Плагин подкачки mybatis pagehelper
1. Введение в jdbc
1 Обзор
- jdbc — это набор спецификаций для операций с базами данных, предложенных компанией Sun.
- Подключение java-программы к БД осуществляется через спецификацию jdbc, что унифицирует интерфейс, и пользователю не нужно заботиться о разнице между нижними слоями каждого производителя БД при ее использовании.
- Конкретная реализация нижнего уровня различных баз данных осуществляется производителем базы данных, то есть драйвером базы данных.
2. Процесс разработки с jdbc
- Загрузить драйвер, Интерфейс драйвера
- Установить соединение, Интерфейс соединения
- Создать оператор, который выполняет SQL
- Выполнить SQL через оператор, вернуть результат выполнения в ResultSet и обработать
- освободить ресурсы
3. Резюме и размышления
- Рабочая нагрузка программирования JDBC, необходимость обрабатывать соединение, транзакцию, тип данных, различные соединения, операторы, набор результатов, соединение для отключения и т. д.
- В реальной разработке программирование jdbc не будет использоваться напрямую, но будет использоваться структура объектно-реляционной модели (ORM).
2. Знакомство с мибатисом
1 Обзор
mybatis — превосходная структура слоя сохраняемости, которая поддерживает пользовательские операторы SQL, избегая почти всех кодов JDBC и вручную устанавливая параметры, а также получая наборы результатов.
2. Как использовать
- Добавьте зависимости mybatis в файл pom.
- Прочитайте файл конфигурации, передайте информацию о конфигурации в метод сборки SQLSessionFoatoryBuilder, и постройте SQLSessionFactory
- Получить SqlSession с помощью SqlSessionFactory
- Вызовите getMapper из SqlSession, чтобы получить интерфейс сопоставления
- Вызовите метод добавления/удаления запроса в интерфейсе картографа для работы с базой данных.
3. Основные компоненты и API
- SqlSession: основной компонент mybatis, он может отправлять sql для выполнения и возвращать результат или получать интерфейс Mapper. Объект подключения, аналогичный jdbc
- SQLSessioniveFactory: создать класс SQLSession Factory, включая все методы создания экземпляра SQLSession
- SQLSessionFactoryBuilder: создание объекта SQLSessionFactory на основе информации о конфигурации configure или кода.
- SQL Mapper: он состоит из интерфейса Java и файла xml и предоставляет соответствующие правила sql и сопоставления, отвечающие за отправку sql для выполнения и возврата.
SqlSessionFactoryBuilder
- После создания SqlSessionFactory он больше не нужен, лучше всего использовать локальные переменные.
- Включенные функции показаны на рисунке ниже и позволяют создавать SqlSessionFactory различными методами.
- Класс конфигурации содержит все, что вам может понадобиться знать об экземпляре SqlSessionFactory.
SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)
SqlSessionFactory
- Каждое приложение Mybatis сосредоточено на экземпляре SqlSessionFactory, задачей которого является создание SqlSession.
- Каждая база данных соответствует одному. Во всем жизненном цикле приложения MyBATIS лучше всего для дизайна как синглтон или статический режим Singleton
- Метод построения: метод конфигурации xml и метод кода
- Включенные функции показаны ниже
//默认获取的方式,不自动提交(开启事务)
SqlSession openSession()
//是否自动提交
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
//事务的隔离级别:None,RU,RC,RR,Serial
SqlSession openSession(TransactionIsolationLevel level)
//查询类型:simple,batch,reuse
SqlSession openSession(ExecutorType execType,TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection connection)
//获取mybatis配置信息
Configuration getConfiguration();
SqlSession
- Каждый поток должен иметь свой собственный экземпляр SqlSession.
- Это интерфейсный класс, который действует как фасад, а настоящая работа — это интерфейс Executor.
- В процессе обращения к базе данных для обработки транзакций жизненный цикл не является потокобезопасным объектом и не может использоваться как статическая переменная класса. Будьте осторожны с многопоточностью
- Открывайте SqlSession каждый раз, когда вы его используете, и закрывайте его после операции.
//带参数的增删改查方法
<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement, Object parameter)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)
//不带参数的增删改查方法
<T> T selectOne(String statement)
<E> List<E> selectList(String statement)
<K,V> Map<K,V> selectMap(String statement, String mapKey)
int insert(String statement)
int update(String statement)
int delete(String statement)
//高级版本的增删该查方法,支持自定义返回行数和结果控制
<E> List<E> selectList (String statement, Object parameter, RowBounds rowBounds)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowbounds)
void select (String statement, Object parameter, ResultHandler<T> handler)
void select (String statement, Object parameter, RowBounds rowBounds, ResultHandler<T> handler)
//事务控制相关方法
void commit()
void commit(boolean force)
void rollback()
void rollback(boolean force)
//清除缓存。mybatis提供了本地缓存和二级缓存
void clearCache()
//关闭session
void close()
//获得configuration实例
Configuration getConfiguration()
//获得映射器
<T> T getMapper(Class<T> type)
mapper
- Интерфейс, используемый для связывания и сопоставления операторов SQL.
- Предоставляемые функции состоят из интерфейса Java и XML.
- Определите тип параметра
- кеш описания
- описать оператор sql
- Определите отношение отображения между результатами запроса и объектами POJO.
- Жизненный цикл меньше, чем SqlSession, как и выполнение sql в jdb.
- Нет необходимости отображать и закрывать маппер после использования
4. Инструкции по настройке Mybatis
4.1 Основной файл конфигурации
Документация для всех поддерживаемых элементов конфигурации:описание конфигурационного файла mybatis, самый внешний тег — это конфигурация, а вложенные теги:
-
свойства, которые можно настраивать извне и заменять динамически
-
typeAliases, определяет псевдонимы. Используется для сокращения подробных имен с указанием класса, связанных только с конфигурацией xml.
<typeAlias> <typeAlia alias="role" type="XXX"/> <package name="xxx"/> </typeAlias>
-
Мапперы, определите картографа, скажите mybatis, где найти картографа
<mappers> <mapper resource="xxx"/> <mapper url="file:://xxx"/> <mapper class="xxx"/> <!--包内的所有接口都注册为映射器--> <package name="xxx" /> </mappers>
-
typeHandlers для преобразования полученных значений в соответствующие типы Java
<typeHandlers> <typeHandler handler="xxx"> </typeHandlers>
mybatis предоставляет множество процессоров по умолчанию, и это лишь некоторые из них.
- BooleanTypeHandler: логическое значение
- StringTypeHandler: String-varchar, char
- IntegerTypeHandler: целое число
- DateTypeHandler: Отметка даты и времени
- EnumTypeHandler: хранит строки класса enum
- EnumOrdinalTypeHandler: сохраняет индекс класса перечисления.
Если стандартный процессор не соответствует требованиям, пользовательский процессор можно выборочно сопоставить с типом JDBC. Конкретные шаги заключаются в следующем:
- Реализовать интерфейс org.apache.ibatis.type.TypeHandler.
- Укажите тип jdbc, который будет отображаться процессором: укажите jdbc="xxx" в файле конфигурации typeHandler или используйте @MappedJdbcTypes в классе обработки.
- Укажите тип java для сопоставления с этим процессором:
-
Среды определяют, как настроить информацию о среде базы данных.
<environments> <environment> <transactionManager type="JDBC"> </transactionManager> <dataSource type="POOLED"> <property name="url" value="xxx"> ... </dataSource> </environment> </environments>
-
настройки, очень важный параметр
<settings> <!--全局开启映射器已经配置的任何缓存--> <setting name="cacheEnabled" value="true"/> <!--延迟加载的全局开关--> <setting name="lazyLoadingEnabled" value="true"/> <!--是否运行单一语句返回多条结果集--> <setting name="multipleResultSetsEnabled" value="true"/> <!--列标签代替列名--> <setting name="useColumnLabel" value="true"/> <!--运行jdbc支持自增长主键--> <setting name="useGeneratedKeys" value="false"/> <!--如何自动映射列到字段属性--> <setting name="autoMappingBehavior" value="PARTIAL"/> <!----> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <!--默认的执行器--> <setting name="defaultExecutorType" value="SIMPLE"/> <!--超时时间--> <setting name="defaultStatementTimeout" value="25"/> <!--日志框架,可选值有:SLF4J,LOG4J,JDK_LOGGING,COMMONS_LOGGING,STDOUT_LOGGING,NO_LOGGING--> <setting name="logImpl" value="LOG4J"/> <!----> <setting name="defaultFetchSize" value="100"/> <!----> <setting name="safeRowBoundsEnabled" value="false"/> <!--是否开启自动驼峰命名规则:下划线列名转驼峰变量名--> <setting name="mapUnderscoreToCamelCase" value="false"/> <!----> <setting name="localCacheScope" value="SESSION"/> <!----> <setting name="jdbcTypeForNull" value="OTHER"/> <!----> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> </settings>
-
objectFactory: фабричный класс, который создает объект результата, который можно настроить, чтобы переопределить значение по умолчанию.
<objectFactory type="XXX"> <property name="xx", value="xx"/> </objectFactory>
-
plugins: Перехватчик определения операции плагина, перехватывающий некоторые вызовы во время выполнения mybatis
4.2 Файл сопоставления Mapper
Файл сопоставления определяет операторы SQL, которые должны выполняться интерфейсом.Все поддерживаемые файлы сопоставления представлены в документе:описание файла сопоставления mybatis
- select
<select id="调用接口的函数名称,唯一标识" parameterType="参数类型,可省略,会根据typehandler自动推断" parameterMap="被废弃的选项" resultType="返回结果的类型,不能与resultMap同时存在" resultMap="返回结果的外部集合映射,不能与resultType同时存在。resultType为bean时,底层使用了resultMap" flushCache="设置为true表示任何时候调用都会清除本地和二级缓存,默认false" useCache="是否开启本地和二级缓存,默认为true" timeout="驱动等待数据库响应时间,默认为unset,依赖驱动" fetchSize="驱动每次批量返回结果数" statementType="默认preparedStatement" resultSetType="结果集类型,逗号分开"> select id, name from table_name where id = #{id} </select>
- Вставка / обновление / Удаление: Многие свойства такие же, как вставка
<insert ... useGeneratedKeys="是否取出数据库自增长得到的id,默认false" keyProperty=“generatedKey的目标属性字段” keyColumn=“generatedKey的目标列名,主键列不是第一列需要设置” > </insert>
- sql: определить многоразовые операторы sql
<sql id="xxx"> </sql> <!--调用的地方--> <include refid="xxx"/>
- resultMap: mybatis только самые важные и мощные элементы
<resultMap> <!--注入结果到构造方法中--> <constructor> <idArg column="" javatype=""> <arg> </constructor> <!--复杂类型的关联--> <association> </association> <!--复杂类型的集合--> <collection> </collection> </resultMap>
- cache: включить кеширование, которое не включено по умолчанию, за исключением локальных сессий
<!--开启可读可写缓存,所有select都被缓存,insert,delete和update刷新缓存,--> <cache <!--回收策略:包括LRU(默认),FIFO,SOFT,WEAK--> eviction="LRU" <!--刷新时间,单位毫秒--> flushInternval="60000" readOnly="true" <!--缓存存储的引用数量,默认1024--> size="512" /> <cache type="自定义缓存,必须实现org.mybatis.cache.Cache接口"/>
- cache-ref: обратиться к другому кешу
5. Динамический SQL
Динамический SQL: используется для включения части предложения where на основе условия. Динамический SQL, включая if, select, trim, foreach
<select/insert id="xx">
select id, name, status
from table_name
where status = #{status}
<!--普通的条件判断语句-->
<if test="name != null">
and name like #{name}
</if>
<!--条件分支语句,类似与switch-->
<choose>
<when test="name != null">
</when>
<otherwise>
</otherwise>
</choose>
<!--会自动去除条件不满足时多余的where,and,or等关键字-->
<where>
</where>
<!--自定义去除某些符号的功能-->
<trim prefix="WHERE" prefixOverrides="AND|OR">
</trim>
<set>
<if>
</set>
<foreach item="" index="" collection="">
</foreach>
</select>
IIIБАТИС ВЕСНА
1 Обзор
- Плавно интегрируйте mybatis в Spring, используя эту библиотеку классов, Spring загрузит необходимые фабричные классы и классы сеансов.
- Разрешить mybatis участвовать в управлении транзакциями Spring, используя Spring DataSourceTransactionManger
- Используя mybatis-spring, sqlSessionFactory и по крайней мере один класс преобразователя данных необходимо определить в контексте
2. Как использовать
- Добавьте зависимость mybatis-spring к pom
- Передайте источник данных в XML-файле Spring и настройте sqlSessionFactory.
- Настройте интерфейс сопоставления картографа в xml-файле spring
- Получите интерфейс сопоставления, который автоматически внедряется в контейнер в бизнес-коде, и вызовите методы добавления, удаления, изменения и проверки для работы с базой данных.
3. SqlSessionFactoryBean
- В предыдущем введении к собственному Mybatis SqlSessionFactory создается с помощью SqlSessionFactoryBuilder. И mybati-spring создается SqlSessionFactoryBean
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!--必须的属性,配置数据源--> <property name="dataSource" ref="dataSource" /> <!--可选属性,配置映射文件路径--> <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" /> </bean>
- SqlSessionFactoryBean реализует интерфейс Spring FactoryBean
- Он должен внедрить свойство dataSource
4. Настройте транзакции
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--数据源必须和SqlSessionFactoryBean配置的数据源一致-->
<property name="dataSource" ref="dataSource" />
</bean>
5. Использование SqlSession
- В нативном mybatis SqlSession получается через SqlSessionFactory, в mybatis-spring больше нет необходимости использовать SqlSessionFactory напрямую, потому что SqlSession автоматически внедряется как потокобезопасный bean-компонент.
- SqlSessionTemplate — это ядро mybatis-spring, которое реализует интерфейс SqlSession и отвечает за управление SqlSession. Он потокобезопасен и может вызываться несколькими Dao. Также отвечает за жизненный цикл SqlSession, включая операции закрытия, фиксации и отката.
- SqlSessionTemplate предназначен для замены стандартного DefaultSqlSession.
6. Внедрить маппер
- Чтобы писать бизнес-код слоя DAO вместо ручного вызова SqlSessionTemplate, mybatis-spring предоставляет класс реализации динамического прокси: MapperFactoryBean, который разработан как универсальный тип, который автоматически внедряет класс интерфейса сопоставления в класс службы без написания класса реализации. себя. Прокси будет создан автоматически
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
- Прокси-класс, созданный MapperFactoryBean, реализует интерфейс UserMapper и внедряется в приложение.
- Вместо того, чтобы вручную регистрировать каждый маппер, вы можете использовать MapperScannerConfigurer, который создаст все мапперы на пути и автоматически создаст MapperFactoryBean.
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>
4. Стартер Mybatis Springboot
1 Обзор
- Быстро создавайте приложение mybatis на основе springboot
- Используя mybatis-spring, нам нужно настроить интерфейс сопоставления SqlSessionFactory и mapper в xml.
- Используя mybatis-springboot-starter, dataSource будет автоматически обнаружен, и в соответствии с источником данных SqlSessionFactory будет автоматически создана и зарегистрирована с использованием SqlSessionFactoryBean, а также будет создан SqlSessionTemplate, автоматически просканированный для сопоставления, связанный с SqlSessionTemplate и впрыскивается в контейнер
- По умолчанию сканируются все интерфейсы с @Mapper, а некоторые пакеты сканируются кастомными, которые нужно аннотировать с помощью @MapperSacn
2. Как использовать
- Добавьте зависимость mybatis-spring-boot-starter к pom
- Добавить информацию об источнике данных и MyBatis, связанную с информацией о конфигурации для Application.xml
- Добавьте аннотацию @Mapper в интерфейс сопоставления или используйте @MapperScan для сканирования преобразователя всего пакета.
- Получите интерфейс картографа, который автоматически внедряется в контейнер в бизнес-коде, и вызовите метод добавления, удаления, изменения и проверки картографа для работы с базой данных.
3. Файл конфигурации
- Информация о конфигурации помещается в файл application.properties или application.yml с префиксом конфигурации mybatis. Конфигурация параметров такая же, как описанная ранее собственная конфигурация mybatis.
# application.properties
# 指定mybatis-config.xml文件的位置
mybatis.config-location=classpath:mybatis-config.xml
# 指定mapper的xml文件路径
mybatis.mapper-locations=classpath:com/xx
mybatis.executor-type=SIMPLE
# 指定别名的包,多个用逗号分开
mybatis.type-aliases-package=com.example.domain.model
mybatis.type-handlers-package=com.example.typehandler
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.default-fetch-size=100
mybatis.configuration.default-statement-timeout=30
5. Анализ исходного кода Mybatis
1. Описание упаковки банок, связанных с Mybatis
1.1 mybatis-spring-boot-starter.jar
- Существует только один файл pom и файл spring.provides, и некоторые официально предоставленные начальные форматы примерно таковы. Что действительно обрабатывает функцию автоматической настройки, так это то, что XXX-autoconfigure.jar выполняется
- Зависимости в pom: jdbc, mybatis, mybatis-spring, mybatis-spring-boot-autoconfigure (пакет jar, который действительно завершает автоматическую настройку)
- Предоставляет: Описывает, какие пакеты автоматически вводятся после настройки стартера.
1.2 mybatis-spring-boot-autoconfigure.jar
- xxx-autoconfigure — это пакет автоматической настройки, используемый по умолчанию для разработки стартового
- META-INF/spring.factories: имя класса, определяющее автоматическую настройку, — MybatisAutoConfiguration.
- MybatisProperties: указывает класс свойства, соответствующий информации о конфигурации в файле application.properties.
- MybatisAutoConfiguration: класс реализации автоматической настройки, где находится запись функции. Автоматически внедрить SqlSessionFactory в соответствии с DataSource, а затем автоматически внедрить SqlSessionTemplate в соответствии с SqlSessionFactory. Внутренние операции SqlSessionTemplate выполняются путем создания прокси-сервера sqlSessionProxy SqlSession.
1.3 mybatis-spring.jar
- Интеграционный пакет MyBatis и Spring
1.4 mybatis.jar
- Самый родной пакет mybatis
2. Загрузка файла конфигурации
2.1 UML-диаграммы
- Для доступа к уровню базы данных наиболее простым интерфейсом является SqlSession, его реализация по умолчанию — DefaultSqlSession, а SqlSessionTemplate используется в mybatis-spring.
- SqlSession создается фабрикой SqlSessionFactory, а sqlSessionFactory создается построителем SqlSessionFactoryBuilder.
- SqlSessionFactoryBuilder — это общий класс построения, с помощью которого создается SqlSessionFactory. SqlSessionFactoryBuilder можно вызывать непосредственно вручную.
- Для интеграции с Spring Mybatis предоставляет пакет jar mybatis-spring. Предоставленный класс SqlSessionFactoryBean внутренне инкапсулирует вызов SqlSessionFactoryBuilder.
- Springboot дополнительно предоставляет MybatisAutoConfiguration для автоматической настройки, внутренний метод sqlSessionFactory и, наконец, вызывает SqlSessionFactoryBean.
- Конфигурация предоставляет два типа данных, один из которых является входным классом: Среда, через данный файл конфигурации, информация о конфигурации
2.2 Отслеживание источника
-
Класс MybatisAutoConfiguration внутренне создает объект SqlSessionFactoryBean.
-
SqlSessionFactoryBean реализует интерфейс FactoryBean, поэтому, когда getBean получает экземпляр, фактически вызывается его метод getObject. Метод afterPropertiesSet вызывается внутри. Метод afterPropertiesSet переопределяется и внутренне вызывает buildSqlSessionFactory.
-
XMLConfigBuilder создается внутри buildSqlSessionFactory для анализа файла конфигурации mybatis.
-
Место для фактического разбора файла конфигурации
-
Корень анализируемого файла конфигурации — это конфигурация, а затем по очереди анализируются вложенные теги: включая наиболее важный тег картографов. Парсинг этой части находится во взаимно однозначном соответствии с описанными ранее конфигурационными файлами, все теги имеют соответствующий код для разбора тегов.
-
Для синтаксического анализа файла преобразователя метод parse класса XMLMapperBuilder специально вызывается внутри. Анализ этой части также полностью соответствует представленному ранее описанию конфигурационного файла маппера.
-
При анализе файла сопоставления начните с сопоставления корневых элементов, включая кэш дочерних узлов, карту параметров, карту результатов, выбор и т. д. Затем сохраните проанализированную информацию в объекте конфигурации.
-
Среди них методы синтаксического анализа операторов выбора, вставки, удаления и обновления:
-
После синтаксического анализа поместите его на карту, и каждый оператор sql соответствует объекту MappedStatement. Парсинг других атрибутов аналогичен, и большинство из них размещены на карте.
-
После разбора всех файлов конфигурации получите объект Configuration и передайте его в качестве параметра методу сборки SqlSessionFactoryBuilder.
-
SQLSessionFactoryBuilder создает класс defaultsqlsessionfactory в соответствии с параметром конфигурации
-
Конструктор DefaultSqlSessionFactory просто сохраняет Конфигурацию, когда вам нужно получить сессию, она создается в соответствии с внутренней конфигурацией.
-
После получения SqlSessionFactory создайте на его основе SqlSessionTemplate
-
Прокси-класс SqlSession создается внутри SqlSessionTemplate, и операция SqlSession без транзакции принудительно отправляется
3. Реализация динамических прокси
3.1 Обзор
Уровень Dao — это все интерфейсы. Он не реализует классы. Почему интерфейсы можно использовать напрямую? Это потому, что MyBbatis использует механизм динамического прокси JDK для динамического создания классов прокси, так как же класс прокси инкапсулирует SqlSession?
3.2 UML-диаграммы
3.3 Отслеживание источника
Зарегистрируйте маппер и создайте прокси-класс
- MapperScanConfiguration — это bean-компонент, который сканирует все файлы сопоставления в заданном пакете и регистрирует их в MapperRegistry.
- Метод addMappers в MapperRegistry создает MapperProxyFactory для каждого класса сопоставления под именем пакета и помещает его в карту.
- При получении картографа найдите соответствующий MapperProxyFactory на карте и передайте параметр sqlSession в newInstance, чтобы создать прокси-класс.
- Создание прокси-класса вызывает динамический прокси-метод JDK, прокси-класс — это интерфейс DAO, а прокси-класс — MapperProxy.
- MapperProxy реализует InvocationHandler и переопределяет метод вызова. Этот метод в основном вызывает метод выполнения MapperMethod.
- Для создания MapperMethod требуются три параметра: сам интерфейс DAO, класс метода и объект конфигурации.
- Внутри MapperMethod создаются два новых класса: SqlCommand, MethodSignature.
- SqlCommand в основном сохраняет имя метода и тип SQL-запроса запрашиваемого метода интерфейса.Оба этих значения необходимо сначала запросить у MappedStatemen.
- Запрос MappedStatement должен найти на карте конфигурацию, сохраненную после завершения синтаксического анализа файла, как упоминалось в предыдущей главе.
- MethodSignature в основном сохраняет параметры, возвращаемые значения, типы возвращаемых значений и другую информацию, в основном анализирует класс Method.
- Когда MapperMethod выполняет execute, он выполняет различные операции в соответствии с некоторыми свойствами SqlCommand и MethodSignature, созданными ранее, и эти операции вызывают интерфейс SqlSession. Например, в операторе select в xml тип в SqlCommand указан как SELECT, а execute выполняет разные методы в соответствии с разными типами. Является ли возвращаемый тип в xml одной записью или несколькими записями. Соответствующие различным атрибутам MethodSignature соответственно, а затем выполнять разные методы.
Получить маппер и выполнить
- Регистрация маппера вводится через метод addMappers в MapperRegistry, а метод получения маппера — это getMapper, так кто же будет вызывать этот метод getMapper?
- Когда мы используем аннотацию @Autowired в сервисе для получения интерфейса сопоставления, мы фактически вызываем bean-компонент, который Spring автоматически внедряет для нас.Эта операция выполняется универсальным классом MapperFactoryBean. Как и SqlSessionFactoryBean, MapperFactoryBean реализует интерфейс FactoryBean, поэтому, когда getBean получает экземпляр, фактически вызывается его метод getObject. getObejct внутренне вызывает метод getMapper через sqlSession, что позволяет избежать ручного вызова метода getMapper через sqlSession каждый раз в собственном mybatis.
- Объект сеанса является свойством родительского класса SqlSessionDaoSupport для MapperFactoryBean, а внутренний конкретный класс реализации — SqlSessionTemplate.
- Метод getMapper SqlSessionTemplate фактически вызывает метод getMapper конфигурации.
- Метод getMapper в Configuration вызывается в классе MapperRegistry, описанном в предыдущем разделе, после выполнения всех динамических проксей в него помещается объект карты.
6. Генератор Mybatis
1 Обзор
- Генератор mybatis — это инструмент для автоматической генерации кода mybatis.официальная документация,китайский документ
- Генерируемый контент включает в себя:
- Объект Entity: укажите класс сущности Java, соответствующий указанной таблице в базе данных.
- Mapper XML-файл: каждая таблица соответствующая оператора Crud SQL
- Интерфейс DAO: интерфейс запросов Java, соответствующий оператору SQL.
- На что следует обратить внимание при многократном создании:
- XML-файлы будут автоматически объединены и не будут перезаписывать существующий контент.
- java файлы не будут объединены, по умолчанию будет создан файл с другим именем. Исходный файл может быть перезаписан конфигурацией параметров
2. Как использовать
2.1 Используйте командную строку для запуска
- определить файл конфигурации
- выполните следующую команду
java -jar mybatis-generator-core-x.x.x.jar -configfile \temp\generatorConfig.xml -overwrite
2.2 Использование в spring или springboot
- Добавьте зависимости в pom
<build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>${mybatis-generator.version}</version> <configuration> <overwrite>true</overwrite> <verbose>true</verbose> </configuration> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> </dependencies> </plugin> </plugins> </build>
- Запустите плагин
3. Описание конфигурационного файла
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--非必填选项,用于添加运行类路径位置到类路径中-->
<classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />
<!--元素用于指定生成一组对象的环境-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<!--注释生成器的属性-->
<commentGenerator>
<property name="suppressDate" value="true" />
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--指定数据库连接信息-->
<jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
connectionURL="jdbc:db2:TEST"
userId="db2admin"
password="db2admin">
</jdbcConnection>
<!--用于定义Java类型解析器的属性-->
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 生成实体类的包名和位置-->
<javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 生成mapper xml文件的包名和位置-->
<sqlMapGenerator targetPackage="test.xml" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetPackage="xx" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--指定生成哪个表的信息-->
<table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
<property name="useActualColumnNames" value="true"/>
<!--指定自动生成的主键-->
<generatedKey column="ID" sqlStatement="DB2" identity="true" />
<columnOverride column="DATE_FIELD" property="startDate" />
<ignoreColumn column="FRED" />
<!--自定义列信息,覆盖默认信息,包括property,javaType,jdbcType,typeHandler,delimitedColumnName属性-->
<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
</table>
</context>
</generatorConfiguration>
7. Помощник по страницам
1 Обзор
- плагин подкачки для mybatis,Документация, или адрес гитхабагитхаб-адрес, интеграция со спрингбутомspringboot-pagehelper
2. Как использовать
- Добавить зависимости SpringBoot
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>${pageHelper.version}</version> </dependency>
- Добавьте инструкции по настройке в application.properties
# 分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言 pagehelper.helperDialect=mysql # 分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, # pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。 pagehelper.reasonable=true # 默认值为false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。 pagehelper.row-bounds-with-count=false # 为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值 # 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 # 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero pagehelper.params= # 支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中, # 自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页 pagehelper.supportMethodsArguments=false # 默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 # 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型) pagehelper.pageSizeZero=false # autoRuntimeDialect:默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 # pring 中配置了动态数据源,并且连接不同类型的数据库,这时你可以配置为true pagehelper.autoRuntimeDialect: false # 默认值为 true。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, # 通过该属性来设置是否关闭获取的这个连接,默认true关闭,设置为 false 后,不会关闭获取的连接 # 这个参数的设置要根据自己选择的数据源来决定 pagehelper.close-conn=false
- Вызов в коде
//方法一:Mapper接口方式的调用,startPage,推荐这种使用方式。 PageHelper.startPage(1, 10); List<Country> list = countryMapper.selectIf(1); //方法二:Mapper接口方式的调用,offsetPage, 推荐这种使用方式。 PageHelper.offsetPage(1, 10); List<Country> list = countryMapper.selectIf(1); //方法三:参数方法调用 //存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数 public interface CountryMapper { List<Country> selectByPageNumSize( @Param("user") User user, @Param("pageNum") int pageNum, @Param("pageSize") int pageSize); } //配置supportMethodsArguments=true //在代码中直接调用: List<Country> list = countryMapper.selectByPageNumSize(user, 1, 10); //方法四:java8 lambda调用 //jdk8 lambda用法 Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(()-> countryMapper.selectGroupBy()); pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> countryMapper.selectGroupBy()); //count查询,返回一个查询语句的count数 total = PageHelper.count(()->countryMapper.selectLike(country));
3. Будьте осторожны
- PageHelper.startPage использует статический ThreadLocal, пейджинг и привязку к потоку.При использовании startPage за ним должен следовать запрос dao, чтобы пейджинг вступил в силу.