MyBatis設(shè)計(jì)SQL返回布爾值(Boolean)的常見方法
方案一:使用COUNT查詢存在性(推薦)
<select id="checkUserExists" resultType="_boolean"> SELECT COUNT(*) > 0 FROM users WHERE username = #{username} </select>
說明??:
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)的常見方法的文章就介紹到這了,更多相關(guān)MyBatis設(shè)計(jì)SQL返回布爾值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java:com.netflix.client.ClientException錯(cuò)誤解決
本文主要介紹了Java:com.netflix.client.ClientException錯(cuò)誤解決,主要是指出客戶端?module-sso?試圖通過負(fù)載均衡器訪問服務(wù)時(shí),負(fù)載均衡器沒有找到可用的服務(wù)器來處理請(qǐng)求,下面就來介紹一下解決方法2024-08-08淺談MyBatis通用Mapper實(shí)現(xiàn)原理
這篇文章主要介紹了淺談MyBatis通用Mapper實(shí)現(xiàn)原理,本文會(huì)先介紹通用 Mapper 的簡(jiǎn)單原理,然后使用最簡(jiǎn)單的代碼來實(shí)現(xiàn)這個(gè)過程。感興趣的小伙伴們可以參考一下2018-10-10Java中JSON格式反序列化為Map且保證存取順序一致的問題
這篇文章主要介紹了Java中JSON格式反序列化為Map且保證存取順序一致的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06Java局部?jī)?nèi)部類和匿名內(nèi)部類定義與用法實(shí)例分析
這篇文章主要介紹了Java局部?jī)?nèi)部類和匿名內(nèi)部類,結(jié)合實(shí)例形式分析了java局部?jī)?nèi)部類和匿名內(nèi)部類相關(guān)定義、原理與用法,需要的朋友可以參考下2019-08-08springboot集成mybatis-plus遇到的問題及解決方法
這篇文章主要介紹了springboot集成mybatis-plus遇到的問題及解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11SpringBoot actuator 健康檢查不通過的解決方案
這篇文章主要介紹了SpringBoot actuator 健康檢查不通過的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot實(shí)現(xiàn)海量數(shù)據(jù)高效實(shí)時(shí)搜索功能
我們都知道隨著業(yè)務(wù)系統(tǒng)的發(fā)展和使用,數(shù)據(jù)庫(kù)存儲(chǔ)的業(yè)務(wù)數(shù)據(jù)量會(huì)越來越大,逐漸成為了業(yè)務(wù)系統(tǒng)的瓶頸,本文給大家介紹了Spring Boot業(yè)務(wù)系統(tǒng)如何實(shí)現(xiàn)海量數(shù)據(jù)高效實(shí)時(shí)搜索,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-10-10Java中LambdaQueryWrapper設(shè)置自定義排序代碼示例
這篇文章主要給大家介紹了關(guān)于Java中LambdaQueryWrapper設(shè)置自定義排序的相關(guān)資料,lambdaquerywrapper是MyBatis-Plus框架中的一個(gè)查詢條件構(gòu)造器,它可以用于構(gòu)建自定義的查詢條件,需要的朋友可以參考下2023-12-12