머리말
테이블이 DataTable과 같은 웹 개발에 관여하면 페이징의 필요성이 발생합니다. 일반적으로 페이징 방법을 프론트 엔드 페이징과 백엔드 페이징의 두 가지 유형으로 나눕니다.
프론트 엔드 페이지 매김
데이터 테이블의 모든 레코드 (AJAX)는 한 번에 요청 된 다음 프론트 엔드에 캐시하고 계산 된 카운트 및 페이징 로직을 계산합니다. 일반적으로 프론트 엔드 구성 요소 (예 : 데이터 가능)는 페이징 작업을 제공합니다.
특징은 다음과 같습니다. 단순하고 소규모 웹 플랫폼에 매우 적합합니다. 데이터 양이 클 때 성능 문제가 발생하고 쿼리 및 네트워크 전송 시간이 길어질 것입니다.
백엔드 페이지 매김
AJAX 요청에서 페이지 번호 (pagenum) 및 각 페이지의 크기 (pagesize)를 지정하십시오. 백엔드는 페이지의 데이터를 쿼리하고 반환하며 프론트 엔드는 렌더링을 담당합니다.
특징은 다음과 같습니다. 더 복잡합니다. 성능 병목 현상은 MySQL의 쿼리 성능에 있으며, 물론 최적화되고 해결할 수 있습니다. 일반적으로 웹 개발은이 방법을 사용합니다.
우리는 백엔드 페이지 매김에 대해 이야기하고 있습니다.
Pagination에 대한 MySQL 지원
간단히 말해서 MySQL은 한계 조항을 통해 페이지 매김을 지원합니다. 아래 예제를 참조하십시오.
한계 키워드 사용은 다음과 같습니다
[오프셋,] 행을 제한합니다
오프셋은 첫 번째 행에 대한 오프셋이며 (첫 번째 행은 0) 행 수입니다.
# 각 페이지는 10 개의 레코드가 있고 첫 번째 페이지를 가져 가서 첫 번째 10 개의 레코드를 반환합니다 * Tablea Limit 0,10에서 선택 * 각 페이지는 10 개의 레코드가 있고 두 번째 페이지를 가져 가서 11 번째 레코드를 반환합니다.
여기서 언급하고 싶은 것은 MySQL이 페이지 매김을 처리 할 때입니다.
1000,10을 제한하십시오 - 1010 조각의 데이터를 필터링 한 다음 처음 1000 조각을 버리고 10 개를 보관하십시오. 오프셋이 커지면 성능이 줄어 듭니다.
100000,10을 제한하십시오 - 10W+10 조각의 데이터를 필터링 한 다음 처음 10W 조각을 버립니다. 페이지 매김에서 성능 문제를 발견하면이 아이디어에 따라 조정할 수 있습니다.
mybatis 페이징 플러그인 PageHelper
Java Spring Development를 사용할 때 Mybatis는 데이터베이스 작업을위한 강력한 도구입니다. 그러나 페이징을 다룰 때 Mybatis에는 특별한 방법이 없습니다. 일반적으로 한계 조항을 직접 작성하여 구현해야합니다. 이는 비교적 비쌉니다. 다행히도 PageHelper 플러그인이 있습니다.
1. POM 의존성
나는 mybatis의 구성을 언급하지 않을 것입니다. PageHelper의 종속성은 다음과 같습니다. 새 버전이 필요한 경우 Maven에서 선택할 수 있습니다.
<pectionency> <groupId> com.github.pageHelper </groupId> <artifactID> pageHelper </artifactID> <버전> 4.1.4 </version> </fectionency>
2. PageHelper의 MyBatis 구성
일반적으로 리소스 경로에서 mybatis 구성 파일을 엽니 다. 제 이름은 mybatis-config.xml입니다.
<? xml version = "1.0"encoding = "utf-8"?> <! doctype configuration public "-// mybatis.org//dtd config 3.0 // en" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <<setingter <! 캐시를 활성화 또는 비활성화합니다. -> <setting name = "Cacheenabled"value = "true"/> <!-전 세계적으로 게으른 하중을 활성화 또는 비활성화합니다. 비활성화되면 모든 관련 객체가 즉시로드됩니다. -> <setting name = "lazyloadingEnabled"value = "true"/> <!-활성화되면 게으른 로딩 속성이있는 객체가 호출 될 때 속성을 완전히로드합니다. 그렇지 않으면 각 속성은 필요에 따라로드됩니다. -> <setting name = "AttressivelaZyloading"value = "true"/> <!-단일 SQL이 여러 데이터 세트를 반환 할 수 있는지 여부 (드라이버의 호환성에 따라) 기본값 : true-> < "multiplerestestSetSenabled"value = "true"/<!-열에 대한 별명이 사용될 수 있는지 여부 (true) name = "usecolumnlabel"value = "true"/> <!- JDBC가 기본 키를 생성하도록 허용합니다. 드라이브 지원이 필요합니다. True로 설정되면이 설정은 생성 된 기본 키를 강제로 강제로, 일부 드라이브는 양립 할 수 없지만 여전히 실행할 수 있습니다. 기본값 : false-> <setting name = "usegeneratedKeys"value = "true"/> <!-MyBatis가 데이터베이스 테이블의 열을 자동으로 매핑하는 방법을 지정하십시오 : 부분적으로 가득 차면 : 부품 전체 :> <autupapping behavior "value ="파트너 "/> <!-이것은 기본 실행 유형입니다. 명령문 및 배치 업데이트)-> <설정 이름 = "defaultexecutortype"value = "simple"/> <!-낙타 명명법을 사용하여 필드를 변환합니다. -> <seting name = "mapUnderscoretocamelcase"value = "true"/> <!-로컬 캐시 범위 세션 설정 : 데이터 공유 명령문이 있습니다 : 문장 범위 (이것은 데이터 공유가 아님) defalut : session = "value ="session "/> <!-jdbc 유형이 비어 있지 않으며, 일부 드라이버는 가치를 지정해야합니다. null 값을 삽입 할 때 유형 -> <setting name = "jdbctypefornull"value = "null"/> </settings> <플러그인> <plugin interceptor = "com.github.pagehelper.pageHelper"> <Property Name = "dialect"value = "mySql"/> <속성 이름 = "오프셋 스페이그 페그 퓨어". 이름 = "rowboundswithCount"value = "false"/> <속성 이름 = "pagesizezero"value = "true"/> <속성 이름 = "합리적"value = "false"/> <property name = "supportMethodSarguments"value = "false"/<property name = "returnPageInfo"value = "none /> </plugins>
여기에주의를 기울여야 할 것은 PageHelper와 관련된 구성입니다.
MyBatis 구성 파일을로드하지 않으면 MyBatis 기본 구성을 사용하고 있습니다. myBatis 구성 파일을로드하는 방법은 무엇입니까?
DataSrouce 구성으로 이동하십시오.
sqlsessionFactory를 구성 할 때 MyBatis Core 구성 파일 및 Mapper Path를 지정하면 코드는 다음과 같습니다.
@Bean (이름 = "moonlightsqlsessionFactory") @Primary public public sqlsessionFactory moonlightsqlsessionFactory (@Qualifier ( "MoonlightData") DataSource DataSource) 예외 {sqlsession actorybean bean = new sqlsession actorcorybean (); Bean.SetDatasource (DataSource); bean.setMapperLocations (new PathMatchingResourcepatternresolver (). getResources ( "classpath : mybatis-mapper/*. xml"); bean.setConfigLocation (새로운 classPathResource ( "mybatis-config.xml")); return bean.getObject (); }설명 :
여기에 구성된 Mapper.xml 스토리지 경로는 Resource/MyBatis-Mapper 폴더에 있습니다.
여기에 구성된 mybatis-config.xml 파일은 자원 아래에 있습니다.
3. Pagination
Mapper.xml을 준비하고 테스트를 위해 하나를 작성하고 프로젝트에서 하나를 사용하십시오.
이 쿼리는 일반적인 다중 조건 쿼리입니다. 우리가해야 할 일은 여러 조건과 일치하는 레코드를 페이지에 빠뜨리는 것입니다.
<? xml version = "1.0"encoding = "utf-8"?> <! doctype mapper public "-// mybatis.org//dtd Mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <<1mapper namespace = "com.kangaroo.studio.moonlight.dao.mapper.moonlightmapper"> <resultmap id = "geofencelist"type = "com.kangaroo.studio.moonlight.dao.model.geofence"> <constructor> <idarg column = "id"javatype = "java.lang.lang.lang. jdbctype = "Integer" /> <arg column = "name"javatype = "java.lang.string"jdbctype = "varchar" /> <arg column = "type"java.lang.lang.integer "jdbctype ="integger "javatype ="javatype ""javatype " jdbctype = "varchar" /> <arg column = "geo"javatype = "java.lang.string"jdbctype = "varchar" /> <arg column = "createTime"javatype = "java.lang.string"jdbctype = "varchar" /> <arg column = "javatethe" "java.lang" jdbctype = "varchar"/> </constructor> </resultmap> <sql id = "base_column"> id, 이름, 이름, 유형,`group`, geo, createTime, updateTime </sql> <select id = "QueryGeofence"parameterType = "com.kangaroo.studio.moon -geofintright.daoo.dao.dao.dao.daoo.daoo.daoo.daoo.daoo. resultmap = "geofenceList"> select <select <select <select <포함 refid = "base_column"/> geofence에서 "base_column"/> 여기서 1 = 1 <if test = "type! = null"> and type = #{type} </if> < "name! = null"> 및 이름과 같은 이름은 ( '%', #{name}, '%'</if> <if test = null "> if test! concat ( '%', #{group}, '%') </if> <if test = "starttime! = null"> 및 createTime> = #{startTime} </if> <if test = "endTime! = null"및 createTime <= #{endTime} </if> </mapper>Mapper.java 인터페이스에 해당 방법을 작성하십시오
List <Geofence> QueryGeofence (GeofenceQueryParam GeofenceQueryParam);
먼저 페이지 코드를 추가 한 다음 나중에 설명합니다.
@requestmapping (value = "/fence/query", method = requestmethod.post) @ResponseBody Public Response QueryFence (@requestBody geofenceQuenceParam geofenceQueryParam) {geofencequeryparam.getpagenum ()! = null? geofenqueryparam (geofencePeram); integer pagesize = geofencequeryparam.getPagesize ()! = null? geofencequeryparam.getPagesize () : 10; pageHelper.startPage (pagenum, pagesize); 목록 <geofence> list = moonlightmapper.querygeofence (GeofenceQueryParam); 새로운 응답을 반환합니다 (resultCode.Success, "Query Geofence Success", List); } catch (예외 e) {logger.error ( "Query Geofence 실패", e); 새 응답을 반환합니다 (resultCode.Exception, "Query Geofence 실패", NULL); }}설명 :
1. PageHelper의 장점은 Pagination과 Mapper.xml이 완전히 분리된다는 것입니다. 구현 방법은 플러그인 형태로 MyBatis 실행 프로세스를 강화하여 총 카운트 및 한계 쿼리를 추가하는 것입니다. 물리적 페이지에 속합니다.
2.주의를 기울여야 할 보안 문제가 있습니다. 그렇지 않으면 페이징 장애로 이어질 수 있습니다. 이 블로그에서 구절을 직접 붙여 넣었습니다.
4. 언제 안전하지 않은 페이징으로 이어질 것인가?
PageHelper 메소드는 정적 ThreadLocal 매개 변수를 사용하고 페이징 매개 변수 및 스레드가 바인딩됩니다.
PageHelper 메소드가 즉시 호출되고 MyBatis 쿼리 메소드가 이어지는 한 안전합니다. PageHelper는 최종 스 니펫에서 ThreadLocal 저장된 객체를 자동으로 지우므로.
executor에 들어가기 전에 예외가 발생하면 스레드를 사용할 수 없습니다. 이는 인간 버그 (예 : 인터페이스 메소드와 XML 간의 불일치와 같은 매핑 확장이 발견되지 않음). 이 상황으로 인해 스레드를 사용할 수 없기 때문에 Threadlocal 매개 변수가 잘못 사용되지 않습니다.
그러나 다음 코드를 작성하면 안전하지 않은 사용법입니다.
PageHelper.startPage (1, 10); List <country> list; if (param1! = null) {list = countryMapper.Selectif (param1);} else {list = new ArrayList <Cation> ();}이 경우 Param1에는 NULL이 있으므로 PageHelper는 페이징 매개 변수를 생성하지만 소비되지 않으며이 매개 변수는이 스레드에 남아 있습니다. 이 스레드가 다시 사용되면 페이징 매개 변수를 소비하기 위해 페이징이되어서는 안되는 메소드가 발생하여 설명 할 수없는 페이징이 발생할 수 있습니다.
위 코드는 다음과 같이 작성해야합니다.
List <country> list; if (param1! = null) {pageHelper.startPage (1, 10); list = countrymapper.selectif (param1);} else {list = new arraylist <country> ();}이러한 글쓰기 방식은 안전을 보장 할 수 있습니다.
이로 인해 편안하지 않은 경우 ThreadLocal에 저장된 페이징 매개 변수를 수동으로 정리할 수 있습니다.
List <country> list; if (param1! = null) {pageHelper.startPage (1, 10); try {list = countryMapper.Selectall (); } 마침내 {pageHelper.clearPage (); }} else {list = new ArrayList <Country> ();}이렇게 쓰는 것이 좋지 않으며 필요하지 않습니다.
요약
위는 편집기가 소개 한 Mybatis Paging 플러그인 PageHelper의 구성 및 간단한 사용 방법입니다 (권장). 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!