MyBatis學習總結(三)Java日誌(Log4j)的實現/使用Limit實現分頁/使用RowBounds實現分頁/Limit和RowBounds的區別/使用註解開發MyBatis

一、Java日誌(Log4j)的實現

(一)Log4j簡介

  • Log4j–Log for java(java的日誌)
  • Log4j是Apache的一個開源項目,通過使用Log4j,我們可以控制日誌信息輸送的目的地是控制檯、文件、GUI組件,甚至是套接口服務器等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌信息的級別,我們能夠更加細緻地控制日誌的生成過程。

(二)Log4j使用步驟

1.從Maven倉庫中導入Log4j的依賴

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

2.在resources目錄下存放log4j.properties資源文件

可以手動增刪自己需要的日誌格式

log4j.properties:

### Log4j配置 ###
#定義log4j的輸出級別和輸出目的地(目的地可以自定義名稱,和後面的對應)
#[ level ] , appenderName1 , appenderName2
log4j.rootLogger=DEBUG,console,file

#-----------------------------------#
#1 定義日誌輸出目的地爲控制檯
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
####可以靈活地指定日誌輸出格式,下面一行是指定具體的格式 ###
#%c: 輸出日誌信息所屬的類目,通常就是所在類的全名
#%m: 輸出代碼中指定的消息,產生的日誌具體信息
#%n: 輸出一個回車換行符,Windows平臺爲"/r/n",Unix平臺爲"/n"輸出日誌信息換行
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n

#-----------------------------------#
#2 文件大小到達指定尺寸的時候產生一個新的文件
log4j.appender.file = org.apache.log4j.RollingFileAppender
#日誌文件輸出目錄
log4j.appender.file.File=log/info.log
#定義文件最大大小
log4j.appender.file.MaxFileSize=10mb
###輸出日誌信息###
#最低級別
log4j.appender.file.Threshold=ERROR
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n

#-----------------------------------#
#3 druid
log4j.logger.druid.sql=INFO
log4j.logger.druid.sql.DataSource=info
log4j.logger.druid.sql.Connection=info
log4j.logger.druid.sql.Statement=info
log4j.logger.druid.sql.ResultSet=info

#4 mybatis 顯示SQL語句部分
log4j.logger.org.mybatis=DEBUG
#log4j.logger.cn.tibet.cas.dao=DEBUG
#log4j.logger.org.mybatis.common.jdbc.SimpleDataSource=DEBUG
#log4j.logger.org.mybatis.common.jdbc.ScriptRunner=DEBUG
#log4j.logger.org.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
#log4j.logger.java.sql.Connection=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(mybatis核心配置文件)中配置:

<settings>
    <setting name="logImpl" value="LOG4J"/>
</settings>

4.測試

在這裏插入圖片描述

二、分頁的實現

(一)MySQL中的分頁

語法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
好處 : (用戶體驗好、網絡傳輸快、查詢壓力小)

推導:
第一頁 : LIMIT 0,5(顯示前五條信息,起始位置爲0,等同於LIMIT 5)
第二頁 : LIMIT 5,5(顯示第二頁的五條信息,起始位置爲5)
第三頁 : LIMIT 10,5(顯示第三頁的五條信息,起始位置爲10)

第N頁 : LIMIT (pageNo-1)*pageSzie,pageSzie
其中pageNo:頁碼,pageSize:單頁面顯示條數

如何計算出當前起始位置:startIndex = (pageNo-1)* pageSize

例子
從Student表中查詢前五個學生的姓名和學號

SELECT studentname,studentno FROM Student LIMIT 0,5

數據庫中可以實現將查詢的結果分頁顯示,那麼在MyBatis中如何實現呢?

(二)MyBatis中的分頁

1.方法一:使用Limit實現分頁

(1)編寫dao接口

import com.fox.pojo.User;
import java.util.List;
import java.util.Map;

public interface UserDao {
    //查詢全部用戶實現分頁
    List<User> selectUserByLimit(Map<String,Integer> map);
}

(2)編寫對應的mapper映射文件

<?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">

<!--mapper標籤的namespace對應Mapper接口的類,包名+類名-->
<mapper namespace="com.fox.dao.UserDao">
  
    <select id="selectUserByLimit" parameterType="Map" resultType="User">
        select * from mybatis.user limit #{startIndex},#{pageSize}
    </select>

</mapper>

(3)編寫測試類

import com.fox.pojo.User;
import com.fox.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UserMapperTest {  
    @Test
    public void selectUserByLimit(){
        //創建sqlSession
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務

        //準備數據(顯示第幾頁的多少條結果)
        int pageNo = 1;//當前是第幾頁
        int pageSize = 2; //頁面大小

        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("startIndex",(pageNo-1)*pageSize);
        map.put("pageSize",pageSize);

        //測試
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> users = mapper.selectUserByLimit(map);
        for (User user : users) {
            System.out.println(user);
        }

        sqlSession.close();//關閉連接
    }
}

(4)運行測試類

在這裏插入圖片描述

2.方法一:使用RowBounds實現分頁

(1)編寫dao接口

import com.fox.pojo.User;
import java.util.List;

public interface UserDao {
    //查詢全部用戶實現分頁使用RowBounds
    List<User> selectUserByRowBounds();
}

