1. 程式人生 > 實用技巧 >mybatis—— 一個空格引發的血案

mybatis—— 一個空格引發的血案

環境描述:

我在使用SSM做專案的時候需要一個需求:一個使用者有多個角色,一個角色有多個許可權,我需要根據使用者的id找到使用者的所有角色,及其對應的許可權。

資料庫是這個樣子,users_role表記錄了使用者和角色的關係,role_permission表記錄了角色和許可權的對應關係。

DAO層是這樣設計的

/**
 * 角色Dao
 */
public interface IRoleDao {

    /**
     * 根據使用者id查詢出所有對應的角色
     * @param userId 使用者id
     * @return  使用者所有的角色資訊
     * @throws Exception
     */
    @Select("SELECT role.* FROM role,users_role WHERE role.id = users_role.roleId AND users_role.userId = #{userId}")
    @Results({
            @Result(id = true, property = "id" , column = "id"),
            @Result(property = "permissions", column = "id" , many = @Many(select = "com.zjw.dao.IPermissionDao.findPermissionByRoleId "))
    })
    List<Role> findRoleByUserId(String userId) throws Exception;
}
/**
 * 許可權Dao
 */
public interface IPermissionDao {


    /**
     *  根據角色id查詢所對應的許可權
     * @param id 角色id
     * @return  角色id對應的許可權列表
     * @throws Exception
     */
    @Select("select permission.* from permission where id in (select permissionId from role_permission where roleId=#{id})")
    List<Permission> findPermissionByRoleId(String id) throws Exception;
}

看起來一切ok。

但是在專案跑起來以後。。。。。

這不就尷尬了嗎???

報錯的大概的意思的它找不到需要執行的sql語句了。

但是執行sql的方法我寫了呀。。

世上最痛苦的事莫過於,我告訴了你她在哪,你給我說你是直男。 ——mybatis

案情分析

案情緊急,刻不容緩。

我懷疑

是我JavaBean寫錯了,與資料庫欄位不對應? 發現不是。

是我沒有重新clean專案,新的程式碼沒有打包上?試了也不行。

我@Result需要寫個JavaType?發現也不用啊。

是我測試類有影響?刪了也不行啊。

需要重啟IDEA?沒用。

我的sql語句有問題?在資料庫中查了一下,可以查詢啊。

出現轉機

我仔仔細細盯著幾行簡單的程式碼。。。。。

我。。。。。

突然。

發現。

這裡是不是多個空格???,影響執行嗎? 不管了,刪了空格再說。
clean,install,run,訪問。

報錯消失了。。。。我。。。下樓取快遞去。。。。。

總結:

不是我的錯,是mybatis的鍋,你是一個成熟的框架了,去空格這種事情還要我教你嗎?