De um modo geral, modificar o código -fonte da estrutura é extremamente arriscado e não o modifica, a menos que seja absolutamente necessário. Hoje, porém, reconstruí cuidadosamente a classe SQLSessionFactoryBean oficialmente fornecida pela Mybatis, que é integrada à primavera. Primeiro, possui uma mentalidade de tentativa e erro e, segundo, tem necessidades realistas.
Deixe -me explicar dois pontos primeiro:
De um modo geral, a refatoração refere -se à otimização do código sem alterar a função, mas a refatoração mencionada neste artigo também inclui a adição de funções.
Os pacotes principais jar (versões) usados neste artigo: primavera-*-4.3.3.release.jar, mybatis-3.4.1.jar, mybatis-spring-1.3.0.jar
Vamos começar com a integração de Mybatis e primavera.
1. Integrar mybatis e primavera
<bean id = "sqlsessionFactory" p: dataSource-ref = "DataSource" p: configLocation = "Classpath: mybatis/mybatis-config.xml"> <nome da propriedade = "MapPerlocations"> <Array> <Value>/ClassPath*: **/*. Sqlmapper
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 equivalente à conexão).
Onde as propriedades (configuradas usando o espaço nomes P ou o elemento infantil de propriedade):
O DataSource é uma fonte de dados, que pode ser configurada usando o DBCP, C3P0, Druid, JNDi-Lookup e outros métodos.
O ConfigLocation é uma configuração global do mecanismo Mybatis, usado para modificar o comportamento de Mybatis.
O MapperLocações é o arquivo de configuração de script SQLMAPPA (modo) que o mybatis precisa carregar.
Obviamente, existem muitos outros atributos, então não darei um exemplo aqui.
2. Por que reconstruir
1. Otimização do código -fonte
A função do SQLSessionFactoryBean é gerar SQLSessionFactory. Vamos dar uma olhada neste método (SQLSessionFactoryBean.java Linha 384-538): /*** Construa um {@code sqlSessionFactory} instância. ** A implementação padrão usa o MyBatis padrão {@code xmlfigbuilder} para construir A* { ser especificado a {@link Configuration} Instância diretamente (sem arquivo de configuração). ** @return sqlSessionFactory* @THOWSowsception Se o carregamento do arquivo de configuração falhou*/protegido sqlSessionFactory BuildSqlSessionFigBory () Throws IoException {Configuration; ! = null) {configuration = this.configuration; if (Configuration.getVariables () == null) {Configuration.SetVariables (this.configurationProperties);} else (this.configurationProperties! This Null) {confium.getVariables (). (this.configLocation! = null) {xmlConfigBuilder = new XmlConfigBuilder (this.configLocation.getInputStream (), null, this.configurationProperties); configatury = xmlconfigbuilder.getConfiguration (); {Logger.debug ("Propriedade` Configuration` ou 'ConfigLocation' não especificada, usando a configuração MyBatis padrão ");} Configuration = new Configuration (); Configuration.SetVariAbles (this.configurationProperties); (this.ObjectWrapperFactory! = NULL) {Configuration.SetObjectWrapperFactory (this.ObjectWrapperFactory);} if (this.vfs! tokenizetoStringArray (this.typealiasespackage, configurableApplicationContext.config_location_delimiters); para (String Packagetoscan: typeAliaspackAGearray) {Configuration.gettypealiasReGistry (). Registeraliases (packagetoscan, typeAliasessUperType == NULL? Object.Class: typeAliasEssuPerType); if (logger.isdebugETabled ()) {logger.D. aliases ");}}} if (! isEmpty (this.typealiases)) {for (class <?> typeAlias: this.typealiases) {configatury.gettypealiasReGistry (). "'');}}} if (! isEmpty (this.plugins)) {for (plugin interceptor: this.plugins) {Configuration.addinterceptor (plugin); if (logger.isdebugenabled ()) {logger.debug (" RegisterEd. '" + plugin +" "" ")") ") (hasLength (this.typeHandlerspackage)) {String [] typeHandLersPackAGearray = TokenizEToStringArray (this.typeHandlerspackage, configurableApplicationContext.config_location_delimiters); para (String packagetoscan: typeHandlersPackAGearray) {Configuration.GetTyPeHandlerRegistry (). Register (Packagetoscan); if (Logger.isdebugenabled ()) {Logger.debug ("pacote SCONNET: '" + packagetoscan + "' para o tipo manipuladores"; (! isEmpty (this.typeHandlers)) {for (typeHandler <?> typeHandler: this.typeHandlers) {confguration.gettypeHandlerRegistry (). Register (typeHandler); if (logger.isdebugenabled ()) {Logger.debug); (this.databaseIdProvider! = null) {// CIXT #64 Defina o banco de dados antes do modelador de moda xmlstry {Configuration.SetDatabaseId (this.databaseIdProvider.ItDatabaseId (this.datasource);} captura (sqLexception e) {throwstabase (this.datasource);} captura (sqLexception e) {throwstabase (this.datasource);} captura (sqLexception) {throwstabase (this.datasource);} captura (sqLexception e) {thrownio) (this.cache! = null) {Configuration.addcache (this.cache);} if (xmlconfigbuilder! = null) {try {xmlConfigBuilder.parse (); if (logger.isdebugenabled () {logger.debug ("parsed conflorn configning (logger.isdebugen) {Logger.debug (" parsed "'");}} Catch (Exceção ex) {throw New NretioException ("Falha ao analisar o recurso de configuração:" + this.configlocation, ex);} finalmente {errorContext.instance (). SpringManagedtransactionFactory ();} Configuration.setEnvironment (novo ambiente (this. xmlmapperBuilder = new XMLMapperBuilder (mapperLocation.getInputStream (), Configuration, mapperLocation.tostring (), confguration.getsqlfragments ()); xmlmapperbuilder.parse ();} catch (Exceção e) {throw nordexcensception ("a maghing" para a explicadora ")"), a mais ou menos (), mais ouspper, "); e);} finalmente {ErrorContext.Instance (). Reset ();} if (Logger.isdebugenabled ()) {Logger.debug ("arquivo de mapero parsed: '" + mapperlocated + "');}}} {if (logger.isDeBugenabled ()); Recursos especificados ou nenhum correspondente encontrados ");}} Retorne isso.SQLSessionFactoryBuilder.Build (Configuration);}Embora o Mybatis seja uma excelente estrutura de camada de persistência, para ser sincero, esse código não é realmente muito bom e tem muito espaço para reconstrução e otimização.
2. Expansão funcional
(1) Use o esquema para verificar o sqlmapper
<!-DTD MODE-> <? Xml versão = "1.0" coding = "utf-8"?> <! Doctype mapeper public "-// mybatis.org//dtd Mapper 3.0 // en" namespace = "org.dysd.dao.mybatis.config.iexampledao"> </mapper> <!-mode schema-> <? xml versão = "1.0" coding = "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>
À primeira vista, o uso do esquema é mais complicado, mas, se combinado com o IDE, os avisos automáticos do uso do esquema são mais amigáveis e as informações de verificação são mais claras. Ao mesmo tempo, também abre uma janela para outros desenvolvedores para permitir que eles personalizem o espaço para nome com base no espaço de nome existente, como a introdução da tag <rognl>, usando expressões OGNL para configurar as instruções SQL, etc.
(2) Personalize a configuração. O SQLSessionFactoryBean forneceu mais parâmetros para configuração personalizada, mas ainda é possível exigir configurações mais personalizadas, como:
A. Defina o tipo de resultado padrão. Para elementos <select> que não definem o resultado e o resultado, você pode definir o tipo de retorno padrão para mapa após a análise, simplificando assim a configuração do SQLMapper.
<!-Antes de simplificado-> <select id = "selecione" resultype = "map"> selecione * de tabela_name onde campo1 = #{field1, jdbctype = varchar} </leclect> <!-após simplificado-> <select ID = "select" * de tabela_name onde1 = #{field1,> jdcctype = "selecione"> *B. Estenda a análise de parâmetros originais de Mybatis. A implementação de análise nativa é DefaultParameterHandler. Esta implementação pode ser herdada e estendida. Por exemplo, para a expressão da propriedade prefixada por Spel:, use Spel para avaliar o valor.
(3) Para outras extensões, consulte o blog anterior do autor sobre a extensão Mybatis
3. Viabilidade da reconstrução
(1) em termos do escopo da influência do código
Abaixo está a estrutura de herança do SQLSessionFactoryBean
A partir disso, podemos ver que o sistema de herança do SQLSessionFactoryBean não é complicado e não herda outras classes dos pais. Ele implementa apenas três interfaces na primavera (o Listener no JDK é apenas um logotipo). Além disso, o SQLSessionFactoryBean é destinado ao usuário do desenvolvimento final, sem subclasses e nenhuma outra classes que chama, por isso é muito pequena em termos do escopo do impacto do código.
(2) Na implementação da reconstrução, você pode criar um novo SchemasqlSessionFactoryBean e, em seguida, o código copiar completamente o SQLSessionFactoryBean no início, modificar o nome do pacote e o nome da classe e usar isso como base para reconstrução. Isso é relativamente simples.
(3) Em aplicativos integrados, você só precisa modificar os atributos da classe na configuração e mola integradas.
O exposto acima é a refatoração do SQLSessionFactoryBean integrado com Mybatis e Spring apresentado a você. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!