(2)編寫對應的mapper映射文件

<?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">

<!--mapper標籤的namespace對應Mapper接口的類,包名+類名-->
<mapper namespace="com.fox.dao.UserDao">
  
    <select id="selectUserByRowBounds" resultType="User">
        select * from mybatis.user
    </select>

</mapper>

(3)編寫測試類

import com.fox.pojo.User;
import com.fox.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import java.util.List;

public class UserMapperTest {  
    @Test
    public void selectUserByRowBounds(){
        //創建sqlSession
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務

        //準備數據(顯示第幾頁的多少條結果)
        int pageNo = 2;//當前是第幾頁
        int pageSize = 2; //頁面大小

        RowBounds rowBounds = new RowBounds((pageNo-1)*pageSize,pageSize);
        //注意點:使用RowBounds就不能使用getMapper了,而是selectList\selectMap\selectOne等
        //selectList: 接收一個List
        //selectMap: 接收一個Map
        //selectOne : 接收只有一個對象的時候

        //這裏是selectList,傳入的參數依次是對應的Mapper接口中的抽象方法的全域名、一個指定的Objec對象(一般爲null)以及RowBounds對象
        List<User> users = sqlSession.selectList("com.fox.dao.UserDao.selectUserByRowBounds", null, rowBounds);

        for (User user : users) {
            System.out.println(user);
        }
    }
}

(4)運行測試類

在這裏插入圖片描述

3.兩種方法(Limit和RowBounds)的區別

  • Limit 是在SQL層面實現分頁,需要先通過反射拿到Mapper接口,再通過SqlSession獲得Mapper接口的實現類,通過實現類傳入參數(起始位置,頁面大小),實現分頁顯示。
  • RowBounds 在代碼層面實現分頁,無需獲取Mapper接口的實現類,需要先通過有參構造(傳入分頁參數)創建RowBounds對象,再通過SqlSession對象調用selectListselectMap或者selectOne方法實現分頁。傳入的參數依次是對應的Mapper接口中的抽象方法的全域名,一個指定的Objec對象(一般爲null),以及RowBounds對象。RowBounds 本質其實就是封裝了Limit。

三、使用註解開發MyBatis

早期MyBatis都是使用xml進行配置的,直到註解的出現,註解可以替代一些xml中的配置。

CRUD的註解:

  • @insert()
  • @delete()
  • @update()
  • @select()

(一)使用註解開發MyBatis步驟(增刪改查)

1.編寫dao接口

import com.fox.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserDao {
    //查詢全部用戶
    @Select("select * from user")
    List<User> selectAllUsers();

    //通過ID查詢用戶
    //注意:傳入單個參數可以省略@Param ,傳入多個參數必須使用@Param並用逗號隔開
    @Select("select * from user where id = #{id}")
    User selectUserById(@Param("id") int id);

    //添加用戶
    @Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
    int addUser(User user);

    //修改用戶
    @Update("update user set name = #{name}, pwd = #{pwd} where id = #{id}")
    int updateUser(User user);

    //刪除用戶
    @Delete("delete from user where id =#{uid}")
    int deleteUser(@Param("uid") int id);
}

2.配置mybatis-config.xml(MyBatis核心配置文件)

由於註解開發替代了Mapper映射文件,所以本例無Mapper映射文件,因此映射器的寫法也有變動:

<mappers>
        <!--class對應的是一個接口類-->
        <!--resource對應的是一個接口類的映射文件-->
		
		<!--使用映射器接口實現類的完全限定類名-->
        <mapper class="com.fox.dao.UserDao"/>
</mappers>

3.編寫測試類

import com.fox.pojo.User;
import com.fox.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserDaoTest {
    @Test
    public void selectAllUsers(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> users = mapper.selectAllUsers();
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();//關閉sqlSession
    }
    @Test
    public void selectUserById(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        User user = mapper.selectUserById(2);
        System.out.println(user);
        sqlSession.close();
    }
    @Test
    public void addUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        User user = new User(5, "小黑", "888888");
        int i = mapper.addUser(user);
        if(i>0)
        System.out.println("插入成功!");
        sqlSession.close();
    }
    @Test
    public void updateUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        User user = new User(5,"小趙","999999");
        int i = mapper.updateUser(user);
        if(i>0)
        System.out.println("修改成功!");
        sqlSession.close();
    }
    @Test
    public void deleteUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        int i = mapper.deleteUser(5);
        if(i>0)
        System.out.println("刪除成功!");
        sqlSession.close();
    }
}

4.運行測試類

(1)單元測試selectAllUsers()結果

在這裏插入圖片描述

(2)單元測試selectUserById()結果

在這裏插入圖片描述

(3)單元測試addUser()結果

在這裏插入圖片描述

(4)單元測試updateUser()結果

在這裏插入圖片描述

(5)單元測試deleteUser()結果

在這裏插入圖片描述

(二)使用註解開發MyBatis注意事項

  1. @Param參數儘量都寫上,如果有多個參數,就必須填寫。
  2. 使用註解開發MyBatis的情況一般沒有映射文件,因此配置文件中映射器要使用映射器接口實現類的完全限定類名來實現映射。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章