Предисловие
Эта статья в основном рассказывает историю о интеграции Springboot Mybatis, Druid и Pagehelper и реализации нескольких источников данных и страниц. Среди них Springboot интегрирует Mybatis, который был описан в предыдущей статье, поэтому я не буду здесь много объяснять. Основное внимание уделяется настройке Druid и Pagehelper в нескольких источниках данных.
Друид введение и использование
Прежде чем использовать Druid, давайте кратко рассмотрим Друид.
Друид - это пул соединений базы данных. Можно сказать, что Druid в настоящее время является лучшим пулом соединений базы данных! Разработчики очень предпочитают его отличные функции, производительность и масштабируемость.
Druid развернул более 600 приложений на Alibaba и прошел строгий тест на крупномасштабное развертывание в производственных средах в течение более года. Druid - это пул соединений с базой данных, разработанный Alibaba, называемый мониторинг!
В то же время, Druid - это не просто пул соединений с базой данных, ядро дружид в основном включает в себя три части:
Основные функции друида следующие:
Я не буду говорить о введении, пожалуйста, обратитесь к официальной документации для получения подробной информации.
Тогда давайте начнем представлять, как использовать Druid.
Прежде всего, зависимость Maven, просто добавьте банку друида.
<depervice> <groupid> com.alibaba </groupid> <artifactid> druid </artifactid> <sersion> 1.1.8 </version> </vehyse>
С точки зрения конфигурации, главное - добавить его в приложение. Прозрачные или приложение.
Примечание. Поскольку я использую два источника данных здесь, это немного отличается. Инструкции для конфигурации друида уже подробно описаны ниже, поэтому я не буду объяснять это здесь.
## Источник данных по умолчанию Master.datasource.url = jdbc: mysql: // localhost: 3306/springboot? useUnicode = true & harectrencoding = utf8 & allowmultiqueries = tru eMaster.datasource.username = rootmaster.datasource.password = 123456master.datasource.driverclassname = com.mysql.jdbc.driver ## Другой кластер источник данных.datasource.url = jdbc: mysql: // localhost: 3306/springboot_test? UseUnicode = true & haremencoding = utf8cluster.datasource.username = rootcluster.datasource.password = 123456cluster.dataSource.driverclassname.mysbuster.j.spassbustr. Информация о конфигурации для пула соединений # инициализируйте размер, минимум, максимум spring.datasource.type = com.alibaba.druid.pool.druiddatasourcespring.datasource.initialsize = 5 Spring.datasource.minidle = 5 Spring.datasource.maxactize = 20 # Настройка времени spring.datasource.maxwait = 60000 # Настройка, сколько времени требуется для выполнения интервала обнаружения, чтобы обнаружить непрерывные соединения, которые необходимо закрыть, в миллисекундах Spring.DataSource.TimeWeeWeeVictionRunSmillis = 60000 # Настройте минимальное время для выживания в пуле, в MilliseConds Spring.DataSource. spring.datasource.validationQuery = select 1 из Dual Spring.datasource.testWhileIdle = true Spring.datasource.testonborrow = false Spring.datasource.testonRetur spring.datasource.maxpoolpreparedStatementPerconcessize = 20 # Настройка фильтров для мониторинга статистики перехватывается. После удаления его нельзя подсчитать интерфейс мониторинга. «Стена» используется для брандмауэра Spring.datasource.filters = stat, Wall, log4j # Открыть функцию MergesQL через свойство ConnectProperties; Медленные записи SQL Spring.datasource.connectionProperties = druid.stat.mergeSql = true; druid.stat.slowsqlmillis = 5000
После успешного добавления файла конфигурации, давайте написать классы, связанные с Друидом.
Во -первых, класс masterdatasourceconfig.java, который является классом конфигурации источника данных по умолчанию.
@Configuration@mapperscan (basepackages = masterdatasourceconfig.package, sqlsessionFactoryRef = "MasterQlSessionFactory") открытый класс MasterDatasourceConfig {статический пакет окончательной строки = "com.pancm.dao.master"; Статическая конечная строка 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 Password; @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.TimeWeeWeedEvictionRunsmillis}") private int timeBowneEvictionRunsmillis; @Value ("$ {Spring.Datasource.mineVictableIdletImeMillis}") private int mineVictableIdletimemillis; @Value ("$ {spring.datasource.validationQuery}") Private String ValidationQuery; @Value ("$ {Spring.Datasource.testWhileIdle}") private Boolean TestWhileIdle; @Value ("$ {Spring.Datasource.testonBorw}") Private Boolean TestonBorrow; @Value ("$ {spring.datasource.testonreturn}") private boolean testonreturn; @Value ("$ {Spring.datasource.poolpreparedStatements}") частные логические бассейны; @Value ("$ {spring.datasource.maxpoolpreparedStatementPerconcection}") private int maxpoolpreparedStatementPerConcectionsize; @Value ("$ {spring.datasource.filters}") частные строковые фильтры; @Value ("{spring.datasource.connectionProperties}") private String ConnectionProperties; @Bean (name = "MasterDatasource") @primary public DataSource MasterDataSource () {druiddatasource dataSource = new DruidDataSource (); dataSource.setUrl (url); dataSource.setuserName (имя пользователя); dataSource.setPassword (пароль); dataSource.setDriverClassName (DriverClassName); // конкретная конфигурация dataSource.setInitialSize (инициализирование); dataSource.setMinidle (minidle); dataSource.setMactactive (maxactive); dataSource.setMaxWait (maxwait); dataSource.setTimeBetweeEvictionRunsmillis (TimeBhingWeeVictionRunsmillis); dataSource.SetMineVictableIdletimemillis (mineVictableIdletimemillis); dataSource.setValidationQuery (valyationQuery); dataSource.SetTestWhileIdle (тест -WhileIdle); dataSource.setTestonBorrow (testonBorrow); dataSource.setTestonReturn (testonReturn); dataSource.SetPoolPReparedStatements (PoolPRearedStatements); dataSource.SetMaxPoolPReparEdStateMentPerConnectionsize (maxpoolpreparedStatementPerconnectionsize); try {dataSource.setFilters (Filters); } catch (sqlexception e) {e.printstacktrace (); } dataSource.setConnectionProperties (ConnectionProperties); вернуть DataSource; } @Bean (name = "MasterTransactionManager") @primary public dataSourcETransActionManager MasterTransactionManager () {return New DataSourcETransActionManager (MasterDatasource ()); } @Bean (name = "masterqlSessionFactory") @primary public sqlSessionFactory mastersqlSessionFactory (@qualifier ("MasterDatasource") DataSource MasterDataSource) бросает исключение {final SqlSessionFactorybean sessionFactory = new SqlSessionFactorybean (); SessionFactory.SetDataSource (MasterDataSource); SessionFactory.SetMapperLocations (новый PathMatchingResourcepatternResolver () .getResources (MasterDataSourceConfig.mapper_location)); return sessionfactory.getObject (); }}Эти две аннотации объяснены ниже:
**@primary **: логотип этот боб, если есть несколько похожих кандидатов на бобы, бобы
Приоритет рассматривается. При настройке нескольких источников данных будьте осторожны с тем, что должен быть первичный источник данных и использовать @primary, чтобы отметить фасоль.
**@mapperscan **: сканировать интерфейс Mapper и управление контейнерами.
Следует отметить, что SQLSessionFactoryRef представляет определение уникального экземпляра SQLSessionFactory.
После завершения вышеуказанной конфигурации Druid можно использовать в качестве пула соединений. Тем не менее, друид - это не просто пул соединений. Также можно сказать, что это приложение для мониторинга. Он поставляется с интерфейсом веб-мониторинга, который может четко увидеть информацию, связанную с SQL.
Используя функцию мониторинга Druid в Springboot, вам нужно только написать классы StatViewServlet и WebStatFilter для реализации служб регистрации и правил фильтрации. Здесь мы можем написать эти два вместе, используя **@configuration ** и **@Bean **.
Для простого понимания соответствующие инструкции по конфигурации также записаны в коде, поэтому я не буду вдаваться в подробности здесь.
Код заключается в следующем:
@ConfigurationPublic Class DruidConfiguration {@Bean Public ServletRegistrationBean BruidStatViewServle () {// Регистрация сервиса ServletRegistrationBean ServletRegistrationBean = new ServletRegistrationBean (New StatViewServlet (), "/Druid/*"); // белый список (представляет пустое, все можно получить, разделить запятыми для нескольких IPS) ServletRegistrationBean.AddinitParameter («All», «127.0.0.1»); // IP Blacklist (Dony имеет приоритет, а не разрешение, когда существует общее существование) Servletregistrationbean.addinitParameter («Deny», «127.0.0.2»); // Установите имя пользователя и пароль ServletRegistrationBean.AddinitParameter ("LoginUsername", "pancm"); ServletRegistrationBean.AddinitParameter ("LoginPassword", "123456"); // возможно ли сбросить данные. ServletRegistrationBean.AddinitParameter («Resetenable», «false»); возврат сервис -регистрации } @Bean Public FilterRegistrationBeanbean DruidStatfilter () {FilterRegistrationBean FilegerRegistrationBean = new FilterRegistrationBean (New WebStatFilter ()); // Добавить правила фильтрации FilterRegistrationBean.AddurlPatterns ("/*"); // Добавить информацию о формате, которую не нужно игнорировать FilterRegistrationBean.addinitParameter ("Исключения", "*.js,*. Gif,*. Jpg,*. Png,*. CSS,*. Ico,/druid/*"); System.out.println («Инициализация друида успешно!»); возврат FilterRegistrationBean; }}После написания, запустите программу, введите: http://127.0.0.1:8084/druid/index.html в браузере, а затем введите имя пользователя и пароль для доступа к веб -интерфейсу.
Конфигурация многоданного источника
Прежде чем выполнять конфигурацию многоданного источника, выполните следующие сценарии в базах данных MySQL Springboot и Springboot_test соответственно.
-Скрипт библиотеки Springboot Create Table `t_user` (` id` int (11) не null auto_increment Comment 'Self-Increment Id', `name` varchar (10) Null Null Comment ',` age` int (2) null null comment', первичный ключ (`` id`) engine = innodb auto_increment = 15 deffempe = 15 deffemple = 15-of-of-screpmipt = 15-neffmipt = 15 ut off8-in in innodb. Библиотека Springboot_test Создание таблицы `t_student` (` id` int (11) не null auto_increment, `name` varchar (16) null по умолчанию,` age` int (11) null, null, первичный ключ (`id`))) innodb auto_increment = 2 deflate = utf8)
Примечание. Чтобы быть ленивым, структура двух таблиц сделана одинаковой! Но это не повлияет на тест!
Информация об этих двух источниках данных была настроена в приложении.
Здесь мы сосредоточимся на конфигурации второго источника данных. Это похоже на MasterDatasourceConfig.java выше, разница в том, что он отличается от **@первичной ** аннотации и имени без использования **@первичной ** аннотации. Следует отметить, что MasterDatasourceConfig.java сканирует пакет и отображение и отображение в каталоге, и то же самое относится и к второму источнику данных здесь. Тогда код выглядит следующим образом:
@Configuration@mapperscan (basepackages = clusterdatasourceconfig.package, sqlSessionFactoryRef = "clustersQlSessionFactory") public clusterdatasourceconfig {static final String package = "com.pancm.dao.cluster"; Статическая конечная строка mapper_location = "classpath: mapper/cluster/*. xml"; @Value ("$ {cluster.datasource.url}") private String URL; @Value ("$ {cluster.datasource.username}") частная строка; @Value ("$ {cluster.datasource.password}") Private String Password; @Value ("$ {cluster.datasource.driverclassname}") private String DriverClass; // как MasterDatasourceConfig, здесь @bean (name = "clusterdatasource") public DataSource clusterDataSource () {druiddatasource dataSource = new DruidDataSource (); dataSource.setUrl (url); dataSource.setuserName (имя пользователя); dataSource.setPassword (пароль); dataSource.setDriverClassName (DriverC.Class); // как MasterDatasourceConfig, здесь ... возврат DataSource; } @Bean (name = "clusterTransactionManager") public DataSourcETransActionManager clusterTransactionManager () {return New DataSourcETransActionManager (clusterDataSource ()); } @Bean (name = "clustersqlSessionFactory") public sqlSessionFactory clustersQlSessionFactory (@qualifier ("clusterdatasource") clusterdatasource) бросает исключение {final SqlSessionFactorybean sessionFactory = new SqlSessionFactorybean (); SessionFactory.SetDataSource (ClusterDataSource); SessionFactory.SetMapperLocations (новый PathMatchingResourcepatterNresolver (). getResources (clusterDataSourceConfig.mapper_location)); return sessionfactory.getObject (); }} После успешного написания конфигурации запустите программу и проведите тесты.
Используйте интерфейсы, чтобы добавить данные в библиотеках Springboot и Springboot_test соответственно.
t_user
Post http: // localhost: 8084/api/user {"name": "Zhang San", "AGE": 25} {"name": "li si", "Age": 25} {"name": "Wang wu", "Age": 25}T_STUDENT
Post http: // localhost: 8084/api/student {"name": "студент", "возраст": 16} {"name": "Студент B", "AGE": 17} {"name": "Студент C", "AGE": 18}После успешного добавления данных вызовите разные интерфейсы для запроса.
просить:
Получить http: // localhost: 8084/api/user? Name = li si
возвращаться:
{"id": 2, "name": "li si", "Age": 25}просить:
Получить http: // localhost: 8084/api/student? Имя = студент c
возвращаться:
{"id": 1, "name": "Студент C", "AGE": 16}Из данных мы видим, что несколько источников данных были успешно настроены.
Реализация страниц PageHelper
PageHelper - это плагин для майки для Mybatis, который очень полезен! Настоятельно рекомендуется здесь! ! !
PageHelper очень прост в использовании, вам просто нужно добавить зависимость PageHelper в Maven.
Зависимости Мэвена следующие:
<depervice> <groupid> com.github.pageHelper </GroupId> <ArtifactId> pageHelper-spring-boot-starter </artifactid> <sersive> 1.2.3 </version> </vehyse>
Примечание: я использую версию Springboot здесь! Другие версии также могут быть использованы.
После добавления зависимостей вам нужно только добавить следующую конфигурацию или код.
Первый тип добавляется в application.properties или application.yml
PageHelper: helperdialect: mysql offsetaspagenum: true rowboundswithcount: true разумный: ложь
Второй тип добавляется в конфигурации mybatis.xml
<Bean id = "sqlSessionFactory"> <name = "dataSource" ref = "dataSource"/> <!-сканирование файла mapping.xml-> <name = "mapperlocations" value = "classpath: mapper/*. xml"> </propetion> <!-Конфигурирование плагина паги-> <свойство nake neake = "array> <ber> <ber> <ber> <ber> <! name = "Свойства"> <dulch> helperdialect = mysql offsetaspagenum = true rowboundswithcount = true oumportable = false </value> </property> </bean> </array> </property> </bean>
Третий тип добавляется в код и инициализирует его при запуске программы с использованием аннотации **@Bean **.
@Bean public pageHelper pageHelper () {pageHelper pageHelper = new PageHelper (); Свойства свойства = новые свойства (); // свойства базы данных.setProperty ("helperdialect", "mysql"); // Будь то использовать смещение параметра в качестве Pagenum Properties.SetProperty («OffSetAspagenum», «true»); // вопрос о том, запрашивать свойства count.setProperty ("rowboundswithCount", "true"); // Будь то рационализировать свойства странификации.setProperty («разумный», «false»); PageHelper.SetProperties (свойства); }Поскольку здесь мы используем несколько источников данных, конфигурация здесь немного отличается. Нам нужно настроить его в SessionFactory. Здесь мы вносим соответствующие изменения в MasterDatasourceConfig.java. В методе MasterSqlSessionFactory добавьте следующий код.
@Bean (name = "MasterqlSessionFactory") @primary public sqlSessionFactory mastersqlSessionFactory (@qualifier ("MasterDatasource") DataSource MasterDatasource) бросает исключение {final SqlSessionFactorybean sessionFactory = new SqlSessionFactorybean (); SessionFactory.SetDataSource (MasterDataSource); SessionFactory.SetMapperLocations (новый PathMatchingResourcepatternResolver () .getResources (MasterDataSourceConfig.mapper_location)); // Pagination Plug-In Interceptor Interceptor = new PageInterceptor (); Свойства свойства = новые свойства (); // свойства базы данных.setProperty ("helperdialect", "mysql"); // Будь то использовать смещение параметра в качестве Pagenum Properties.SetProperty («OffSetAspagenum», «true»); // вопрос о том, запрашивать свойства count.setProperty ("rowboundswithCount", "true"); // Будь то рационализировать свойства странификации.setProperty («разумный», «false»); Interceptor.setProperties (свойства); sessionFactory.SetPlugins (новый Interceptor [] {Interceptor}); return sessionfactory.getObject (); }ПРИМЕЧАНИЕ. Когда другие источники данных также захотят подготовить, пожалуйста, обратитесь к приведенному приведенному коду.
То, что вам нужно отметить, это разумный параметр, который означает рационализацию Paging, а значение по умолчанию является ложным. Если этот параметр установлен на True, первая страница будет запрошена, когда Pagenum <= 0 и Pagenum> страницы (когда общее число превышает), будет запрошена последняя страница. Когда по умолчанию по умолчанию запрос напрямую основан на параметрах.
После установки PageHelper, если вы используете его, вам нужно только добавить PageHelper.startPage(pageNum,pageSize); перед запросом SQL. Если вы хотите узнать общее число, купите его после оператора запроса SQL и добавьте page.getTotal() .
Пример кода:
public list <t> findbylistentity (t entity) {list <t> list = null; try {page <?> page = pageHelper.StartPage (1,2); System.out.println (getClassName (Entity)+«Установить два данных на первой странице!»); list = getMapper (). FindByListentity (Entity); System.out.println («Всего есть данные:«+page.getTotal ()+», а фактическое возвращение:«+list.size ()+"Два данных!"); } catch (Exception e) {logger.error ("Query"+getClassName (Entity)+"не удалась! Причина:", e); } return List; }После того, как код записан, начинается окончательный тест.
Запросите все данные в таблице T_USER и наносят их на пневмацу.
просить:
Получить http: // localhost: 8084/api/user
возвращаться:
[{"id": 1, "name": "Zhang San", "Age": 25}, {"id": 2, "name": "li si", "Age": 25}]Консольный отпечаток:
Начните запросить ...
Пользователь устанавливает две части данных на первой странице!
2018-04-27 19: 55: 50.769 отладка 6152 --- [IO-8084-EXEC-10] CPDMUSERDAO.FINDBYLISTENTITY_COUNT: ==> Подготовка: Выберите счет (0) из T_USER, где 1 = 1
2018-04-27 19: 55: 50,770 отладка 6152 --- [IO-8084-EXEC-10] CPDMUSERDAO.FINDBYLISTENTITY_COUNT: ==> Параметры:
2018-04-27 19: 55: 50,771 отладка 6152 --- [IO-8084-EXEC-10] CPDMUSERDAO.FINDBYLISTENTITY_COUNT: <== Итого: 1
2018-04-27 19: 55: 50.772 Отладка 6152 --- [IO-8084-EXEC-10] CPDAO.MASTER.USERDAO.FINDBYLISTENTITY: ==> Подготовка: Выберите ID, имя, возраст от T_USER, где 1 = 1 предел?
2018-04-27 19: 55: 50,773 отладка 6152 --- [IO-8084-EXEC-10] CPDAO.MASTER.USERDAO.FINDBYLISTENTITY: ==> Параметры: 2 (целое число)
2018-04-27 19: 55: 50,774 отладка 6152 --- [IO-8084-EXEC-10] CPDAO.MASTER.USERDAO.FINDBYLISTENTITY: <== Итого: 2
Всего есть: 3 части данных, и фактическая доходность: 2 два часа данных!
Запросите все данные в таблице T_STUDENT и наносят их на пневца.
просить:
Получите http: // localhost: 8084/api/студент
возвращаться:
[{"id": 1, "name": "Студент A", "AGE": 16}, {"id": 2, "name": "Студент B", "AGE": 17}]Консольный отпечаток:
Начните запросить ...
Studnet устанавливает две части данных на первой странице!
2018-04-27 19: 54: 56.155 Отладка 6152 --- [NIO-8084-EXEC-8] CPDCSFINDBYLISTENTITY_COUNT: ==> Подготовка: Выберите счет (0) из T_STUDENT, где 1 = 1
2018-04-27 19: 54: 56.155 отладка 6152 --- [NIO-8084-EXEC-8] CPDCSFINDBYLISTENTITY_COUNT: ==> Параметры:
2018-04-27 19: 54: 56.156 Отладка 6152 --- [NIO-8084-EXEC-8] CPDCSFINDBYLISTENTITY_COUNT: <== Итого: 1
2018-04-27 19: 54: 56.157 Отладка 6152 --- [NIO-8084-EXEC-8] CPDCStudentdao.findbyListentity: ==> Подготовка: выберите ID, имя, возраст от T_STUDENT, где 1 = 1 предел?
2018-04-27 19: 54: 56.157 Отладка 6152 --- [NIO-8084-EXEC-8] CPDCStudentdao.findbyListentity: ==> Параметры: 2 (целое число)
2018-04-27 19: 54: 56.157 Отладка 6152 --- [NIO-8084-EXEC-8] CPDCStudentdao.findbylistentity: <== Итого: 2: 2
Всего есть: 3 части данных, и фактическая доходность: 2 два часа данных!
После завершения запроса давайте посмотрим на интерфейс мониторинга Друида. Введите в браузере: http://127.0.0.1:8084/druid/index.html
Операционные записи можно ясно увидеть!
Если вы хотите узнать больше о Druid, вы можете проверить официальную документацию!
Заключение
Эта статья была наконец закончена. При написании кода я столкнулся с множеством проблем, а затем я медленно пытался и нашел информацию для его решения. Эта статья представляет только эти связанные использование очень кратко и может быть более сложной в реальных приложениях.
Справочная статья: https://www.bysocket.com/?p=1712
Официальный адрес Durid: https://github.com/alibaba/druid
Официальный адрес PageHelper: https://github.com/pagehelper/mybatis-pagehelper
Я размещаю проект на GitHub: https://github.com/xuwujing/springboot, вы также можете скачать его локально: нажмите здесь
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.