1. 程式人生 > 實用技巧 >Mybatis 小談 (中篇 Ⅱ)

Mybatis 小談 (中篇 Ⅱ)

寫在前面:分享技術,共同進步,有不足請見諒,相關意見可評論告知 ~

程式設計路漫之遠兮,運架構體之帷幄;
勸君專注案前事,亦是杯酒敬蒼生;

目錄

日誌

日誌工廠

解決資料庫操作異常,用於排錯

曾經的排錯工具:sout 、debug 現在:日誌工廠


常見的日誌工廠:

  • SLF4J
  • LOG4J【掌握】
  • LOG4J2
  • JDK_LOGGING
  • COMMONS_LOGGING
  • STDOUT_LOGGING 【掌握】
  • NO_LOGGING

在Mybatis中具體使用那個一日誌實現,在設定中進行設定

STDOUT_LOGGING標準日誌輸出

在mybatis核心配置檔案中,配置我們的日誌!

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

Log4j

Log4j概念

  • Log4j是Apache的一個開源專案,通過使用Log4j,我們可以控制日誌資訊輸送的目的地是控制檯、檔案、GUI元件,我們也可以控制每一條日誌的輸出格式;
  • 通過定義每一條日誌資訊的級別,我們能夠更加細緻地控制日誌的生成過程。
  • 通過一個配置檔案來靈活地進行配置,而不需要修改應用的程式碼。
  1. 先在pom.xmlpom.xml匯入log4j的包

    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
      <dependencies>
         <dependency>
             <groupId>log4j</groupId>
             <artifactId>log4j</artifactId>
             <version>1.2.17</version>
         </dependency>
     </dependencies>
    
  2. 在resources 資料夾下 配置log4j.properties

   #將等級為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=[%c]-%m%n
   
   #檔案輸出的相關設定
   log4j.appender.file = org.apache.log4j.RollingFileAppender
   log4j.appender.file.File=./log/lzh.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

  1. mybatis-config.xml配置log4j為日誌的實現

    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    
  2. Log4j的使用!,直接測試執行剛才的查詢,結果如下圖

使用方法

  1. 在要使用Log4j 的類中,匯入包 import org.apache.log4j.Logger;

  2. 日誌物件,引數為當前類的class

    static Logger logger = Logger.getLogger(UserDaoTest.class);
    

  1. 日誌級別

    logger.info("info:進入了testLog4j");
    logger.debug("debug:進入了testLog4j");
    logger.error("error:進入了testLog4j");
    

效果示意圖:

分頁

分頁的原因:節約資源優化查詢效能,避免依次查詢大量資料,減少資料的處理量

使用Limit分頁

普通語法:

SELECT * from user limit startIndex,pageSize;
SELECT * from user limit 3;  #[0,n]

選中執行左上角綠色執行鍵,效果如圖:

使用Mybatis實現分頁,核心SQL

  1. 介面 UserDao.java

    //分頁
    List<User> getUserByLimit(Map<String,Integer> map);
    
  2. UserMapper.xml編寫SQL語句

    <!--//分頁-->
    <select id="getUserByLimit" parameterType="map" resultMap="UserMap">
        select * from  mybatis.user limit #{startIndex},#{pageSize}
    </select>
    
  3. UserDaoTest.java中測試

    @Test
    public void getUserByLimit(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
    HashMap<String, Integer> map = new HashMap<String, Integer>();
        map.put("startIndex",1);
        map.put("pageSize",2);
    
        List<User> userList =  mapper.getUserByLimit(map);
        for (User user : userList) {
        System.out.println(user);
        }
    
        sqlSession.close();
        }
    
    

RowBounds分頁(瞭解)

不再使用SQL實現分頁

  1. 介面

    //分頁2
    List<User> getUserByRowBounds();
    
  2. mapper.xml

    <!--分頁2-->
    <select id="getUserByRowBounds" resultMap="UserMap">
        select * from  mybatis.user
    </select>
    
  3. 測試

    @Test
    public void getUserByRowBounds(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    
    //RowBounds實現
    RowBounds rowBounds = new RowBounds(1, 2);
    
    //通過Java程式碼層面實現分頁
    List<User> userList = sqlSession.selectList("com.kuang.dao.UserMapper.getUserByRowBounds",null,rowBounds);
    
        for (User user : userList) {
        System.out.println(user);
        }
    
        sqlSession.close();
        }
    

