Mybatis查詢數(shù)據(jù)的項目實現(xiàn)
上一篇我們介紹了在pom文件中引入mybatis依賴,配置了mybatis配置文件,通過讀取配置文件創(chuàng)建了會話工廠,使用會話工廠創(chuàng)建會話獲取連接對象讀取到了數(shù)據(jù)庫的基本信息。
如果您需要對上面的內(nèi)容進(jìn)行了解,可以參考Mybatis引入與使用
本篇我們在上一篇的基礎(chǔ)上了解如果使用mybatis查詢數(shù)據(jù):
一、準(zhǔn)備數(shù)據(jù)
這里我們直接使用腳本初始化數(shù)據(jù)庫中的數(shù)據(jù)
-- 如果數(shù)據(jù)庫不存在則創(chuàng)建數(shù)據(jù)庫 CREATE DATABASE IF NOT EXISTS demo DEFAULT CHARSET utf8; -- 切換數(shù)據(jù)庫 USE demo; -- 創(chuàng)建用戶表 CREATE TABLE IF NOT EXISTS T_USER( ID INT PRIMARY KEY, USERNAME VARCHAR(32) NOT NULL, AGE INT NOT NULL ); -- 插入用戶數(shù)據(jù) INSERT INTO T_USER(ID, USERNAME, AGE) VALUES(1, '張三', 20),(2, '李四', 22),(3, '王五', 24);
創(chuàng)建了一個名稱為demo的數(shù)據(jù)庫;并在庫里創(chuàng)建了名稱為T_USER的用戶表并向表中插入了數(shù)據(jù)
二、創(chuàng)建用戶實體類
在cn.horse.demo2包下創(chuàng)建UserInfo實體類,為了方便打印用戶的信息這里重寫了ToString()方法
package cn.horse.demo2; public class UserInfo { private int id; private String username; private int age; @Override public String toString() { StringBuilder result = new StringBuilder(); result.append('['); result.append("id: " + this.id); result.append(", "); result.append("username: " + this.username); result.append(", "); result.append("age: " + this.age); result.append(']'); return result.toString(); } }
三、配置Mapper文件
這里我在resources下創(chuàng)建了一個demo2的目錄,并在目錄下創(chuàng)建了一個UserInfoMapper.xml的配置文件。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="UserInfoMapper"> <select id="findById" resultType="cn.horse.demo2.UserInfo"> SELECT * FROM T_USER WHERE ID = #{id} </select> <select id="findAll" resultType="cn.horse.demo2.UserInfo"> SELECT * FROM T_USER </select> </mapper>
- namespace:代表的是名稱空間;如果有多個Mapper配置文件,名稱空間不允許重復(fù)
- select:查詢標(biāo)簽;
- id代表的是編號,同一個名稱空間下編號不允許重復(fù);
- resultType代表的是結(jié)果類型,指將數(shù)據(jù)庫查詢出來的數(shù)據(jù)轉(zhuǎn)換成結(jié)果類型對象,轉(zhuǎn)換的前提是結(jié)果類型需要提供無參數(shù)的構(gòu)造方法(用于創(chuàng)建結(jié)果類型對象),數(shù)據(jù)庫中的列需要與結(jié)果類型中的字段一一對應(yīng)(使用反射的方式進(jìn)行對象中字段的賦值),否則無法創(chuàng)建結(jié)果類型對象或者無法將數(shù)據(jù)綁定到結(jié)果類型對象的字段上。
- 標(biāo)簽內(nèi)容是SQL語句,代表使用ID查詢用戶信息,其中#{id}是參數(shù);在執(zhí)行當(dāng)前查詢語句時需要攜帶此參數(shù)。
四、引入Mapper配置
Mapper配置完成后,并沒有生效;需要在mybatis-config.xml文件中配置完成后才能生效;
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="jdbc:mysql://${ip}:${port}/${database}?useUnicode=true&useSSL=false&characterEncoding=utf8"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="demo2/UserInfoMapper.xml" /> </mappers> </configuration>
其中mapper標(biāo)簽是我們引入的配置,resource用于指向Mapper配置文件的位置。
五、查詢一條數(shù)據(jù)
// 讀取mybatis配置文件 InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml"); // 根據(jù)配置創(chuàng)建SqlSession工廠 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); SqlSession sqlSession = null; try { // 創(chuàng)建SqlSession sqlSession = sqlSessionFactory.openSession(); // 根據(jù)用戶編號查詢一條用戶信息 UserInfo userInfo = sqlSession.selectOne("UserInfoMapper.findById", 2); System.out.println(userInfo); } finally { // 關(guān)閉會話 if(Objects.nonNull(sqlSession)) { sqlSession.close(); } }
代碼中我們使用selectOne查詢一條數(shù)據(jù):
第一個參數(shù)代表的是語句,其實就是【名稱空間.編號】,根據(jù)名稱空間和編號可以找到我們在Mapper配置文件中配置的SQL語句
第二個參數(shù)代表的是參數(shù)值,用于解析SQL語句中的參數(shù)
測試:
執(zhí)行上面代碼的結(jié)果如下:
查詢的結(jié)果與我們庫中的數(shù)據(jù)一致。
六、查詢數(shù)據(jù)列表
// 讀取mybatis配置文件 InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml"); // 根據(jù)配置創(chuàng)建SqlSession工廠 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); SqlSession sqlSession = null; try { // 創(chuàng)建SqlSession sqlSession = sqlSessionFactory.openSession(); // 查詢數(shù)據(jù)列表 List<UserInfo> userInfoList = sqlSession.selectList("UserInfoMapper.findAll"); for (UserInfo userInfo: userInfoList) { System.out.println(userInfo); } } finally { // 關(guān)閉會話 if(Objects.nonNull(sqlSession)) { sqlSession.close(); } }
代碼中我們使用selectList查詢數(shù)據(jù)列表,由于沒有使用到參數(shù),所以沒有傳遞任何參數(shù)
測試:
執(zhí)行上面代碼的結(jié)果如下:
查詢的結(jié)果與我們庫中的數(shù)據(jù)一致。
七、查詢數(shù)據(jù)Map
// 讀取mybatis配置文件 InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml"); // 根據(jù)配置創(chuàng)建SqlSession工廠 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); SqlSession sqlSession = null; try { // 創(chuàng)建SqlSession sqlSession = sqlSessionFactory.openSession(); // 查詢數(shù)據(jù)列表 Map<Integer, UserInfo> userInfoMap = sqlSession.selectMap("UserInfoMapper.findAll", "id"); for (Map.Entry<Integer, UserInfo> entry: userInfoMap.entrySet()) { System.out.println(entry.getKey() + " -> " + entry.getValue()); } } finally { // 關(guān)閉會話 if(Objects.nonNull(sqlSession)) { sqlSession.close(); } }
代碼中我們使用selectMap查詢數(shù)據(jù)Map,這里需要指定哪個字段作為Map的Key,這里我是用id字段作為Map的Key;這樣可以直接得到用戶編號到用戶對象的Map集合。
需要注意的是Map的Key字段來源于返回類型中的字段而不是數(shù)據(jù)庫中表的列字段
測試:
執(zhí)行上面代碼的結(jié)果如下:
查詢的結(jié)果與我們庫中的數(shù)據(jù)一致。
八、使用結(jié)果處理器查詢數(shù)據(jù)
// 讀取mybatis配置文件 InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml"); // 根據(jù)配置創(chuàng)建SqlSession工廠 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); SqlSession sqlSession = null; try { // 創(chuàng)建SqlSession sqlSession = sqlSessionFactory.openSession(); // 查詢數(shù)據(jù)列表 sqlSession.select("UserInfoMapper.findAll", new ResultHandler<UserInfo>() { @Override public void handleResult(ResultContext<? extends UserInfo> resultContext) { System.out.println(resultContext.getResultObject()); } }); } finally { // 關(guān)閉會話 if(Objects.nonNull(sqlSession)) { sqlSession.close(); } }
代碼中我們使用select查詢數(shù)據(jù),此方法沒有返回值,而是使用ResultHandler匿名內(nèi)部類直接對每條數(shù)據(jù)進(jìn)行處理
測試:
執(zhí)行上面代碼的結(jié)果如下:
查詢的結(jié)果與我們庫中的數(shù)據(jù)一致。
九、使用游標(biāo)查詢數(shù)據(jù)
// 讀取mybatis配置文件 InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml"); // 根據(jù)配置創(chuàng)建SqlSession工廠 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); SqlSession sqlSession = null; Cursor<UserInfo> cursor = null; try { // 創(chuàng)建SqlSession sqlSession = sqlSessionFactory.openSession(); // 查詢數(shù)據(jù)列表 cursor = sqlSession.selectCursor("UserInfoMapper.findAll"); for (Iterator<UserInfo> it = cursor.iterator(); it.hasNext();) { System.out.println(it.next()); } } finally { // 關(guān)閉游標(biāo) if(Objects.nonNull(cursor)) { try { cursor.close(); } catch (IOException e) { } } // 關(guān)閉會話 if(Objects.nonNull(sqlSession)) { sqlSession.close(); } }
代碼中我們使用selectCursor查詢數(shù)據(jù),此方法返回一個游標(biāo)對象,使用迭代器獲取數(shù)據(jù)列表。
需要注意的是游標(biāo)對象需要關(guān)閉
測試:
執(zhí)行上面代碼的結(jié)果如下:
查詢的結(jié)果與我們庫中的數(shù)據(jù)一致。
到此這篇關(guān)于Mybatis查詢數(shù)據(jù)的項目實踐的文章就介紹到這了,更多相關(guān)Mybatis查詢數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Sentinel結(jié)合Nacos實現(xiàn)數(shù)據(jù)持久化過程詳解
這篇文章主要介紹了Sentinel結(jié)合Nacos實現(xiàn)數(shù)據(jù)持久化過程,要持久化的原因是因為每次啟動Sentinel都會使之前配置的規(guī)則就清空了,這樣每次都要再去設(shè)定規(guī)則顯得非常的麻煩,感興趣想要詳細(xì)了解可以參考下文2023-05-05SpringBoot整合Mybatis-plus實現(xiàn)多級評論功能
本文介紹了如何使用SpringBoot整合Mybatis-plus實現(xiàn)多級評論功能,同時提供了數(shù)據(jù)庫的設(shè)計和詳細(xì)的后端代碼,前端界面使用的Vue2,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-05-05SpringBoot使用Sa-Token實現(xiàn)權(quán)限認(rèn)證
本文主要介紹了SpringBoot使用Sa-Token實現(xiàn)權(quán)限認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Struts2返回json格式數(shù)據(jù)代碼實例
這篇文章主要介紹了Struts2返回json格式數(shù)據(jù)代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04Spring boot基于ScheduledFuture實現(xiàn)定時任務(wù)
這篇文章主要介紹了Spring boot基于ScheduledFuture實現(xiàn)定時任務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06基于spring+quartz的分布式定時任務(wù)框架實現(xiàn)
在Spring中的定時任務(wù)功能,最好的辦法當(dāng)然是使用Quartz來實現(xiàn)。這篇文章主要介紹了基于spring+quartz的分布式定時任務(wù)框架實現(xiàn),有興趣的可以了解一下。2017-01-01Spring之SseEmitter實現(xiàn)讓你的進(jìn)度條實時更新
Spring SseEmitter是一種實現(xiàn)服務(wù)器端推送事件(SSE)的機(jī)制,支持單向通信,適用于實時數(shù)據(jù)傳輸需求,通過代碼示例和應(yīng)用場景分析,展示了如何在服務(wù)端和客戶端使用SseEmitter進(jìn)行實時數(shù)據(jù)推送2025-02-02