Mybatis分頁及日誌

數據分頁

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.PageInterceptorcom.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();
    }

執行結果爲:

參考文獻

MyBatis:分頁的實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章