Construa uma plataforma Mybatis+PostgreSQL do zero
Recentemente, o banco de dados de um projeto usa o PostgreSQL para operar dados usando o mybatis original. Não há nada de errado com os mybatis originais. No entanto, existe uma ferramenta Tk.Mybatis na China que nos ajuda a fazer muitas coisas práticas. Na maioria dos casos, precisamos processar no mybatis original. Basicamente foi bem implementado. Este artigo compartilhará as etapas detalhadas para a instalação do PostgreSQL, a configuração do tk.mybatis e alguns pequenos problemas que podem ser encontrados nesse processo.
Instale o PostGresql, execute o seguinte comando para instalar: copie o código da seguinte
Após a instalação do servidor, também precisamos de um cliente PDADmin com uma interface gráfica. Eu instalei a versão do Windows do PostgreSQL e você pode encontrar a versão correspondente neste endereço. Depois que a instalação for bem -sucedida, um usuário do sistema e um usuário do banco de dados serão criados por padrão. O nome e a senha são todos postgres. Podemos criar um novo usuário ou usar esta conta diretamente. Enfim, sou apenas um teste. Após a conclusão da instalação, você pode encontrar problemas de acesso remoto:
Problema de conexão remota, apenas conexões locais são permitidas por padrão. Para permitir que outros clientes se conectem, podemos modificar seu arquivo de configuração. O diretório deste arquivo está localizado em /etc/postgresql/9.5/main. Existem dois arquivos neste diretório:
1: PostGresql.conf, isso é relacionado ao servidor e há um endereço Listen_address, que apenas ouve localmente por padrão, e podemos modificá-lo.
2: PG_HBA.COF, isso está relacionado às permissões do usuário, há uma configuração relacionada à conexão, que pode ser configurada no modo de gateway
Após uma conexão bem -sucedida, provavelmente é assim, podemos criar bancos de dados, tabelas e outros objetos.
Gerador de código Mybatis, o mapeamento de banco de dados e modelo, esse trabalho mecânico deve ser deixado para a máquina para ser concluído. Por favor, consulte os detalhes aqui.
O General Mapper, uma única operação de tabela CRUD, pode abstrair uma interface pública, e o mapeador geral fornecido pela tk.mybatis pode nos ajudar a resolver esse tipo de problema.
---- Mapper.xml, pequeno o suficiente (incluindo apenas mapas de campo)
<Mapper namespace = "com.jim.logstashmvc.dao.generated.mapper.productmapper"> <resultMap id = "baseresultmap" type = "com.jim.logstashmvc.dao.generated.product" <[email protected] "<!-warning-@mbgin. jdbctype = "bigint" propriedade = "id" /> <resultado column = "name" jdbctype = "varchar" propriedade = "name" /> < /resultmap> < /mapper>
---- Mapper, simples o suficiente (apenas herdado da interface do mapeador)
A cópia de código é a seguinte: Public Interface ProductMapper estende o Mapper <Product> {}
Plugins, aqui estão os plug -ins de paginação, plugins de análise de desempenho SQL, etc., é muito fácil integrar -se ao Mybatis.
Como se integrar à primavera?
Integração de geradores, você pode usar o método Maven para executar o gerador de código.
Dependem de pacotes
<!-mybatis-> <pendency> <puperid> org.mybatis </groupiD> <TRARFACTID> mybatis </artifactId> <versão> $ {mybatis.version} </versão> </dependency> <!-Spring Integration-> <Ependency> <pursion> org.mybatis <! <TRARFACTID> mybatis-spring </storkactId> <versão> $ {mybatis.spring.version} </version> </dependency> <!-mbg-> <pendency> <proupiD> org.mybatis.generator </grupo> <Artifactid> myBer--Generator-Core <Generator </Groupid> <Artifactid> <versão> $ {mbg.version} </versão> <cope> compile </scope> <cptional> true </opcional> </dependency> <!-paginação-> <pendency> <puroupid> com.github.pagehelper </frupid> <stifactId> PageHelper </Artifactid> <!-General Mapper-> <Depencency> <puperiD> tk.mybatis </groupiD> <TRARFACTID> mapper </storkactid> <versão> $ {mapper.version} </sipers> </dependency> <!-tkmybatis usará JPA Annotações-> <Pendence> <TRATIFACTID> Persistence-api </ArtifactId> <versão> 1.0 </versão> </dependency> <pendence> <puperid> org.postgresql </groupiD> <TRARFACTID> POSTGRESQL </ArtifactId> <Versão> 9.3-1102-jdbc41 </versão> </sperend> </dependente>Plug-in do gerador de configuração, especifique o caminho do arquivo de configuração, dependências de configuração: um é um driver de banco de dados e o outro é um mapeador geral
<!-mbg-> <flugin> <plugiD> org.mybatis.generator </frugiD> <stifactId> mybatis-generator-maven-plugin </stardifactId> <versão> $ {mbg.version} </versão <figuration> <figurationfile> $ {baseado} /src/main/resources/generator/generatorconfig.xml </frifigurationfile> <verwrite> true </verwrite> <BeelBose> true </verbose> </figuration> <pendências> <Pundency> <broupid> org.postql <TRAFACTID> PostGresql </storkactId> <versão> 9.3-1102-jdbc41 </sisters> </dependency> <pendency> <puperid> tk.mybatis </groupid> <stifactId> mapper </stifactId> <versão> $ {dependente </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão> </versão </versão </versão </versão </versão </versão> </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão </versão> </sustifactId> mapper </artifactid> <versão> $ {mapper.version}Arquivo de configuração do gerador
** Configurar conexões de banco de dados
** Configure os caminhos de armazenamento do modelo gerado, Mapper e Mapper.xml
** Configure as informações da tabela a serem geradas
Observe o TargetRuntime, aqui está o Mybatis3Simple, e sua opção padrão é Mybatis3. Se usarmos um mapeador geral, podemos escrever isso ao digitalizar a interface na primavera.
Copie o código da seguinte forma: <ean> <propriedade name = "sqlSessionFactoryBeanName" value = "jimsqlSessionFactory"/> <Property name = "BasEpackage" value = "com.jim.logstashmvc.dao.generated.mapper"/> </ Bean>
Se for Mybatis3, o formato Mapper.xml gerado será muito mais complicado. Eu já encontrei esse problema antes: usando o mapper.xml gerado pelo mybatis3 e configure incorretamente o MAPPERSCANNERCONFIGURADOR para o seguinte modo de mapeador geral, que me leva da seguinte maneira. O motivo pode ser determinado como um problema de configuração (não um ID duplicado em um mapper.xml). Estudarei a configuração do mapeador não genérico mais tarde.
Copie o código da seguinte maneira: causada por: java.lang.illegalargumentException: a coleção de instruções mapeadas já contém valor para com.jim.logstashmvc.dao.generated.mapper.productmapper.selectByExampleat org.apache.ibatis.session.conuraturation $ strictMapMapMapMapMapMapMap.AptMap.SelectByAmpLeat.Apache.ibatis.session.Acturaturation org.apache.ibatis.session.configuration $ strictmap.put (Configuration.java:809)
A configuração do gerador é a seguinte:
Copie o código da seguinte forma: <GeratorConfiguration> <Propriedades Resource = "config.properties"/> <Context TargetRuntime = "MyBatis3Simple" DefaultModelType = "Flat"> <Nome da propriedade "InicheDelimiter" "` "/> <Nome da propriedade" EndDelImiter "" type = "$ {mapper.plugin}"> <propriedade name = "maperes" value = "$ {mapper.mapper}"/> </flugin> <jdbcconnection driverclass = "$ {jdbc.driverclass}" conexão = "$ {jdbc.url}" password="${jdbc.password}"> </jdbcConnection> <javaModelGenerator targetPackage="${targetModelPackage}" targetProject="${targetJavaProject}"/> <sqlMapGenerator targetPackage="mapper" targetProject="${targetResourcesProject}"/> <javaClientGenerator targetPackage="${targetMapperPackage}" targetProject="${targetJavaProject}" type="XMLMAPPER"> </javaClientGenerator> <table tableName="product" domainObjectName="Product"></table> </context></generatorConfiguration>Configure maven running parameters as shown in the figure abaixo.
A integração do Mybatis configura principalmente informações do pool de conexões, plug-ins, digitalização de mapas e outras informações.
<bean id = "jimdataSource"> <propriedade name = "driverclassName" value = "$ {jdbc.driverclass}"/> <propriedade name = "url" value = "$ {jdbc.url}"/> name = "username" = "$ {jdbc.ernk. value = "$ {jdbc.password}"/> <propriedade name = "InitialSize" value = "5"/> <nome da propriedade = "minidle" value = "10"/> <names name = "maxwait" value = "60000"/> <nome da propriedade = "timebettionRunsmillis" value = "60000"/> <> value = "3600000"/> <propriedade name = "validationQuery" value = "selecione 1"/> <propriedades name = "testhileidle" value = "true"/> <names name = "testonborrow" value = "false"/> <nome da propriedade = "testonborrow" value = "false/> <ean name =" testonreturn "bud =" false = "false"/") <propriedade name = "DataSource" ref = "jimdataSource"/> <propriedade name = "mapperLocações" value = "classPath: mapper/*. xml"/> <names name = "typeAliasespackage" value = "com.jim.logstashmvc.dao.Generated.Entity"/> PLUGLE.JIM.JIM.LOGSHMVC.DAO.Generated> name = "Propriedades"> <Value> dialect = postgresql razoável = true supportMethodSargudents = true retornpageInfo = verificação params = count = countSql </value> </property> </bean> </Array> </erition> </ Bean> </bean> <nome do nome = "sqlSessformableban> name = "BasEpackage" Value = "com.jim.logstashmvc.dao.generated.mapper"/> </bean>Uso do General Mapper:
• Mapper, todos os mapeadores gerados são herdados do mapeador <T> e seguram todas as interfaces de mapeador comum por padrão, incluindo operações comuns de CRUD.
• ISERVICE, a definição de uma interface de mapeador geral, podemos modificar essa interface de acordo com nosso próprio negócio
@ServicePublic Interface iservice <t> {t selectbyKey (chave do objeto); int save (entidade t); int delete (chave do objeto); int updateAll (entidade T); int updateNotNull (entidade T); Lista <T> selectByExample (Exemplo de objeto); // TODO OUTROS ...}BaseService, a classe de implementação do General Mapper
classe abstrata pública BaseService <T> implementa o ISERVICE <T> {@AUTOWIRED MAPPER protegido <T> Mapper; public Mapper <T> getMapper () {return mapper; } @Override public t SelectByKey (chave do objeto) {return mapper.selectByPrimaryKey (chave); } public int save (entidade t) {return mapper.insert (entidade); } public int Delete (chave do objeto) {return mapper.deletebyPrimaryKey (chave); } public int updateAll (entidade t) {return mapper.UpDateByPrimaryKey (entidade); } public int updateNotNull (entidade t) {return mapper.UpDateByPrimaryKeySelective (entidade); } Lista pública <T> selectByExample (Exemplo de objeto) {return mapper.selectByExample (exemplo); } // TODO OUTROS ...}Categorias de serviço específicas
@ServicePublic Class ProductServiceImpl estende o BasEService <Production> implementa o ProductService {@Override public List <Prodter> SelectByProduct (Produto Produto, Int Page, int linhas) {Exemplo Exemplo = novo exemplo (Product.class); Exemplo.Critérios critérios = exemplo.createcriteria (); if (! stringUtils.isblank (product.getName ())) {critério.andEqualto ("nome", product.getName ()); } if (product.getId ()! = null) {critério.andEqualto ("id", product.getId ()); } PageHelper.startPage (página, linhas); retornar selectbyExample (exemplo); }}Instale o PostgreSQL e conecte -se remotamente com sucesso, integra o MBG para gerar mapeador e modelo, depois integre o Mybatis à primavera e, finalmente, conecte -o através de um mapeador geral para atingir nosso objetivo: concluir a maior parte do trabalho através de uma pequena quantidade de código e entregue -o à ferramenta para o trabalho repetido. Mas o General Mapper tem suas vantagens e desvantagens e precisa ser equilibrado de acordo com o ambiente do projeto. Pessoalmente, sinto que os benefícios superam as desvantagens.
Citado por este artigo:
1. Http://www.mybatis.tk/
2. Https://github.com/abel533/mybatis-spring
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.