MyBatis設(shè)計(jì)SQL返回布爾值(Boolean)的常見(jiàn)方法
方案一:使用COUNT查詢存在性(推薦)
<select id="checkUserExists" resultType="_boolean">
SELECT COUNT(*) > 0
FROM users
WHERE username = #{username}
</select>
說(shuō)明??:
MySQL中COUNT(*) > 0直接返回1(true)或0(false)
MyBatis自動(dòng)將數(shù)字轉(zhuǎn)換為Java的boolean類型(1→true, 0→false)
方案二:條件表達(dá)式直接返回布爾
<select id="isAccountActive" resultType="java.lang.Boolean">
SELECT (status = 'ACTIVE')
FROM accounts
WHERE account_id = #{id}
</select>
方案三:存在性檢查(EXISTS優(yōu)化)
<select id="hasUserPermission" resultType="boolean">
SELECT EXISTS(
SELECT 1
FROM permissions
WHERE user_id = #{userId}
AND permission = #{perm}
)
</select>
??優(yōu)勢(shì)??:比COUNT更高效,數(shù)據(jù)庫(kù)在找到第一條匹配記錄即返回
方案四:處理更新/刪除操作
<update id="deactivateUser">
UPDATE users SET active = 0 WHERE id = #{id}
</update>
在Mapper接口定義:
// 返回Boolean類型 Boolean deactivateUser(Long id);
??原理??:MyBatis自動(dòng)將影響行數(shù)轉(zhuǎn)換:
- ≥1行 → true
- 0行 → false
方案五:自定義TypeHandler(高級(jí)用法)
創(chuàng)建處理器:
public class BooleanTypeHandler extends BaseTypeHandler<Boolean> {
@Override
public void setNonNullParameter(...) {
ps.setString(i, parameter ? "Y" : "N");
}
@Override
public Boolean getNullableResult(ResultSet rs, String col) {
return "Y".equals(rs.getString(col));
}
// 其他重寫方法省略...
}
配置使用:
<resultMap type="User">
<result property="vip" column="is_vip"
typeHandler="com.example.BooleanTypeHandler"/>
</resultMap>
最佳實(shí)踐建議
1.??查詢場(chǎng)景優(yōu)先用??
SELECT COUNT(*) > 0 FROM ... -- 簡(jiǎn)單條件 SELECT EXISTS(...) -- 復(fù)雜條件
2.??更新場(chǎng)景??:直接用Boolean接收更新操作返回值
3.避免誤區(qū)??:
<!-- 錯(cuò)誤:resultType不能是boolean -->
<select id="isAdmin" resultType="boolean">
SELECT is_admin FROM users WHERE id=#{id}
</select>
需改為:
<select id="isAdmin" resultType="_boolean">
SELECT IF(is_admin='Y', true, false)
FROM users
WHERE id=#{id}
</select>
完整使用示例
Mapper接口:
public interface UserMapper {
// 檢查用戶名是否存在
boolean existsByUsername(@Param("name") String username);
// 禁用用戶并返回是否成功
Boolean deactivateUser(Long id);
}
XML配置:
<select id="existsByUsername" resultType="_boolean">
SELECT EXISTS(
SELECT 1 FROM users
WHERE username = #{name}
)
</select>
<update id="deactivateUser">
UPDATE users SET active = 0 WHERE id = #{id}
</update>
Java調(diào)用:
UserMapper mapper = session.getMapper(UserMapper.class);
// 檢查用戶名
boolean exists = mapper.existsByUsername("john_doe");
System.out.println("Username exists? " + exists);
// 禁用用戶
Boolean success = mapper.deactivateUser(1001L);
if(success) {
System.out.println("User deactivated");
}
根據(jù)具體數(shù)據(jù)庫(kù)類型可能需要調(diào)整:
??Oracle??:用1和0代替布爾
??PostgreSQL??:可直接返回::boolean
??SQL Server??:用CASE WHEN...THEN 1 ELSE 0 END
到此這篇關(guān)于MyBatis設(shè)計(jì)SQL返回布爾值(Boolean)的常見(jiàn)方法的文章就介紹到這了,更多相關(guān)MyBatis設(shè)計(jì)SQL返回布爾值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 四舍五入保留小數(shù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇java 四舍五入保留小數(shù)的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(46)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08
Java 中DateUtils日期工具類的實(shí)例詳解
這篇文章主要介紹了Java 中DateUtils日期工具類的實(shí)例詳解的相關(guān)資料,有時(shí)候開(kāi)發(fā)java項(xiàng)目使用日期類型,這里介紹下日期工具類,需要的朋友可以參考下2017-08-08
一文詳解如何使用線程池來(lái)優(yōu)化我們的應(yīng)用程序
線程池是一種工具,但并不是適用于所有場(chǎng)景。在使用線程池時(shí),我們需要根據(jù)應(yīng)用程序的性質(zhì)、計(jì)算資源的可用性和應(yīng)用程序的需求進(jìn)行適當(dāng)?shù)呐渲?。本文主要介紹了如何使用線程池來(lái)優(yōu)化我們的應(yīng)用程序,需要的可以參考一下2023-04-04

