Prefácio
Este artigo conta principalmente a história do Springboot que integra Mybatis, Druid e PageHelper e implementando várias fontes de dados e paginação. Entre eles, o Springboot integra Mybatis, que foi descrito em um artigo anterior, então não explicarei muito aqui. O foco está em como configurar o Druid e o PageHelper em várias fontes de dados.
Introdução e uso druidas
Antes de usar o Druid, vamos dar uma breve olhada no Druid.
Druid é um pool de conexão de banco de dados. Pode -se dizer que o Druid é o melhor pool de conexão de banco de dados no momento! É altamente preferido pelos desenvolvedores por seus excelentes recursos, desempenho e escalabilidade.
O Druid implantou mais de 600 aplicativos no Alibaba e passou pelo teste rigoroso de implantação em larga escala em ambientes de produção há mais de um ano. O Druid é um pool de conexão de banco de dados desenvolvido pelo Alibaba chamado Monitoring!
Ao mesmo tempo, o Druid não é apenas um pool de conexão de banco de dados, o núcleo do Druid inclui principalmente três partes:
As principais funções do druid são as seguintes:
Não vou falar sobre a introdução, consulte a documentação oficial para obter detalhes.
Então vamos começar a introduzir como usar o Druid.
Primeiro de tudo, a dependência do Maven, basta adicionar o frasco druido.
<Depencency> <voundid> com.alibaba </frugiD> <stifactId> druid </artifactId> <versão> 1.1.8 </version> </dependency>
Em termos de configuração, o principal é adicioná -lo no aplicativo.properties ou Application.yml da seguinte forma.
Nota: Como eu uso duas fontes de dados aqui, é apenas um pouco diferente. As instruções para a configuração do Druid já estão detalhadas abaixo, então não vou explicar aqui.
## fonte de dados padrão master.dataSource.url = jdbc: mysql: // localhost: 3306/springboot? useUnicode = true & caracterEncoding = utf8 & permitir multiquies = tru emaster.dataSource.username = rootmaster.dataSource.password = 123456master.datasource.driverclassName = com.mysql.jdbc.driver ## Outra fonte de dados cluster.dataSource.url = jdbc: mysql: // localhost: 3306/springboot_test? useunicode = true & caracterEncoding = utf8cluster.dataSource.username = rootcluster.datasource.password = 123456Cluster.datSource.niverCerend.datasource.password = 123456cluster.datSource.niverce.niverCe Informações de configuração para o pool de conexão # Inicialize tamanho, mínimo, mola máxima.dataSource.type = com.alibaba.druid.pool.druiddataSourcespring.dataSource.initialSize = 5 spring.dataSource.minidle = 5 spring.datasource.maxative = 20 # 20 # 20 # 20 # 20 # 20 # 20 # 20 # 20 spring.datasource.maxWait=60000 # Configure how long it takes to perform a detection interval to detect idle connections that need to be closed, in milliseconds spring.datasource.timeBetweenEvictionRunsMillis=60000 # Configure the minimum time to survive in the pool, in milliseconds spring.datasource.minEvictableIdleTimeMillis=300000 spring.dataSource.validationQuery = Selecione 1 em dual spring.dataSource.testwhileIdle = true spring.dataSource.testonborrow = false spring.dataSource.testonreturn = False # Abra o PSCACHACH e especifique o tamanho do pscache em cada conexão. spring.datasource.maxpoolPreparedStatementPerConnectionsize = 20 # Configure filtros para monitoramento de estatísticas interceptadas. Depois de removê -lo, a interface de monitoramento SQL não pode ser contada. 'Wall' é usado para o firewall spring.dataSource.filters = stat, parede, log4j # aberto função de mesclescl através da propriedade ConnectProperties; Lenta SQL Records spring.dataSource.ConnectionProperties = druid.stat.mergesql = true; druid.stat.slowsqlmillis = 5000
Depois de adicionar com êxito o arquivo de configuração, vamos escrever classes relacionadas à DRUID.
Primeiro, a classe MasterDatasourceConfig.java, que é a classe de configuração de fonte de dados padrão.
@Configuration@MappersCan (BasePackages = MasterDataSourceConfig.package, SQLSessionFactoryRef = "MasterSqlSessionFactory") public class MasterDataSourceCeconfig {Final String Package = "com.pancm.dao.master"; estático final string mapper_location = "Classpath: mapper/master/*. xml"; @Value ("$ {master.datasource.url}") private string url; @Value ("$ {Master.DataSource.UserName}") private String UserName; @Value ("$ {master.datasource.password}") private string senha; @Value ("$ {Master.DataSource.driverclassName}") private string driverclassName; @Value ("$ {spring.datasource.initialsize}") private int InitialSize; @Value ("$ {spring.datasource.minidle}") private int minidle; @Value ("$ {spring.datasource.maxactive}") private int maxactive; @Value ("$ {spring.datasource.maxwait}") private int maxwait; @Value ("$ {spring.dataSource.TimeBetweenEvictionRunsmillis}") privado int timebetweenEvictionRunsmillis; @Value ("$ {spring.dataSource.mineVictableIdletimemillis}") private int minevictableIdletimemillis; @Value ("$ {spring.datasource.validationQuery}") private String validationQuery; @Value ("$ {spring.datasource.testwhileidle}") private boolean testhileidle; @Value ("$ {spring.datasource.testonborrow}") private boolean testonborrow; @Value ("$ {spring.dataSource.testoNreturn}") Private Boolean testOnReturn; @Value ("$ {spring.dataSource.poolPreparedStatements}") privado boolean poolpreparedstatements; @Value ("$ {spring.dataSource.maxpoolPreparedStateMementPonConectionsize}") private int maxpoolPreparedStatementPerConnectionsize; @Value ("$ {spring.datasource.filters}") filtros de sequência privada; @Value ("{spring.datasource.connectionproperties}") private string ConnectionProperties; @Bean (name = "MasterDataSource") @Primary Public DataSource MasterDataSource () {druidDataSource DataSource = new DruidDataSource (); DataSource.seturl (URL); DataSource.setUserName (nome de usuário); DataSource.SetPassword (senha); DataSource.SetDriverClassName (DriverClassName); // Configuração específica DataSource.SetInitialSize (InitialSize); DataSource.setminidle (minidle); DataSource.SetMaxActive (maxactive); DataSource.setMaxWait (Maxwait); dados DataSource.setMineVictableIdLeTimemillis (MineVictableIdLetimEmillis); DataSource.SetValidationQuery (validationQuery); DataSource.setTestwhileIdle (testhileidle); DataSource.setTestonBorrow (testonborrow); DataSource.SetTestOnReturn (testOnReturn); DataSource.SetPoolPreparedStatements (PoolPreparedStatements); DataSource.setMaxPoolPreparedStatementPerConnectionsize (MaxPoolPreparedStatementPerConnectionsize); tente {DataSource.SetFilters (filtros); } catch (sqLexception e) {e.printStackTrace (); } DataSource.setConnectionProperties (ConnectionProperties); return DataSource; } @Bean (name = "MasterTransactionManager") @Primary Public DataSourCetransActionManager MasterTransactionManager () {Return DataSourCetRansactionManager (MasterDataSource ()); } @Bean (name = "MasterSqlSessionFactory") @Primary Public sqlSessionFactory MasterSqlSessionFactory (@qualifier ("masterDataSource") DataSource MasterDataSource) lança a exceção {Final sqlSessionFactoryBean Factory = new SqlSFabanBean (); sessionFactory.SetDataSource (MasterDataSource); sessionFactory.SetMapperLocations (new PathMatchingResourcepTatternResolver () .GetResources (MasterDatasourceConfig.mapper_location); retornar sessionfactory.getObject (); }}Essas duas anotações são explicadas abaixo:
**@Primary **: Logo este feijão se houver vários candidatos semelhantes de feijão, o feijão
Prioridade é considerada. Ao configurar várias fontes de dados, tenha cuidado para que haja uma fonte de dados primária e use @Primary para marcar o feijão.
**@MapperScan **: Digitalize a interface do mapeador e o gerenciamento de contêineres.
Deve -se notar que o SQLSessionFactoryRef representa a definição de uma instância única do SQLSessionFactory.
Após a conclusão da configuração acima, o Druid pode ser usado como um pool de conexão. No entanto, o Druid não é simplesmente um pool de conexão. Também pode ser considerado um aplicativo de monitoramento. Ele vem com uma interface de monitoramento da Web, que pode ver claramente as informações relacionadas ao SQL.
Usando a função de monitoramento do Druid no Springboot, você só precisa escrever as classes StatViewServlet e WebStatFilter para implementar serviços de registro e regras de filtragem. Aqui podemos escrever esses dois juntos, usando **@configuração ** e **@bean **.
Por uma questão de entendimento fácil, as instruções de configuração relevantes também são escritas no código, para que não entre em detalhes aqui.
O código é o seguinte:
@ConfigurationPublic Classe druidConfiguration {@Bean Public ServletRegistrationBean DruidStatViewServle () {// Registrar serviço servletRegistrationBean servletRegistrationBean = new ServeletRegistrationBean (new StatViewServlet (), "/druid/*"); // Whitelist (representa vazio, tudo pode ser acessado, separado por vírgulas para múltiplos IPs) servletRegistrationBean.addinitParameter ("permitir", "127.0.1"); // IP Blacklist (Dony tem precedência permitir quando houver uma existência comum) servletRegistrationBean.addinitParameter ("Deny", "127.0.2"); // Defina o nome de usuário de login e a senha servletRegistrationBean.addinitParameter ("LoginUserName", "Pancm"); ServletRegistrationBean.addinitParameter ("LogInpassword", "123456"); // se é possível redefinir dados. ServletRegistrationBean.addinitParameter ("Redeecenável", "Falso"); retornar servletRegistrationBean; } @Bean public filterRegistrationBean druidStatfilter () {filterRegistrationBean filterRegistrationBean = new FilterRegistrationBean (new WebStatFilter ()); // Adicionar regras de filtragem filtroRegistrationBean.addurlpatterns ("/*"); // Adicione informações de formato que não precisam ser ignoradas filtroRegistrationBean.addinitParameter ("exclusões", "*.js,*. Gif,*. Jpg,*. Png,*. Css,*. Ico,/druid/*"); System.out.println ("Inicialização do Druid com sucesso!"); retornar filtroRegistrationBean; }}Depois de escrever, inicie o programa, digite: http://127.0.0.1:8084/druid/index.html no navegador e digite o nome de usuário e a senha definidos para acessar a interface da web.
Configuração de origem multi-dados
Antes de executar a configuração de origem de vários dados, execute os seguintes scripts nos bancos de dados MySQL de Springboot e Springboot_test, respectivamente.
-Script da biblioteca de troca de troca, crie a tabela `t_user` (` id` int (11) não nulo auto_incremem comentário 'autocomemente ID', `name` varchar (10) nulo nulo padrão 'scriting' 8 scort = scriting de scort = 8 scriting (scriting` idade `age 'int (2) default nula comentário', chave ',` `id')). Biblioteca Springboot_test Criar tabela `t_student` (` id` int (11) não null auto_increme, `name` varchar (16) nulo padrão,` idade` int (11) nulo padrão, chave primária (`id`)) mecan
Nota: Para ser preguiçoso, a estrutura das duas mesas é a mesma! Mas isso não afetará o teste!
As informações sobre essas duas fontes de dados foram configuradas no Application.properties, e a configuração foi publicada uma vez, para não publicá -las aqui.
Aqui vamos nos concentrar na configuração da segunda fonte de dados. É semelhante ao MasterDatasourceConfig.java acima, a diferença é que ele é diferente da anotação **@primária ** e nome sem usar a anotação **@primário **. Deve -se notar que o pacote masterDatasourceConfig.java digitaliza o pacote e o mapeador com precisão para o diretório, e o mesmo é verdadeiro para a segunda fonte de dados aqui. Então o código é o seguinte:
@Configuration@MapperScan (BasePackages = clusterDataSourceConfig.package, sqlSessionFactoryRef = "clustersqlsessionFactory") public class ClowerDataSourceConfig {Final String Package = "com.panc.dao.cluster"; estático final string mapper_location = "ClassPath: mapeador/cluster/*. xml"; @Value ("$ {cluster.datasource.url}") private string url; @Value ("$ {cluster.datasource.username}") private string nome de usuário; @Value ("$ {cluster.datasource.password}") private string senha; @Value ("$ {cluster.dataSource.driverclassName}") private string driverclass; // como MasterDataSourceConfig, aqui @Bean (name = "clusterDataSource") public DataSource clusterDataSource () {druidDataSource DataSource = new DruidDatasource (); DataSource.seturl (URL); DataSource.setUserName (nome de usuário); DataSource.SetPassword (senha); DataSource.SetDriverClassName (DriverClass); // como MasterDataSourceConfig, aqui ... retorna DataSource; } @Bean (name = "clusterTransactionManager") public DataSourCetransActionManager clusterTransactionManager () {return DataSourCetransactionManager (clusterDataSource ()); } @Bean (name = "clustersqlSessionFactory") public sqlSessionFactory clustersqlSessionFactory (@qualiFier ("clusterDataSource") DataSource CLUSTERDataSource) lança a exceção {Final sqlsessionBeanBeanFactory = new SqlSFabanBean (); sessionFactory.SetDataSource (clusterDataSource); sessionFactory.SetMapperLocations (new PathMatchingResourcepTatternResolver (). GetResources (clusterDatasourceConfig.mapper_location)); retornar sessionfactory.getObject (); }} Depois de escrever com sucesso a configuração, inicie o programa e conduza os testes.
Use interfaces para adicionar dados nas bibliotecas Springboot e Springboot_test, respectivamente.
T_USER
Post http: // localhost: 8084/api/user {"name": "Zhang San", "Age": 25} {"Name": "Li si", "Age": 25} {"Nome": "Wang Wu", "Age": 25}t_student
Post http: // localhost: 8084/API/Student {"Name": "Student A", "Age": 16} {"Name": "Student B", "Age": 17} {"Nome": "Student C", "Age": 18}Depois de adicionar dados com sucesso, ligue para diferentes interfaces para consulta.
perguntar:
Obtenha http: // localhost: 8084/api/user? Name = li si
retornar:
{"Id": 2, "Nome": "Li si", "Age": 25}perguntar:
Obtenha http: // localhost: 8084/api/aluno? Nome = aluno c
retornar:
{"Id": 1, "Nome": "Student C", "Age": 16}A partir dos dados, podemos ver que várias fontes de dados foram configuradas com sucesso.
Implementação de paginação PageHelper
PageHelper é um plug -in de paginação para Mybatis, o que é muito útil! Altamente recomendado aqui! ! !
PageHelper é muito simples de usar, você só precisa adicionar a dependência do PageHelper no MAVEN.
As dependências do Maven são as seguintes:
<Depencency> <PuerpId> com.github.pagehelper </frupidId> <TRATIFACTID> PageHelper-Spring-Boot-Starter </ArtifactId> <versão> 1.2.3 </versão </dependence>
NOTA: Eu uso a versão de trampolim aqui! Outras versões também podem ser usadas.
Após adicionar dependências, você só precisa adicionar a seguinte configuração ou código.
O primeiro tipo é adicionado no application.properties ou application.yml
PageHelper: Helperdialect: MySQL OffsetSPagenum: True RowBoundSwithCount: True Razoável: Falso
O segundo tipo é adicionado na configuração mybatis.xml
<bean id = "sqlsessionFactory"> <propriedade name = "dataSource" ref = "dataSource"/> <!-escanear o arquivo mapping.xml-> <names name = "mapperlocations" value = "Classpath: mapper/*. xml"> </propriedade> <!-Configurando o plugin-plugin-> plugin-> name = "Propriedades"> <Value> helperdialect = mysql offsetPaGenum = true rowboundswithcount = true razoável = false </value> </ouse>
O terceiro tipo é adicionado no código e o inicializa ao iniciar o programa usando a anotação **@bean **.
@Bean public PageHelper PageHelper () {PageHelper PageHelper = new PageHelper (); Propriedades Propriedades = new Properties (); // Database Properties.SetProperty ("Helperdialect", "MySQL"); // se deve usar o deslocamento do parâmetro como Pagenum Properties.SetProperty ("OffsetPagenum", "True"); // se deve consultar a contagem Properties.setProperty ("rowboundswithcount", "true"); // se deve racionalizar propriedades de paginação.SetProperty ("razoável", "false"); PageHelper.SetProperties (Propriedades); }Como estamos usando várias fontes de dados aqui, a configuração aqui é um pouco diferente. Precisamos configurá -lo no SessionFactory. Aqui fazemos modificações correspondentes para masterDatasourceConfig.java. No método MasterSQLSessionFactory, adicione o código a seguir.
@Bean (name = "MasterSqlSessionFactory") @Primary public sqlSessionFactory MasterSqlSessionFactory (@qualifier ("masterDataSource") DataSource MasterDataSource) lança exceção (final sqlsessionFactoryBeanFactory = New SqlSessFactorBeanBean; sessionFactory.SetDataSource (MasterDataSource); sessionFactory.SetMapperLocations (new PathMatchingResourcepTatternResolver () .GetResources (MasterDatasourceConfig.mapper_location); // interceptador de plug-in de paginação = new PageInterceptor (); Propriedades Propriedades = new Properties (); // Database Properties.SetProperty ("Helperdialect", "MySQL"); // se deve usar o deslocamento do parâmetro como Pagenum Properties.SetProperty ("OffsetPagenum", "True"); // se deve consultar a contagem Properties.setProperty ("rowboundswithcount", "true"); // se deve racionalizar propriedades de paginação.SetProperty ("razoável", "false"); interceptor.SetProperties (Propriedades); sessionFactory.SetPlugins (novo interceptor [] {interceptor}); retornar sessionfactory.getObject (); }NOTA: Quando outras fontes de dados também desejam pagar, consulte o código acima.
O que você precisa observar aqui é o parâmetro razoável, que significa racionalização da paginação, e o valor padrão é falso. Se este parâmetro estiver definido como TRUE, a primeira página será consultada quando Pagenum <= 0 e Pagenum> Páginas (quando o número total exceder), a última página será consultada. Quando false por padrão, a consulta é diretamente baseada nos parâmetros.
Depois de definir o PageHelper, se você o usar, você só precisará adicionar PageHelper.startPage(pageNum,pageSize); em frente à consulta SQL. Se você quiser saber o número total, compre -o após a instrução SQL de consulta e adicione page.getTotal() .
Exemplo de código:
Lista pública <t> findByListentity (entidade t) {list <t> list = null; tente {página <?> página = PageHelper.startPage (1,2); System.out.println (getClassName (entidade)+"Defina dois dados na primeira página!"); list = getMapper (). findByListentity (entidade); System.out.println ("Há um total de:"+página.gettotal ()+"dados, e o retorno real é:"+list.size ()+"dois dados!"); } catch (Exceção e) {Logger.error ("Query"+getClassName (entidade)+"falhou! O motivo é:", e); } Lista de retorno; }Depois que o código é escrito, o teste final começa.
Consulte todos os dados na tabela t_user e pagine -os.
perguntar:
Obtenha http: // localhost: 8084/API/Usuário
retornar:
[{"Id": 1, "Nome": "Zhang San", "Age": 25}, {"Id": 2, "Nome": "Li si", "Age": 25}]Impressão de console:
Comece a consultar ...
O usuário define dois dados na primeira página!
2018-04-27 19: 55: 50.769 Debug 6152 --- [io-8084-Exec-10] cpdmuserdao.findbyListentity_count: ==> Preparando: Selecione contagem (0) de t_user onde 1 = 1
2018-04-27 19: 55: 50.770 Debug 6152 --- [io-8084-Exec-10] cpdmuserdao.findbyListentity_count: ==> Parâmetros:
2018-04-27 19: 55: 50.771 Debug 6152 --- [io-8084-exex-10] cpdmuserdao.findbyListentity_count: <== Total: 1
2018-04-27 19: 55: 50.772 Debug 6152 --- [io-8084-Exec-10] cpdao.master.userdao.findbyListentity: ==> Preparando: selecione ID, nome, idade de t_user onde 1 = 1 limite?
2018-04-27 19: 55: 50.773 Debug 6152 --- [io-8084-Exec-10] cpdao.master.userdao.findbyListentity: ==> Parâmetros: 2 (Inteiro)
2018-04-27 19: 55: 50.774 Debug 6152 --- [io-8084-Exec-10] cpdao.master.userdao.findbyListentity: <== Total: 2
Há um total de: 3 dados, e o retorno real é: 2 duas peças de dados!
Consulte todos os dados na tabela t_studente e pagine -os.
perguntar:
Obtenha http: // localhost: 8084/api/aluno
retornar:
[{"Id": 1, "Nome": "Student A", "Age": 16}, {"Id": 2, "Nome": "Student B", "Age": 17}]Impressão de console:
Comece a consultar ...
O StudNet define dois dados na primeira página!
2018-04-27 19: 54: 56.155 Debug 6152 --- [NIO-8084-EXEC-8] CPDCSFindByListentity_Count: ==> Preparando: Selecione contagem (0) de t_student onde 1 = 1
2018-04-27 19: 54: 56.155 Debug 6152 --- [NIO-8084-EXEC-8] CPDCSFindByListentity_Count: ==> Parâmetros:
2018-04-27 19: 54: 56.156 Debug 6152 --- [NIO-8084-EXEC-8] CPDCSFindByListentity_Count: <== Total: 1
2018-04-27 19: 54: 56.157 Debug 6152 --- [NIO-8084-EXEC-8] CPDCSTUDENTDAO.FindByListentity: ==> Preparando: selecione ID, nome de T_studente onde 1 = 1 limite?
2018-04-27 19: 54: 56.157 Debug 6152 --- [NIO-8084-EXEC-8] cpdcstudentdao.findbyListentity: ==> Parâmetros: 2 (Inteiro)
2018-04-27 19: 54: 56.157 Debug 6152 --- [NIO-8084-EXEC-8] cpdcstudentdao.findbyListentity: <== Total: 2
Há um total de: 3 dados, e o retorno real é: 2 duas peças de dados!
Após a conclusão da consulta, vamos dar uma olhada na interface de monitoramento da Druid. Digite no navegador: http://127.0.0.1:8084/druid/index.html
Os registros de operação podem ser vistos claramente!
Se você quiser saber mais sobre o Druid, pode verificar a documentação oficial!
Conclusão
Este artigo finalmente terminou. Ao escrever o código, encontrei muitos problemas e, lentamente, tentei e encontrei informações para resolvê -lo. Este artigo apresenta apenas esses usos relacionados muito brevemente e pode ser mais complicado em aplicativos reais.
Artigo de referência: https://www.bysocket.com/?p=1712
Endereço oficial Durid: https://github.com/alibaba/druid
PageHelper Endereço oficial: https://github.com/pagehelper/mybatis-pagehelper
Coloquei o projeto no github: https://github.com/xuwujing/springboot, você também pode baixá -lo localmente: clique aqui
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.