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)文章
在Java 中操作 Map時高效遍歷和安全刪除數(shù)據(jù)的方法
本文介紹Java中高效遍歷和安全刪除Map的四種方式及三種刪除策略,強(qiáng)調(diào)避免并發(fā)修改異常需使用Iterator或removeIf,性能優(yōu)化建議根據(jù)Map類型選擇遍歷方法,并提供完整示例代碼,感興趣的朋友一起看看吧2025-06-06
關(guān)于SpringBoot中的XA事務(wù)詳解
這篇文章主要介紹了關(guān)于SpringBoot中的XA事務(wù)詳解,事務(wù)管理可以確保數(shù)據(jù)的一致性和完整性,同時也可以避免數(shù)據(jù)丟失和沖突等問題。在分布式環(huán)境中,XA?事務(wù)是一種常用的事務(wù)管理方式,需要的朋友可以參考下2023-07-07
使用JDBC工具類實現(xiàn)簡單的登錄管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了使用JDBC工具類實現(xiàn)簡單的登錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02

