Вообще говоря, изменение исходного кода структуры чрезвычайно рискованно и не изменяет его, если это не абсолютно необходимо. Но сегодня я тщательно реконструировал класс SQLSessionFactorybean, официально предоставленного Mybatis, который интегрирован с весной. Во -первых, у него есть менталитет проб и ошибок, а во -вторых, он имеет реалистичные потребности.
Позвольте мне сначала объяснить два момента:
Вообще говоря, рефакторинг относится к оптимизации кода без изменения функции, но рефакторинг, упомянутый в этой статье, также включает добавление функций.
Основные пакеты JAR (версии), используемые в этой статье: Spring-*-4.3.3.3.release.jar, Mybatis-3.4.1.jar, Mybatis-spring-1.3.0.jar
Давайте начнем с интеграции Mybatis и Spring.
1. Интегрируйте Mybatis и весну
<bean id = "sqlSessionFactory" p: dataSource-ref = "dataSource" p: configlocation = "classPath: mybatis/mybatis-config.xml"> <name = "mapperlocations"> <array> <value> classpath*: **/*.
The key class of integration is org.mybatis.spring.SqlSessionFactoryBean, which is a factory bean used to generate Mybatis global session factory SqlSessionFactory (that is, the factory bean that generates the session factory), and SqlSessionFactory is used to generate session SqlSession object (SqlSessionFactory is equivalent to DataSource, SqlSession is эквивалент подключению).
Где свойства (настроенные с использованием P -пространства или свойства Property Delp):
DataSource-это источник данных, который можно настроить с использованием DBCP, C3P0, Druid, JNDI-Lookup и других методов.
Configlocation - это глобальная конфигурация двигателя Mybatis, используемая для изменения поведения mybatis.
MapperLocations - это файл конфигурации скрипта SQLMapper (режим), который должен загрузить MyBatis.
Конечно, есть много других атрибутов, поэтому я не приведу пример здесь.
2. Зачем реконструировать
1. Оптимизация исходного кода
Функция SQLSessionFactoryBean состоит в том, чтобы генерировать SQLSessionFactory. Давайте посмотрим на этот метод (SQLSessionFactoryBean.java Line 384-538): /*** Построить {@code SQLSessionFactory}. может быть указан экземпляр @link configuration} напрямую (без файла конфигурации). ** @return sqlSessionFactory* @Throws ioException, если загрузка файла конфигурации*/Защищенный sqlSessionFactory buildSqlSessionFactory () throws ioException {infiguration; xmlConfiguration xmlConfulder = n nuxcepture; if -configuration! null) {configuration = this.configuration; if (configuration.getvariables () == null) {configuration.setVariables (this.configurationProperties);} else if (this.configurationProperties! null) {xmlconfigbuilder = new xmlconfigbuilder (this.configlocation.getInputStream (), null, this.configurationProperties); configuration = xmlConfigbuilder.getConfiguration ();} else {if (logger.isdebugelder () {{resebugerguration. или 'configlocation' не указан, используя конфигурацию mybatis по умолчанию ");} configuration = new configuration (); configuration.setvariables (this.configurationproperties);} if (this.objectfactory! = null) {configuration.setObjectForty (this.Objectfactory); {configuration.setObjectWrapperFactory (this.objectWrapperFactory);} if (this.vfs! = null) {configuration.setvfsimpl (this.vfs);} if (haslenget TokenizetoStringArray (this.TypealiasSpackage, configurableApplicationContext.config_location_delimiters); Для (String PackageToscan: TypeAliaspackageArray) {configuration.getTypealiasRegistry (). RegistralAliases (packageToscan, typealiassUpertype == null? Object.class: typealiasSupertype); if (logger.isdebugenabled ()). псевдонимы ");}}} if (! isempty (this.typealiases)) {for (class <?> typealias: this.typealias) {configuration.gettypealiasRegistr "'");}}} if (! isempty (this.plugins)) {for (plugin receptor: this.plugins) {configuration.addinterceptor (плагин); if (logger.isdebugenabled ()) {logger.debug ("Зарегистрированный плагин:' + плагин" "); (hasLength (this.TypeHandlerspackage)) {String [] typeHandLerspackageArray = tokenizetoStringArray (this.TypeHandlerSpackage, configurutableApplicationContext.config_location_delimiters); для (String PackageToscan: TypeHandlersPackageArray) {configuration.getTypeHandlerRegistry (). Register (packageToscan); if (logger.isdebugenabled ()) {logger.debug ("Сканированный пакет: '" + packageToscan + "' для обработчиков типа"); (! isempty (this.typehandlers)) {for (typehandler <?> typehandler: this.typehandlers) {configuration.getTypeHandlerRegistry (). Register (typehandler); if (logger.isdebugenabled ()) {logger.debug ("recediced type handler: ' + typehandler +"' etbug.); (this.DataBaseIdProvider! = null) {// Исправлено #64 SET DATABASEID перед PARSE MAPPER XMLSTRY {Configuration.SetDataBaseID (this.DataBaseIdProvider.getDataBaseId (this.DataSource);} Catch (sqlexception e) {throw newedioexception ("falle ate at aTABASE); (this.cache! = null) {configuration.addcache (this.cache);} if (xmlconfigbuilder! = null) {try {xmlconfigbuilder.parse (); if (logger.isdebugenabled ()) {logger.debug () файл parsed configure: ' + this this. "'");}} catch (Exception ex) {Throw new inestioException («Не удалось проанализировать ресурс конфигурации:« + this.configlocation, ex);} наконец {errorcontext.instance (). reset ();}} if (this.TersActionFactory == null) {this.TransActionFactory = new SpressMaredTrancementTractory (newReNcoromation (); Environment (this.Environment, this.TransactionFactory, this.Datasource)); if (! Isempty (this.mapperlocations)) {for (ресурс mapperlocation: this.mapperlocation Xmlmapperbuilder (mapperlocation.getinputstream (), configuration, mapperlocation.tostring (), configuration.getsqlfragments ()); xmlmapperbuilder.parse ();} Catch (Exception e) {Thress New intedioException («Не удалось отображать ресурс:». {ErrorContext.Instance (). Reset ();} if (logger.isdebugenabled ()) {logger.debug ("Парсированный файл Mapper: '" + mapperlocation + "'");}}} else {if (if logger.isdebugenabled () {noTrized 'noTperifive resporrication или noTrized' или noTrized 'или noTrized' или noTrified (или noTrablemoctoctoctocationsoctocationsoctocationsoctocations. Найдено ");}} вернуть this.sqlsessionFactoryBuilder.Build (configuration);}Несмотря на то, что Mybatis является отличной структурой настойчивости, если честно, этот код действительно не очень хороший и имеет много места для реконструкции и оптимизации.
2. Функциональное расширение
(1) Используйте схему для проверки SQLMapper
<!-DTD-режим-> <? XML version = "1.0" Encoding = "UTF-8"?> <! Doctype Mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> namespace = "org.dysd.dao.mybatis.config.iexampledao"> </mapper> <!-режим схемы-> <? xml version = "1.0" Encoding = "utf-8"? xmlns = "http://dysd.org/schema/sqlmapper" xsi: schemalocation = "http://dysd.org/schema/sqlmapper http://dysd.org/schema/sqlmapper.xsd "namespace =" org.dysd.dao.mybatis.config.iexampledao "> </mapper>
На первый взгляд, использование схемы является более сложным, но если в сочетании с IDE автоматические подсказки использования схемы более дружелюбны, а информация о проверке является более четкой. В то же время он также открывает окно для других разработчиков, чтобы они могли настраивать пространство имен на основе существующего пространства имен, таких как введение тега <Sognl>, использование экспрессии OGNL для настройки операторов SQL и т. Д.
(2) Настроить конфигурацию. SQLSessionFactoryBean предоставила больше параметров для пользовательской конфигурации, но все еще возможно потребовать более персонализированных настроек, таких как:
A. Установите тип результата по умолчанию. Для элементов <SELECT>, которые не устанавливают ResultType и ResultMap, вы можете установить тип возврата по умолчанию на карту после анализа, тем самым упрощая конфигурацию SQLMapper.
<!-Перед тем, как упростить-> <select id = "select" recouttype = "map"> select * from table_name where well1 = #{field1, jdbctype = varchar} </select> <!-после упрощения-> <select id = "select" select * from table_name, где Field1 = #{field1, jdbccepe = varchar} </select * select_name.B. Расширить исходный анализ параметров Mybatis. Нативная реализация анализа - DefaultParameterHandler. Эта реализация может быть унаследована и расширена. Например, для выражения свойства, префиксированного SPEL:, используйте SPEL для оценки значения.
(3) Для других расширений обратитесь к предыдущему блогу автора о расширении Mybatis
3. осуществимость реконструкции
(1) С точки зрения объема влияния кодекса
Ниже приведена структура наследования SQLSessionFactoryBean
Исходя из этого, мы видим, что система наследования SQLSessionFactoryBean не является сложной, и она не наследует другие родительские классы. Он реализует только три интерфейса весной (Eventlistener в JDK - это просто логотип). Кроме того, SQLSessionFactoryBean предназначен для пользователя End Development, без подклассов и никаких других классов, которые его называют, поэтому он очень мал с точки зрения объема воздействия на код.
(2) В реализации реконструкции вы можете создать новую SchemaSqlSessionFactoryBean, а затем код полностью скопирует SQLSessionFactoryBean в начале, изменяйте имя пакета и имя класса, а затем использовать это в качестве основы для реконструкции. Это относительно просто.
(3) В интегрированных приложениях вам нужно только изменять атрибуты класса в интегрированной конфигурации и пружине.
Выше приведено рефакторинг SQLSessionFactorybean, интегрированного с Mybatis и Spring, представленной вам. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!