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元件,我們也可以控制每一條日誌的輸出格式;
- 通過定義每一條日誌資訊的級別,我們能夠更加細緻地控制日誌的生成過程。
- 通過一個配置檔案來靈活地進行配置,而不需要修改應用的程式碼。
-
先在
pom.xml
pom.xml匯入log4j的包<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>
-
在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
-
在
mybatis-config.xm
l配置log4j為日誌的實現<settings> <setting name="logImpl" value="LOG4J"/> </settings>
-
Log4j的使用!,直接測試執行剛才的查詢,結果如下圖
使用方法
-
在要使用Log4j 的類中,匯入包 import org.apache.log4j.Logger;
-
日誌物件,引數為當前類的class
static Logger logger = Logger.getLogger(UserDaoTest.class);
-
日誌級別
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
-
介面
UserDao.java
//分頁 List<User> getUserByLimit(Map<String,Integer> map);
-
在
UserMapper.xml
編寫SQL語句<!--//分頁--> <select id="getUserByLimit" parameterType="map" resultMap="UserMap"> select * from mybatis.user limit #{startIndex},#{pageSize} </select>
-
在
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實現分頁
-
介面
//分頁2 List<User> getUserByRowBounds();
-
mapper.xml
<!--分頁2--> <select id="getUserByRowBounds" resultMap="UserMap"> select * from mybatis.user </select>
-
測試
@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不復雜的情況下使用
-
註解在介面上實現
@Select("select * from user") List<User> getUsers();
-
需要再核心配置檔案
mybatis-config.xml
中繫結介面!<!--繫結介面--> <mappers> <mapper class="com.lzh.dao.UserMapper"/> </mappers>
注意以下對應關係
取消之前的方式
提示:造成值為空的情況 null
使用註解沒有設定別名,使用者屬性和資料庫欄位不一致
- 測試
本質:反射機制實現
底層:動態代理!
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
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.
使用步驟:
-
在IDEA中安裝Lombok外掛
-
在專案中的
pom.xml
匯入lombok的jar包<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency>
-
在實體類上加註解即可!
@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 部分的路徑引用錯誤
基於實戰中學習,學習快樂中成長
.
時間會回答成長,成長會回答夢想