分頁外掛

網址連結
https://pagehelper.github.io/

使用註解開發

面向介面程式設計

根本原因 : 解耦 , 可拓展 , 提高複用 , 分層開發中 , 上層不用管具體的實現 , 大家都遵守共同的標準 , 使得開發變得容易 , 規範性更好

介面理解

介面從更深層次的理解,應是定義(規範,約束)與實現(名實分離的原則)的分離。
介面的本身反映了系統設計人員對系統的抽象理解。
介面應有兩類
第一類是對一個個體的抽象,它可對應為一個抽象體(abstract class);
第二類是對一個個體某一方面的抽象,即形成一個抽象面(interface);
一個體有可能有多個抽象面。抽象體與抽象面是有區別的。

三個面向區別

- 面向物件是指,我們考慮問題時,以物件為單位,考慮它的屬性及方法 .
- 面向過程是指,我們考慮問題時,以一個具體的流程(事務過程)為單位,考慮它的實現 .
- 介面設計與非介面設計是針對複用技術而言的,與面向物件(過程)不是一個問題.更多的體現就是對系統整體的架構

使用註解開發

建議在SQL不復雜的情況下使用

  1. 註解在介面上實現

    @Select("select * from user")
    List<User> getUsers();
    
  2. 需要再核心配置檔案mybatis-config.xml中繫結介面!

    <!--繫結介面-->
    <mappers>
        <mapper class="com.lzh.dao.UserMapper"/>
    </mappers>
    

    注意以下對應關係








取消之前的方式

提示:造成值為空的情況 null
使用註解沒有設定別名,使用者屬性和資料庫欄位不一致

  1. 測試

本質:反射機制實現

底層:動態代理!

Mybatis詳細的執行流程!

使用註解操作CRUD

使用情形: 在少量SQL的情況下

我們可以在工具類建立的時候實現自動提交事務!

public static SqlSession  getSqlSession(){
    return sqlSessionFactory.openSession(true);
}

簡便原因:不用涉及操作UserMapper.xml,直接在UserDao.java中編寫

編寫介面,增加註解

public interface UserMapper {

    @Select("select * from user")
    List<User> getUsers();

 // 方法存在多個引數,所有的引數前面必須加上 @Param("id) 註解
    @Select("select * from user where id = #{id}")
    User getUserById(@Param("id") int id) ;

    @Insert("insert into user(id,name,pwd) value(#{id),#{name},#{password}")
    int addUser (User user) ;

    @Update("update user set name=#{name},pwd=#{password} where id=#{id}")
    int updateUser(User user) ;


    @Delete("delete from user where id=#{id}")
    int deleteUser(@Param("id") int id) ;
}

注意:方法存在多個引數,所有的引數前面必須加上 @Param("id) 註解

測試類

操作結果圖:

注意:我們必須要講介面註冊繫結到我們的核心配置檔案中!】如下圖
使用介面只能使用一個

關於@Param() 註解

  • 基本型別的引數或者String型別,需要加上
  • 引用型別不需要加
  • 如果只有一個基本型別的話,可以忽略,但是建議大家都加上!
  • 我們在SQL中引用的就是我們這裡的 @Param() 中設定的屬性名!

#{} ${} 區別
前者可以防止SQL注入問題

Lombok


網址:https://projectlombok.org/

Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.

使用步驟:

  1. 在IDEA中安裝Lombok外掛

  2. 在專案中的pom.xml匯入lombok的jar包

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
    </dependency>
    

  1. 在實體類上加註解即可!

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    
@Getter and @Setter
@FieldNameConstants
@ToString
@EqualsAndHashCode
@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger
@Data
@Builder
@Singular
@Delegate
@Value
@Accessors
@Wither
@SneakyThrows

重點說明:

@Data:無參構造,get、set、tostring、hashcode,equals
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@ToString
@Getter

使用外掛前

使用外掛後

優缺點

常見異常

①資料庫語句錯誤

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'null' at line 1

②類找不到異常

Caused by: java.lang.ClassNotFoundException: Cannot find class: com.lzh.dao.UserMapper

原因:mybatis-config.xml 檔案中的mappers 部分的路徑引用錯誤

基於實戰中學習,學習快樂中成長
.
時間會回答成長,成長會回答夢想