머리말
이 기사는 주로 Mybatis, Druid 및 PageHelper를 통합하고 여러 데이터 소스 및 Pagination을 구현하는 SpringBoot 이야기를 알려줍니다. 그 중에서 SpringBoot는 이전 기사에서 설명한 Mybatis를 통합하여 여기에 너무 설명하지 않을 것입니다. 중점은 여러 데이터 소스에서 Druid 및 PageHelper를 구성하는 방법에 중점을 둡니다.
드루이드 소개 및 사용
드루이드를 사용하기 전에 드루이드를 간단히 살펴 보겠습니다.
Druid는 데이터베이스 연결 풀입니다. Druid는 현재 최고의 데이터베이스 연결 풀이라고 할 수 있습니다! 우수한 기능, 성능 및 확장 성을 개발자에게 호의적입니다.
Druid는 Alibaba에 600 개가 넘는 응용 프로그램을 배치했으며 1 년 이상 생산 환경에서 대규모 배치에 대한 엄격한 테스트를 거쳤습니다. Druid는 Alibaba가 Monitoring이라는 데이터베이스 연결 풀입니다!
동시에 Druid는 단순한 데이터베이스 연결 풀이 아니라 Druid의 핵심은 주로 세 부분을 포함합니다.
드루이드의 주요 기능은 다음과 같습니다.
소개에 대해서는 이야기하지 않겠습니다. 자세한 내용은 공식 문서를 참조하십시오.
그런 다음 Druid 사용 방법을 소개하겠습니다.
우선, Maven 의존성은 드루이드 항아리를 추가하십시오.
<pectionency> <groupid> com.alibaba </groupid> <artifactid> druid </artifactid> <bersion> 1.1.8 </version> </fectionency>
구성 측면에서 가장 중요한 것은 다음과 같이 application.properties 또는 application.yml에 추가하는 것입니다.
참고 : 여기에는 두 가지 데이터 소스를 사용하기 때문에 약간 다릅니다. 드루이드 구성에 대한 지침은 이미 아래에 자세히 설명되어 있으므로 여기에서 설명하지 않을 것입니다.
## 기본 데이터 소스 Mas emaster.datasource.username = rootmaster.datasource.password = 123456mas 다른 데이터 소스 cluster.datasource.url = jdbc : mysql : // localhost : 3306/springboot_test? useUnicode = true & characterEncoding = utf8cluster.datasource.username = rootcluster.datasource.password = 123456cluster.datasource.driversname = com.mysql.mysql.mysclassname# 연결 풀에 대한 구성 정보 # 크기, 최소, 최대 스프링 초기화를 초기화하십시오 .Datasource.type = com.alibaba.druid.pool.druiddatasourcespring.datasource.initialSize = 5 spring.datasource.minidle = 5 spring.datasource.MaxActive = 20 # 연결 시간 구성 시간 구성 시간 구성 spring.datasource.maxwait = 60000 # 밀리 초에 밀려가 필요한 유휴 연결을 감지하는 데 걸리는 감지 간격을 수행하는 데 걸리는 시간 구성 Spring.datasource.TimeBetweenEvictionRunsmillis = 60000 # milliseconds에서 수영장에서 생존하기 위해 최소한의 시간을 Spring. spring.datasource.validationQuery = 듀얼 스프링에서 1을 선택하십시오 .Datasource.datasource.testStrImileDhiple = true spring.datasource.testonBronce = false spring.datasource.testonreturn = false # 각 연결 스프링에서 pscache의 크기를 지정하고 진실한 pscache의 크기를 지정합니다. spring.datasource.maxpoolpreparedStatementPerConnectionsize = 20 # 가로 채는 통계 모니터링 필터 구성. 제거 후 모니터링 인터페이스 SQL을 계산할 수 없습니다. '벽'은 방화벽 스프링에 사용됩니다. Datasource.filters = STAT, WALL, LOG4J # ConnectProperties 속성을 통한 MERGESQL OPEN OPEN MERGESQL 기능; 느린 SQL 레코드 스프링
구성 파일을 성공적으로 추가 한 후 Druid 관련 클래스를 작성해 봅시다.
먼저 기본 데이터 소스 구성 클래스 인 MasterDatasourceConfig.java 클래스입니다.
@configuration@mapperscan (basepackages = mas 정적 최종 문자열 mapper_location = "classPath : Mapper/Master/*. XML"; @Value ( "$ {master.datasource.url}") 개인 문자열 URL; @Value ( "$ {master.datasource.username}") 개인 문자열 사용자 이름; @Value ( "$ {master.datasource.password}") 개인 문자열 암호; @Value ( "$ {mas @Value ( "$ {spring.datasource.initialSize}") 개인 int 이니셜 크기; @Value ( "$ {spring.datasource.minidle}") 개인 int minidle; @Value ( "$ {spring.datasource.maxactive}") private int maxactive; @Value ( "$ {spring.datasource.maxwait}") 개인 int maxwait; @Value ( "$ {spring.datasource.timebetweenevictionRunsmillis}") private int timebetweenevictionRunsmillis; @Value ( "$ {spring.datasource.mineVictableDletimemillis}") private int minevictableDletimemillis; @Value ( "$ {spring.datasource.validationQuery}") private String validationQuery; @Value ( "$ {spring.datasource.testsThileIdle}") 개인 부울 테스트 WhileIdle; @Value ( "$ {spring.datasource.testonborrow}") 개인 부울 testonborrow; @Value ( "$ {spring.datasource.testonreturn}") 개인 부울 testonreturn; @Value ( "$ {spring.datasource.poolpreparedStatements}") 개인 부울 풀 프리 퍼드 스테이트; @Value ( "$ {spring.datasource.MaxPoolPrepRedStatementPerConnectionsize}") private int maxpoolprepedStatementPerConnectionsize; @Value ( "$ {spring.datasource.filters}") 개인 문자열 필터; @Value ( "{spring.datasource.connectionProperties}") 개인 문자열 ConnectionProperties; @Bean (이름 = "MasterDatasource") @Primary Public DataSource Mas DataSource.setUrl (URL); DataSource.setusername (사용자 이름); DataSource.setpassword (비밀번호); DataSource.setDriverClassName (DriverClassName); // 특정 구성 DataSource.setInitialSize (이니셜 크기); DataSource.setminidle (Minidle); DataSource.setMaxActive (maxactive); DataSource.setmaxwait (Maxwait); DataSource.settimebetweenevictionRunsmillis (TimeBetweenevictionRunsmillis); DataSource.SetMineVictableIdleTimemillis (MineVictableDletimemillis); DataSource.setValidationQuery (ValidationQuery); DataSource.SetTestWhileIdle (테스트 whileIdle); DataSource.SetTestOnborrow (TestOnBorrow); DataSource.SetTestOnreturn (TreastonReturn); DataSource.setPoolpreparedStatements (poolpreparedStatements); DataSource.setMaxPoolPreparedStatementPerConnectionsize (MaxPoolPreparedStatemperConnectionsize); try {dataSource.setFilters (필터); } catch (sqlexception e) {e.printstacktrace (); } dataSource.setConnectionProperties (ConnectionProperties); 반환 데이터 소스; } @Bean (name = "mas } @Bean (이름 = "mas SessionFactory.SetDatasource (MasterDatasource); SessionFactory.setMapperLocations (New PathMatchingResourCepatterNresolver () .getResources (Mas return sessionfactory.getObject (); }}이 두 가지 주석은 다음과 같습니다.
**@Primary ** : 유사한 콩 후보자가 여러 개있는 경우이 콩으로 로고 콩
우선 순위가 고려됩니다. 여러 데이터 소스를 구성 할 때는 기본 데이터 소스가 있어야하고 @primary를 사용하여 Bean을 표시해야합니다.
**@Mapperscan ** : Mapper 인터페이스 및 컨테이너 관리를 스캔하십시오.
sqlsessionFactoryRef는 sqlsessionFactory의 고유 인스턴스를 정의하는 것을 나타냅니다.
위 구성이 완료되면 Druid를 연결 풀로 사용할 수 있습니다. 그러나 Druid는 단순히 연결 풀이 아닙니다. 또한 모니터링 응용 프로그램이라고도 할 수 있습니다. SQL 관련 정보를 명확하게 볼 수있는 웹 모니터링 인터페이스가 제공됩니다.
SpringBoot에서 Druid의 모니터링 기능을 사용하면 등록 서비스 및 필터링 규칙을 구현하기 위해 StatViewServlet 및 WebStatFilter 클래스 만 작성하면됩니다. 여기서 우리는 **@configuration ** 및 **@bean **를 사용 하여이 두 가지를 함께 쓸 수 있습니다.
쉽게 이해하기 위해 관련 구성 지침도 코드에 작성되어 있으므로 여기에서 자세히 설명하지 않습니다.
코드는 다음과 같습니다.
@ConfigurationPublic Class DruidConfiguration {@bean public servletregistrationbean druidstatviewservle () {// 등록 서비스 servletregistrationbean servletregistrationbean = new servletregistrationBean (new StatViewServlet (), "/druid/*"); // Whitelist (비어있는 것을 나타냅니다. 모두 쉼표로 쉼표로 분리 할 수 있습니다. // ip blacklist (공통 존재가있을 때 Dony가 우선 순위를 차지합니다) servletregistrationBean.addinitParameter ( "deny", "127.0.0.2"); // 로그인 사용자 이름 및 비밀번호 ServletregistrationBean.AdDinitParameter ( "loginUsername", "Pancm"); servletregistrationbean.addinitparameter ( "loginpassword", "123456"); // 데이터를 재설정 할 수 있는지 여부. servletregistrationbean.addinitparameter ( "재설정 가능", "false"); 리턴 servletregistrationbean; } @bean public filterregistrationbean druidstatfilter () {filtergistrationBean filterregistrationBean = new FilterRegistrationBean (new WebStatFilter ()); // 필터링 규칙 추가 FilterRegistrationBean.AdDurlPatterns ( "/*"); // 무시할 필요가없는 형식 정보 추가 FilterRegistrationBean.AdDinitParameter ( "제외", "*.js,*. gif,*. jpg,*. png,*. css,*. ico,/druid/*"); System.out.println ( "Druid 초기화가 성공적으로!"); 반환 필터 등록 비안; }}작성 후 프로그램을 시작한 후 브라우저에서 http://127.0.0.1:8084/druid/index.html을 입력 한 다음 세트 사용자 이름과 비밀번호를 입력하여 웹 인터페이스에 액세스하십시오.
멀티 데이터 소스 구성
멀티 데이터 소스 구성을 수행하기 전에 SpringBoot 및 SpringBoot_test의 MySQL 데이터베이스에서 다음 스크립트를 실행하십시오.
-SpringBoot 라이브러리 작성 테이블 생성 테이블`t_user` (`ID 'int (11) NOT NULL AUTO_INCREMENT COMMENT'self-increment ID ','name` varchar (10) 기본 NULL 주석 '이름',`age 'int (2) 기본 NULL NULL NULT NULL NULL 주석'AGE '', 1 차 키 (`id ') ENGINE = ENGING AUTO_INCREMENT = UTF8- springboot_test 라이브러리 생성 테이블 생성 테이블`t_student` (`id` int (11) not null auto_increment,`name` varchar (16) 기본 null,`age` int (11) 기본 null, 기본 키 (`id`)) 엔진 = innodb auto_increment = 2 기본 charset = utf8
참고 : 게으르기 위해 두 테이블의 구조가 동일하게 만들어집니다! 그러나 그것은 테스트에 영향을 미치지 않습니다!
이 두 데이터 소스에 대한 정보는 Application.Properties에서 구성되었으며 구성이 한 번 게시되었으므로 여기에 게시하지 않습니다.
여기서 우리는 두 번째 데이터 소스의 구성에 중점을 둘 것입니다. 위의 Mas Mas 코드는 다음과 같습니다.
@configuration@mapperscan (basepackages = clusterdatasourceconfig.package, sqlsessionfactoryRef = "clustersqlsessionSctionFactory") public class clusterDatasourceConfig {정적 최종 문자열 패키지 = "com.pancm.dao.cluster"; 정적 최종 문자열 mapper_location = "classPath : Mapper/Cluster/*. XML"; @Value ( "$ {cluster.datasource.url}") 개인 문자열 URL; @Value ( "$ {cluster.datasource.username}") 개인 문자열 사용자 이름; @Value ( "$ {cluster.datasource.password}") 개인 문자열 암호; @Value ( "$ {cluster.datasource.driverClassName}") 개인 문자열 드라이버 클래스; // mas DataSource.setUrl (URL); DataSource.setusername (사용자 이름); DataSource.setpassword (비밀번호); DataSource.setDriverClassName (DriverClass); // Mas } @Bean (name = "clusterTransactionManager") public dataSourcetRansactionManager clusterTransactionManager () {return new dataSourcetRansactionManager (clusterDatasource ()); } @Bean (이름 = "clustersqlsessionFactory") public sqlsessionFactory clustersclsessionFactory (@qualifier ( "clusterDatasource") dataSource clusterDatasource) 예외 {final sqlsessionaltorybean sessionActory = new sqlSessionFactoryBean (); SessionFactory.SetDatasource (ClusterDatasource); SessionFactory.setMapperLocations (New 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": "student a", "age": 16} { "name": "student b", "age": 17} { "name": "student c", "age": 18}데이터를 성공적으로 추가 한 후 쿼리를 위해 다른 인터페이스를 호출하십시오.
묻다:
http : // localhost : 8084/api/user? name = li si를 얻으십시오
반품:
{ "id": 2, "name": "li si", "age": 25}묻다:
http : // localhost : 8084/api/student? name = 학생 c
반품:
{ "id": 1, "이름": "학생 C", "Age": 16}데이터에서 여러 데이터 소스가 성공적으로 구성되었음을 알 수 있습니다.
PageHelper Pagination 구현
PageHelper는 MyBatis 용 페이징 플러그인으로 매우 유용합니다! 여기에서 적극 권장됩니다! ! !
PageHelper는 사용하기가 매우 간단합니다. Maven에서 PageHelper의 종속성을 추가하면됩니다.
Maven의 종속성은 다음과 같습니다.
<pectionency> <groupid> com.github.pageHelper </groupId> <artifactID> PageHelper-Spring-Boot-Starter </artifactid> <2.3 </version> </dependency>
참고 : 여기에서 SpringBoot 버전을 사용합니다! 다른 버전도 사용할 수 있습니다.
종속성을 추가 한 후에는 다음 구성 또는 코드 만 추가하면됩니다.
첫 번째 유형은 application.properties 또는 application.yml 에 추가됩니다
PageHelper : HelperDialect : MySQL OffsetAspagenum : True RowBoundSwithCount : True 합리적 : False
두 번째 유형은 mybatis.xml 구성에 추가됩니다
<bean id = "sqlsessionfactory"> <property name = "dataSource"ref = "dataSource"/> <!-mapping.xml 파일-> <property name = "mapperlocations"value = "classPath : mapper/*. xml"> </propertin "> <Productins"> <eanter> <eanter> <eanter "> <value> HelperDialect = MySQL OffsetAspagenum = true rowboundswithCount = true 합리적 = false> </property> </bean> </array> </property> </bean>
세 번째 유형은 코드에 추가되고 **@bean ** 주석을 사용하여 프로그램을 시작할 때 초기화됩니다.
@bean public pagehelper pagehelper () {pagehelper pagehelper = new PageHelper (); 속성 속성 = 새로운 속성 (); // Database Properties.SetProperty ( "HelperDialect", "MySQL"); // 매개 변수 오프셋을 pagenum properties.setProperty ( "offsetAspagenum", "true")로 사용할지 여부; // count properties.setProperty ( "rowboundswithCount", "true"); // Pagination Properties.setProperty ( "합리적", "false")를 합리화할지 여부; PageHelper.SetProperties (속성); }여기서 여러 데이터 소스를 사용하고 있기 때문에 여기서 구성은 약간 다릅니다. SessionFactory에서 구성해야합니다. 여기서 우리는 MasterDatasourceConfig.java에 해당하는 수정을합니다. MasterSqlSessionFactory 메소드에서 다음 코드를 추가하십시오.
@Bean (name = "mas SessionFactory.SetDatasource (MasterDatasource); SessionFactory.setMapperLocations (New PathMatchingResourCepatterNresolver () .getResources (Mas // Pagination 플러그인 인터셉터 인터셉터 = 새로운 PageInterceptor (); 속성 속성 = 새로운 속성 (); // Database Properties.SetProperty ( "HelperDialect", "MySQL"); // 매개 변수 오프셋을 pagenum properties.setProperty ( "offsetAspagenum", "true")로 사용할지 여부; // count properties.setProperty ( "rowboundswithCount", "true"); // Pagination Properties.setProperty ( "합리적", "false")를 합리화할지 여부; interceptor.setProperties (속성); SessionFactory.setplugins (new interceptor [] {interceptor}); return sessionfactory.getObject (); }참고 : 다른 데이터 소스도 페이징을하려는 경우 위의 코드를 참조하십시오.
여기서 주목해야 할 것은 합리적인 매개 변수이며, 이는 합리화 페이징을 의미하며 기본값은 False입니다. 이 매개 변수가 true로 설정되면 pagenum <= 0 및 pagenum> 페이지 (총 숫자가 초과 될 때)시 첫 페이지가 쿼리됩니다. 마지막 페이지가 쿼리됩니다. 기본적으로 false 인 경우 쿼리는 매개 변수를 직접 기반으로합니다.
PageHelper를 설정 한 후 사용하면 PageHelper.startPage(pageNum,pageSize); 쿼리 SQL 앞에서 총 번호를 알고 싶다면 쿼리 SQL 문 후에 구매하고 page.getTotal() 추가하십시오.
Code example:
공개 목록 <T> findByListentity (t entity) {list <t> list = null; 시도 {page <?> page = pageHelper.startPage (1,2); System.out.println (getClassName (Entity)+"첫 페이지에서 두 개의 데이터를 설정하십시오!"); list = getMapper (). FindByListentity (엔티티); System.out.println ( "총 :"+page.getTotal ()+"데이터가 있습니다. 실제 반환은 다음과 같습니다."+list.size ()+"두 데이터!"); } catch (예외 e) {logger.error ( "query"+getClassName (entity)+"실패! 이유는 :", e); } 반환 목록; }코드가 작성된 후 최종 테스트가 시작됩니다.
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 : ==> 준비 : T_USER에서 COUNT (0)를 선택하십시오.
2018-04-27 19 : 55 : 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 : <== TOTAL : 1
2018-04-27 19 : 55 : 55 : 50.772 디버그 6152 --- [IO-8084-Exec-10] CPDAO.mas
2018-04-27 19 : 55 : 50.773 디버그 6152 --- [IO-8084-Exec-10] CPDAO.mas
2018-04-27 19 : 55 : 55 : 50.774 디버그 6152 --- [IO-8084-Exec-10] CPDAO.Mas
총 3 가지 데이터가 있으며 실제 반환은 다음과 같습니다. 2 두 조각 데이터!
t_student 테이블의 모든 데이터를 쿼리하고 페이지를 paginate하십시오.
묻다:
http : // localhost : 8084/api/student를 받으십시오
반품:
[{ "id": 1, "이름": "학생 A", "Age": 16}, { "id": "2,"이름 ":"Student B ","Age ": 17}]콘솔 프린트 :
쿼리 시작 ...
Studnet은 첫 페이지에 두 개의 데이터를 설정합니다!
2018-04-27 19 : 54 : 56.155 디버그 6152 --- [NIO-8084-Exec-8] CPDCSFindByListity_Count : ==> 준비 : t_student에서 카운트 (0)를 선택하십시오.
2018-04-27 19 : 54 : 56.155 디버그 6152 --- [NIO-8084-EXEC-8] CPDCSFINDBYLISTITION_COUNT : ==> 매개 변수 :
2018-04-27 19 : 54 : 56.156 디버그 6152 --- [NIO-8084-Exec-8] CPDCSFINDBYLISTITION_COUNT : <== TOTAL : 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 : <== TOTAL : 2
총 3 가지 데이터가 있으며 실제 반환은 다음과 같습니다. 2 두 조각 데이터!
쿼리가 완료되면 Druid의 모니터링 인터페이스를 살펴 보겠습니다. 브라우저를 입력하십시오 : http://127.0.0.1:8084/druid/index.html
작업 레코드는 명확하게 볼 수 있습니다!
Druid에 대해 더 알고 싶다면 공식 문서를 확인할 수 있습니다!
결론
이 기사는 마침내 완성되었습니다. 코드를 작성할 때 많은 문제가 발생했으며 천천히 시도하여 정보를 해결하기 위해 정보를 찾았습니다. 이 기사는 이러한 관련 사용을 매우 간단히 소개하며 실제 응용 분야에서 더 복잡 할 수 있습니다.
참조 기사 : https://www.bysocket.com/?p=1712
끔찍한 공식 주소 : https://github.com/alibaba/druid
PageHelper 공식 주소 : https://github.com/pagehelper/mybatis-pagehelper
프로젝트를 github : https://github.com/xuwujing/springboot에 올려 놓으십시오. 로컬로 다운로드 할 수도 있습니다. 여기를 클릭하십시오.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.