Excel2016打印預(yù)覽表格的教程是什么(excel2016怎么看打印預(yù)覽)">Excel2016打印預(yù)覽表格的教程是什么(excel2016怎么看打印預(yù)覽)
3876
2022-05-30
Mybaits
1、簡介
1.1 什么是Mybatis
MyBatis 是一款優(yōu)秀的持久層框架;
它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數(shù)據(jù)庫中的記錄。
1.2 持久化
數(shù)據(jù)持久化
持久化就是將程序的數(shù)據(jù)在持久狀態(tài)和瞬時狀態(tài)轉(zhuǎn)化的過程
內(nèi)存:斷電即失
數(shù)據(jù)庫(Jdbc),io文件持久化。
為什么要持久化?
有一些對象,不能讓他丟掉
內(nèi)存太貴
1.3 持久層
Dao層、Service層、Controller層
完成持久化工作的代碼塊
層界限十分明顯
1.4 為什么需要MyBatis
幫助程序員將數(shù)據(jù)存入到數(shù)據(jù)庫中
方便
傳統(tǒng)的JDBC代碼太復(fù)雜了,簡化,框架,自動化
不用MyBatis也可以,技術(shù)沒有高低之分
優(yōu)點:
簡單易學(xué)
靈活
sql和代碼的分離,提高了可維護性。
提供映射標(biāo)簽,支持對象與數(shù)據(jù)庫的orm字段關(guān)系映射
提供對象關(guān)系映射標(biāo)簽,支持對象關(guān)系組建維護
提供xml標(biāo)簽,支持編寫動態(tài)sql
2、第一個Mybatis程序
思路:搭建環(huán)境 --> 導(dǎo)入MyBatis --> 編寫代碼 --> 測試
新建項目
創(chuàng)建一個普通的maven項目
刪除src目錄 (就可以把此工程當(dāng)做父工程了,然后創(chuàng)建子工程)
導(dǎo)入maven依賴
4.創(chuàng)建一個Module
2.2 創(chuàng)建一個模塊
編寫mybatis的核心配置文件
編寫mybatis工具類
package com.liziba.mybatis.utils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; /** * @auther LiZiBa * @date 2021/1/17 17:01 * @description: mybatis工具類 **/ public class MybatisUtil { /** SqlSessionFactory對象 */ static SqlSessionFactory sqlSessionFactory; static { try{ // 第一步:通過SqlSessionFactoryBuilder獲取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); }catch (Exception e) { e.printStackTrace(); } } /** * 獲取SqlSession (SqlSession提供執(zhí)行數(shù)據(jù)庫語句方法) * @return SqlSession對象 */ public static SqlSession getSqlSession() { return sqlSessionFactory.openSession(); } }
2.3 編寫代碼
實體類
package com.liziba.mybatis.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.apache.ibatis.type.Alias; /** * @auther LiZiBa * @date 2021/1/17 17:07 * @description: **/ @Data @AllArgsConstructor @NoArgsConstructor // 別名自定義默認使用實體首字母小寫 User-->Alias-->user @Alias("user") public class User { private Integer id; private String name; private String password; }
Dao/Mapper接口
public interface UserMapper { /** * 查詢所有User * @return */ List
接口實現(xiàn)類 (由原來的UserMapperImpl轉(zhuǎn)變?yōu)橐粋€Mapper配置文件)
測試
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fgbp0vH1-1622730704315)(C:\Users\Leon Plious\AppData\Roaming\Typora\typora-user-images10891512594.png)]
package com.liziba.mybatis.mapper; import com.liziba.mybatis.pojo.User; import com.liziba.mybatis.utils.MybatisUtil; import org.apache.ibatis.session.RowBounds; import org.apache.ibatis.session.SqlSession; import org.apache.log4j.Logger; import org.junit.Test; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @auther LiZiBa * @date 2021/1/17 17:28 * @description: **/ public class UserMapperTest { /** * 測試獲取全部user */ @Test public void getUserListTest() { // 開啟一個SqlSession SqlSession sqlSession = MybatisUtil.getSqlSession(); // 通過SqlSession獲取UserMapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List
可能會遇到的問題:
配置文件沒有注冊
綁定接口錯誤
方法名不對
返回類型不對
Maven導(dǎo)出資源問題
3、CURD
3.1 namespace
namespace中的包名要和Dao/Mapper接口的包名一致
3.2 select
選擇,查詢語句;
id:就是對應(yīng)的namespace對于的mapper中的方法名;
resultType : Sql語句執(zhí)行的返回值;
parameterType : 參數(shù)類型;
編寫接口
/** * 通過id獲取用戶 * @param id * @return */ User getUserById(Integer id);
編寫對應(yīng)的mapper中的sql語句
測試
/** * 通過id獲取用戶 */ @Test public void getUserByIdTest() { logger.info("通過id獲取用戶"); SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.getUserById(1); System.out.println(user.toString()); sqlSession.close(); }
**insert/update/delete 語句需要提交事務(wù)sqlSession.commit();
3.3 Insert
編寫接口
/** * 插入User * @param user */ void addUser(User user);
編寫對應(yīng)的mapper中的sql語句
測試
/** * 測試插入user */ @Test public void addUserTest() { SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = new User(5, "liangqinshi", "123456"); userMapper.addUser(user); // 增加、刪除、修改一定要提交事務(wù) sqlSession.commit(); sqlSession.close(); }
3.4 update
編寫接口
/** * 通過id修改User * @param user */ void updateUserById(User user);
編寫對應(yīng)的mapper中的sql語句
測試
/** * 通過id修改用戶 */ @Test public void updateUserByIdTest() { SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = new User(1, "liziba01", "654321"); userMapper.updateUserById(user); sqlSession.commit(); sqlSession.close(); }
3.5 Delete
編寫接口
/** * 通過id刪除用戶 * @param id */ void deleteUserById(Integer id);
編寫對應(yīng)的mapper中的sql語句
測試
/** * 通過id刪除用戶 */ @Test public void deleteUserByIdTest() { SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); userMapper.deleteUserById(5); sqlSession.commit(); sqlSession.close(); }
3.6 萬能Map
假設(shè),我們的實體類,或者數(shù)據(jù)庫中的表,字段或者參數(shù)過多,我們應(yīng)該考慮使用Map!
UserMapper接口
/** * 通過Map對象插入User * @param map */ void addUserByMap(Map
UserMapper.xml
測試
/** * 通過map新增User */ @Test public void addUserByMapTest() { SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 構(gòu)建map,傳入?yún)?shù) Map
Map傳遞參數(shù),直接在sql中取出key即可! 【parameter=“map”】
對象傳遞參數(shù),直接在sql中取出對象的屬性即可! 【parameter=“Object”】
只有一個基本類型參數(shù)的情況下,可以直接在sql中取到
多個參數(shù)用Map , 或者注解!
3.7 模糊查詢
**建議Java代碼執(zhí)行的時候,傳遞通配符% %
UserMapper接口
/** * 通過名字模糊查詢User * @param nameLike %nameLike% * @return */ List
UserMapper.xml
測試
/** * 通過名字模糊查詢 */ @Test public void getUserLikeByNameTest() { SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); String nameLike = "%li%"; List
4、配置解析
4.1 核心配置文件
mybatis-config.xml
Mybatis的配置文件包含了會深深影響MyBatis行為的設(shè)置和屬性信息。
configuration(配置) properties(屬性) settings(設(shè)置) typeAliases(類型別名) typeHandlers(類型處理器) objectFactory(對象工廠) plugins(插件) environments(環(huán)境配置) environment(環(huán)境變量) transactionManager(事務(wù)管理器) dataSource(數(shù)據(jù)源) databaseIdProvider(數(shù)據(jù)庫廠商標(biāo)識) mappers(映射器)
4.2 環(huán)境配置 environments
MyBatis 可以配置成適應(yīng)多種環(huán)境
不過要記住:盡管可以配置多個環(huán)境,但每個 SqlSessionFactory 實例只能選擇一種環(huán)境
學(xué)會使用配置多套運行環(huán)境!
MyBatis默認的事務(wù)管理器就是JDBC ,連接池:POOLED
4.3 屬性 properties
我們可以通過properties屬性來實現(xiàn)引用配置文件
這些屬性可以在外部進行配置,并可以進行動態(tài)替換。你既可以在典型的 Java 屬性文件中配置這些屬性,也可以在 properties 元素的子元素中設(shè)置。【db.poperties】
編寫一個配置文件
db.properties
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC username=root password=123456
在核心配置文件中引入
可以直接引入外部文件
可以在其中增加一些屬性配置
如果兩個文件有同一個字段,優(yōu)先使用外部配置文件的
4.4 類型別名 typeAliases
類型別名可為 Java 類型設(shè)置一個縮寫名字。 它僅用于 XML 配置.
意在降低冗余的全限定類名書寫。
也可以指定一個包,每一個在包 com.liziba.mybatis.pojo 中的 Java Bean,在沒有注解的情況下,會使用 Bean 的首字母小寫的非限定類名來作為它的別名。 比如 com.liziba.mybatis.pojo.User 的別名為 user,;若有注解,則別名為其注解值。見下面的例子:
在實體類比較少的時候,使用第一種方式。
如果實體類十分多,建議用第二種掃描包的方式。
第一種可以自定義別名,第二種不行,如果非要改,需要在實體上增加注解。
@Alias("user") public class User { ... }
4.5 設(shè)置 Settings
這是 MyBatis 中極為重要的調(diào)整設(shè)置,它們會改變 MyBatis 的運行時行為。
https://mybatis.org/mybatis-3/zh/configuration.html#settings
4.6 其他配置
typeHandlers(類型處理器)
objectFactory(對象工廠)
plugins 插件
mybatis-generator-core
mybatis-plus
通用mapper
4.7. 映射器 mappers
MapperRegistry:注冊綁定我們的Mapper文件;
方式一:【推薦使用】
方式二:使用class文件綁定注冊
注意點:
接口和他的Mapper配置文件必須同名
接口和他的Mapper配置文件必須在同一個包下
方式三:使用包掃描進行注入
4.8 作用域和生命周期
理解我們之前討論過的不同作用域和生命周期類別是至關(guān)重要的,因為錯誤的使用會導(dǎo)致非常嚴重的并發(fā)問題。
提示 對象生命周期和依賴注入框架
依賴注入框架可以創(chuàng)建線程安全的、基于事務(wù)的 SqlSession 和映射器,并將它們直接注入到你的 bean 中,因此可以直接忽略它們的生命周期。 如果對如何通過依賴注入框架使用 MyBatis 感興趣,可以研究一下 MyBatis-Spring 或 MyBatis-Guice 兩個子項目。
這個類可以被實例化、使用和丟棄,一旦創(chuàng)建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 實例的最佳作用域是方法作用域(也就是局部方法變量)。 你可以重用 SqlSessionFactoryBuilder 來創(chuàng)建多個 SqlSessionFactory 實例,但最好還是不要一直保留著它,以保證所有的 XML 解析資源可以被釋放給更重要的事情。
SqlSessionFactory 一旦被創(chuàng)建就應(yīng)該在應(yīng)用的運行期間一直存在,沒有任何理由丟棄它或重新創(chuàng)建另一個實例。 使用 SqlSessionFactory 的最佳實踐是在應(yīng)用運行期間不要重復(fù)創(chuàng)建多次,多次重建 SqlSessionFactory 被視為一種代碼“壞習(xí)慣”。因此 SqlSessionFactory 的最佳作用域是應(yīng)用作用域。 有很多方法可以做到,最簡單的就是使用單例模式或者靜態(tài)單例模式。
每個線程都應(yīng)該有它自己的 SqlSession 實例。SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。 絕對不能將 SqlSession 實例的引用放在一個類的靜態(tài)域,甚至一個類的實例變量也不行。 也絕不能將 SqlSession 實例的引用放在任何類型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你現(xiàn)在正在使用一種 Web 框架,考慮將 SqlSession 放在一個和 HTTP 請求相似的作用域中。 換句話說,每次收到 HTTP 請求,就可以打開一個 SqlSession,返回一個響應(yīng)后,就關(guān)閉它。 這個關(guān)閉操作很重要,為了確保每次都能執(zhí)行關(guān)閉操作,你應(yīng)該把這個關(guān)閉操作放到 finally 塊中。 下面的示例就是一個確保 SqlSession 關(guān)閉的標(biāo)準(zhǔn)模式:
在所有代碼中都遵循這種使用模式,可以保證所有數(shù)據(jù)庫資源都能被正確地關(guān)閉。
作用域(Scope)和生命周期
try (SqlSession session = sqlSessionFactory.openSession()) { // 你的應(yīng)用邏輯代碼 }
5、解決屬性名和數(shù)據(jù)庫字段名不一致的問題
5.1 問題
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-68p7rpJs-1622730704319)(C:\Users\Leon Plious\AppData\Roaming\Typora\typora-user-images10893482795.png)]
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Pw33fS2L-1622730704323)(C:\Users\Leon Plious\AppData\Roaming\Typora\typora-user-images10893508460.png)]
pwd 與 password不一致查詢結(jié)果password=null
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xiP33sRx-1622730704324)(C:\Users\Leon Plious\AppData\Roaming\Typora\typora-user-images10893687340.png)]
解決辦法(不推薦)
起別名
5.2 resultMap
結(jié)果集映射
id name pwd
id name password
resultMap 元素是 MyBatis 中最重要最強大的元素。它可以讓你從 90% 的 JDBC ResultSets 數(shù)據(jù)提取代碼中解放出來,并在一些情形下允許你進行一些 JDBC 不支持的操作。實際上,在為一些比如連接的復(fù)雜語句編寫映射代碼的時候,一份 resultMap 能夠代替實現(xiàn)同等功能的數(shù)千行代碼。ResultMap 的設(shè)計思想是,對簡單的語句做到零配置,對于復(fù)雜一點的語句,只需要描述語句之間的關(guān)系就行了。
6、日志
6.1 日志工廠
如果一個數(shù)據(jù)庫操作,出現(xiàn)了異常,我們需要排錯,日志就是最好的助手!
曾經(jīng):sout、debug
現(xiàn)在:日志工廠
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-o93Thrgo-1622730704325)(C:\Users\Leon Plious\AppData\Roaming\Typora\typora-user-images10893988341.png)]
SLF4J
LOG4J 【掌握】
LOG4J2
JDK_LOGGING
COMMONS_LOGGING
STDOUT_LOGGING 【掌握】
NO_LOGGING
在MyBatis中具體使用哪一個日志實現(xiàn),在設(shè)置中設(shè)定
STDOUT_LOGGING
6.2 Log4j
什么是Log4j?
Log4j是Apache的一個開源項目,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件;
我們也可以控制每一條日志的輸出格式;
通過定義每一條日志信息的級別,我們能夠更加細致地控制日志的生成過程;
最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應(yīng)用的代碼。
先導(dǎo)入log4j的包
log4j.properties
# 將等級為DEBUG級別的日志輸出到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/rzp.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.sq1.PreparedStatement=DEBUG
配置settings為log4j實現(xiàn)
測試運行
Log4j簡單使用
在要使用Log4j的類中,導(dǎo)入包 import org.apache.log4j.Logger;
日志對象,參數(shù)為當(dāng)前類的class對象
static Logger logger = Logger.getLogger(UserMapperTest.class);
日志級別
/** * 通過id獲取用戶 */ @Test public void getUserByIdTest() { logger.info("通過id獲取用戶"); SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.getUserById(1); System.out.println(user.toString()); sqlSession.close(); }
info
debug
error
7、分頁
思考:為什么分頁?
減少數(shù)據(jù)的處理量
7.1 使用Limit分頁
SELECT * from user limit startIndex,pageSize
使用MyBatis實現(xiàn)分頁,核心SQL
接口
/** * Limit分頁查詢用戶 * @param map * @return */ List
Mapper.xml
測試
/** * limit分頁查詢 */ @Test public void getUserByLimit() { SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); Map
7.2 RowBounds分頁
不再使用SQL實現(xiàn)分頁
接口
/** * RowBounds分頁查詢 * @return */ List
mapper.xml
測試
/** * RowBounds分頁查詢 */ @Test public void getUserByRowBounds() { SqlSession sqlSession = MybatisUtil.getSqlSession(); RowBounds rowBounds = new RowBounds(0, 2); List
7.3 分頁插件
pagehelper
8、使用注解開發(fā)
8.1 面向接口開發(fā)
面向?qū)ο螅嚎紤]問題以對象為單位,考慮對象的屬性和方法
面向過程:考慮問題以一個具體的流程(事務(wù)過程)為單位,考慮他的實現(xiàn)
接口開發(fā):針對復(fù)用性而言,體現(xiàn)在系統(tǒng)整體的架構(gòu)和設(shè)計
8.2 使用注解開發(fā)
注解在接口上
/** * 查詢所有用戶 * @return */ @Select("select * from user") List
工具類回顧
/** * @auther LiZiBa * @date 2021/1/17 17:01 * @description: mybatis工具類 **/ public class MybatisUtil { /** SqlSessionFactory對象 */ static SqlSessionFactory sqlSessionFactory; static { try{ // 第一步:通過SqlSessionFactoryBuilder獲取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); }catch (Exception e) { e.printStackTrace(); } } /** * 獲取SqlSession (SqlSession提供執(zhí)行數(shù)據(jù)庫語句方法) * @return SqlSession對象 */ public static SqlSession getSqlSession() { return sqlSessionFactory.openSession(); } }
添加mapper接口文件映射 -- 查看最后mappers
測試
關(guān)于@Param( )注解
/** * 獲取用戶集合 */ @Test public void getUsersTest() { SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List
基本類型的參數(shù)或者String類型,需要加上
引用類型不需要加
如果只有一個基本類型的話,可以忽略,但是建議大家都加上
我們在SQL中引用的就是我們這里的@Param()中設(shè)定的屬性名
8.3 MyBatis 中#{}和${}區(qū)別
#{} 是預(yù)編譯處理,像傳進來的數(shù)據(jù)會加個" "(#將傳入的數(shù)據(jù)都當(dāng)成一個字符串,會對自動傳入的數(shù)據(jù)加一個雙引號) ${} 就是字符串替換。直接替換掉占位符。$方式一般用于傳入數(shù)據(jù)庫對象,例如傳入表名. 使用 ${} 的話會導(dǎo)致 sql 注入。 所以為了防止 SQL 注入,能用 #{} 的不要去用 ${}
9、多對一
多個學(xué)生對應(yīng)一個老師
-- 老師表 CREATE TABLE `teacher` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 學(xué)生表 CREATE TABLE `student` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `tid` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_tid` (`tid`), CONSTRAINT `fk_tid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
導(dǎo)入lombok
新建實體類Teacher,Student
建立Mapper接口
建立Mapper.xml文件
在核心配置文件中綁定注冊我們的Mapper接口或者文件
測試查詢是否能夠成功
按照查詢嵌套處理
/** * 測試查詢嵌套 */ @Test public void getStudentsTest() { SqlSession sqlSession = MybatisUtil.getSqlSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List
按照結(jié)果嵌套處理
/** * 測試結(jié)果嵌套 */ @Test public void getStudents2Test() { SqlSession sqlSession = MybatisUtil.getSqlSession(); StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); List
10、一對多
一個老師對應(yīng)多個學(xué)生
查詢嵌套
/** * 查詢嵌套 */ @Test public void getTeacher2() { SqlSession sqlSession = MybatisUtil.getSqlSession(); TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class); List
結(jié)果嵌套
/** * 結(jié)果嵌套 */ @Test public void getTeacher() { SqlSession sqlSession = MybatisUtil.getSqlSession(); TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class); List
11、總結(jié)
關(guān)聯(lián) - association 【多對一】
集合 - collection 【一對多】
javaType & ofType
JavaType用來指定實體類中的類型
ofType用來指定映射到List或者集合中的pojo類型,泛型中的約束類型
注意點:
保證SQL的可讀性,盡量保證通俗易懂
注意一對多和多對一,屬性名和字段的問題
如果問題不好排查錯誤,可以使用日志,建議使用Log4j
12、動態(tài)SQL
12.1 動態(tài) SQL
MyBatis 的強大特性之一便是它的動態(tài) SQL。如果你有使用 JDBC 或其他類似框架的經(jīng)驗,你就能體會到根據(jù)不同條件拼接 SQL 語句有多么痛苦。拼接的時候要確保不能忘了必要的空格,還要注意省掉列名列表最后的逗號。利用動態(tài) SQL 這一特性可以徹底擺脫這種痛苦。
通常使用動態(tài) SQL 不可能是獨立的一部分,MyBatis 當(dāng)然使用一種強大的動態(tài) SQL 語言來改進這種情形,這種語言可以被用在任意的 SQL 映射語句中。
12.2 環(huán)境搭建
項目結(jié)構(gòu)
建表語句
實體類
@Data @NoArgsConstructor @AllArgsConstructor public class Blog { private Integer id; private String title; private String author; private Date createTime; private int views; private int active; }
MybatisUtil工具類
public class MybatisUtil { static SqlSessionFactory sqlSessionFactory; static{ try{ String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); }catch (Exception e) { e.printStackTrace(); } } public static SqlSession getSqlSession() { return sqlSessionFactory.openSession(); } }
mybatis-config.xml核心配置文件
db.properties數(shù)據(jù)庫配置文件
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC username=xxxx password=xxxx
log4j.properties日志配置文件
# 將等級為DEBUG級別的日志輸出到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/rzp.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.sq1.PreparedStatement=DEBUG
12.3 if
這條語句提供了一個可選的文本查找類型的功能。如果沒有傳入"title",那么所有active = 1的BLOG都會返回;反之若傳入了"title",那么就會把模糊查找"title"內(nèi)容的BLOG結(jié)果返回
如果想可選地通過"title"和"author"兩個條件搜索
12.4 choose (when, otherwise)
有些時候,我們不想用到所有的條件語句,而只想從中擇其一二
12.5 trim (where, set)
現(xiàn)在考慮回到"if"示例,這次我們將active = 1也設(shè)置成動態(tài)的條件,通過參數(shù)傳入,看看會發(fā)生什么。
如果這些條件沒有一個能匹配上將會怎樣?最終這條 SQL 會變成這樣
select * from blog where
這會導(dǎo)致查詢失敗。如果僅僅第二個條件匹配又會怎樣?這條 SQL 最終會是這樣
select * from blog where and title like 'xxxx'
這個查詢也會失敗
如何解決呢?我們通過where來解決,where 元素知道只有在一個以上的if條件有值的情況下才去插入"WHERE"子句。而且,若最后的內(nèi)容是"AND"或"OR"開頭的,where 元素也知道如何將他們?nèi)コ?/p>
類似的用于動態(tài)更新語句的解決方案叫做 set。set 元素可以被用于動態(tài)包含需要更新的列,而舍去其他的
這里需要注意的是每個值后面的 ? ,
12.6 foreach
動態(tài) SQL 的另外一個常用的必要操作是需要對一個集合進行遍歷,通常是在構(gòu)建 IN 條件語句的時候
foreach 元素的功能是非常強大的,它允許你指定一個集合,聲明可以用在元素體內(nèi)的集合項和索引變量。它也允許你指定開閉匹配的字符串以及在迭代中間放置分隔符。這個元素是很智能的,因此它不會偶然地附加多余的分隔符。
注意 你可以將一個 List 實例或者數(shù)組作為參數(shù)對象傳給 MyBatis,當(dāng)你這么做的時候,MyBatis 會自動將它包裝在一個 Map 中并以名稱為鍵。List 實例將會以"list"作為鍵,而數(shù)組實例的鍵將是"array"。
12.7 SQL 片段
有的時候,我們可能會將一些功能的部分抽取出來,方便使用!
使用SQL標(biāo)簽抽取公共部分
在需要使用的地方使用Include標(biāo)簽引用即可
12.8 自定義標(biāo)簽
where等價于
set等價于
MyBatis SQL
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。