數據分頁
limit實現分頁
在學習 Mybatis 等持久層框架的時候,會經常對數據進行增刪改查操作,使用最多的是對數據庫進行查詢操作,如果查詢大量數據的時候,我們往往使用分頁進行查詢,也就是每次處理小部分數據,這樣對數據庫壓力就在可控範圍內。
使用Limit實現分頁
Limit 檢索 stratIndex 默認從 0 開始,pageSize 表示查詢的記錄數。
#語法
SELECT * FROM table LIMIT stratIndex,pageSize
SELECT * FROM table LIMIT 5,10; // 檢索記錄行 6-15
#爲了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個參數爲 -1:
SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last.
#如果只給定一個參數,它表示返回最大的記錄行數目:
SELECT * FROM table LIMIT 5; //檢索前 5 個記錄行
#換句話說,LIMIT n 等價於 LIMIT 0,n。
接下來我們對項目進行修改。
1、UserMapper.java
List<User> getUserByLimit(Map<String,Integer> map);
2、UserMapper.xml
<select id="getUserByLimit" parameterType="map" resultMap="userMap">
select * from mybatis.user limit ${startIndex},${pageSize};
</select>
3、修改測試類
@Test
public void getUserByLimit(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String,Integer> map = new HashMap<String, Integer>();
map.put("startIndex",0);
map.put("pageSize",2);
List<User> users = userMapper.getUserByLimit(map);
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
RowBounds分頁
我們除了使用 Limit 在 SQL 層面實現分頁,也可以使用 RowBounds 在 Java 代碼層面實現分頁,當然此種方式作爲了解即可。我們來看下如何實現的!
修改步驟:
1、UserMapper.java
List<User> getUserByRounds();
2、UserMapper.xml
<select id="getUserByRounds" resultMap="userMap">
select * from mybatis.user
</select>
3、修改測試類
@Test
public void getUserByRounds(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
RowBounds rowBounds = new RowBounds(1, 2);
List<User> users = sqlSession.selectList("com.msdn.mapper.UserMapper.getUserList",null,rowBounds);
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
PageHelper
1、在 pom.xml 中添加如下依賴:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
2、在 MyBatis 配置 xml 中配置攔截器插件
<!--
plugins在配置文件中的位置必須符合要求,否則會報錯,順序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
<!-- com.github.pagehelper爲PageHelper類所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--數據庫方言-->
<property name="helperDialect" value="mysql"/>
<!--合理化分頁-->
<property name="reasonable" value="true"/>
</plugin>
</plugins>
特別注意,新版攔截器是 com.github.pagehelper.PageInterceptor
。 com.github.pagehelper.PageHelper
現在是一個特殊的 dialect
實現類,是分頁插件的默認實現類,提供了和以前相同的用法。
3、測試類
@Test
public void getUser(){
//1.獲取SqlSession對象
SqlSession sqlSession = MybatisUtil.getSqlSession();
//2.生成Dao代理對象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//3.設置分頁參數
int pageNun = 3; // 頁碼
int pageSize = 2;// 每頁顯示條數
PageHelper.startPage(pageNun,pageSize);
//4. 查詢用戶數據
List<User> users = userMapper.getUserList();
//5.把用戶數據封裝到PageInfo分頁結果對象
PageInfo<User> info = new PageInfo<User>(users);
//6.取出PageInfo的屬性
System.out.println("總記錄數:" + info.getTotal());
System.out.println("當前頁數:" + info.getPageNum());
System.out.println("每頁數:" + info.getPageSize());
System.out.println("總頁數:" + info.getPages());
System.out.println("結果集:" + info.getList());
for (User user : users) {
System.out.println(user);
}
//7.關閉連接
sqlSession.close();
}
執行結果爲:
總記錄數:5
當前頁數:3
每頁數:2
總頁數:3
結果集:Page{count=true, pageNum=3, pageSize=2, startRow=4, endRow=6, total=5, pages=3, reasonable=true, pageSizeZero=false}[User(id=6, name=clearLove, password=12345)]
User(id=6, name=clearLove, password=12345)
日誌
Mybatis內置的日誌工廠提供日誌功能,具體的日誌實現有以下幾種工具:
- SLF4J
- Apache Commons Logging
- Log4j 2
- Log4j
- JDK logging
具體選擇哪個日誌實現工具由 MyBatis 的內置日誌工廠確定。它會使用最先找到的(按上文列舉的順序查找)。 如果一個都未找到,日誌功能就會被禁用。
標準日誌實現
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
上述日誌輸出結果比較凌亂,不符合我們預期的效果,因此可以使用其他日誌。
Log4j
簡介:
- Log4j是Apache的一個開源項目
- 通過使用Log4j,我們可以控制日誌信息輸送的目的地:控制檯,文本,GUI組件…
- 我們也可以控制每一條日誌的輸出格式;
- 通過定義每一條日誌信息的級別,我們能夠更加細緻地控制日誌的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼。
使用步驟:
1、導入 log4j 依賴
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2、配置文件編寫
#將等級爲DEBUG的日誌信息輸出到console和file這兩個目的地,console和file的定義在下面的代碼
log4j.rootLogger=DEBUG,console,file
#控制檯輸出的相關設置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n
#文件輸出的相關設置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/msdn.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-mm-dd}][%c]%m%n
#日誌輸出級別
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
3、mybatis-config.xml
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
4、測試類
@Test
public void getUserByLimit(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String,Integer> map = new HashMap<String, Integer>();
map.put("startIndex",0);
map.put("pageSize",2);
List<User> users = userMapper.getUserByLimit(map);
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
執行結果爲: