mybatis執(zhí)行錯(cuò)誤但sql執(zhí)行正常問題
mybatis執(zhí)行錯(cuò)誤但sql執(zhí)行正常
大概率是存在特殊字符使mybatis解析異常
1.在mapper.java中的方法上添加@SqlParser(filter=true)注解

2.如果sql中有注釋,刪掉注釋

mybatis執(zhí)行sql語句的兩種方式
SqlSession.mapper和SqlSession.selectXxx對比
MyBatis中有兩種SQL語句的執(zhí)行方式,如下:
- 通過SqlSession發(fā)送SQL語句
- 例如:sqlSession.slectone()的形式。
- 通過SqlSession獲取Mapper接口,通過Mapper接口發(fā)送SQL語句
- 例如:sqlSession.getMapper()的形式。
封裝工具類
封裝一個(gè)類SqlSession工具類,用于生產(chǎn)SqlSession對象,下面的例子為了節(jié)省代碼將會(huì)使用我們封裝的SqlSessionUtil工具類。
public class SqlSessionUtil {
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
try {
// 獲取核心配置文件的輸入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 獲取SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 獲取SqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
// 獲取SqlSession對象
sqlSession = sqlSessionFactory.openSession(true);
} catch (IOException e) {
throw new RuntimeException(e);
}
return sqlSession;
}
}創(chuàng)建Mapper映射文件
<mapper namespace="com.jingchao.mybatis.mapper.UserMapper">
<select id="selectUserById" resultType="User">
select * from t_user where id = #{id}
</select>
</mapper>創(chuàng)建Mapper接口
public interface UserMapper{
User selectUserById(@Param("id") Integer id);
}SqlSession發(fā)送SQL語句
selectOne方法表示查詢一條語句,通過String類型的命名空間加上Sql語句標(biāo)簽的id來精準(zhǔn)定位一條SQL語句。
從而實(shí)現(xiàn)SQL語句的發(fā)送。
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
User user = sqlSession.selectOne("com.jingchao.mybatis.mapper.UserMapper.selectUserById", 1);Mapper接口發(fā)送SQL語句
通過Mapper接口發(fā)送SQL是通過動(dòng)態(tài)代理的方式(sqlSession.getMapper(UserMapper.class))獲取mapper接口對象,通過調(diào)用mapper中的方法,實(shí)現(xiàn)發(fā)送SQL語句,這樣完全避免了通過實(shí)現(xiàn)Mapper接口的方式來直接執(zhí)行對應(yīng)的SQL語句。
總結(jié):通過Mapper接口發(fā)送SQL語句的方式就是MyBatis以代理的方式幫我們創(chuàng)建了接口的實(shí)現(xiàn)類
SqlSession sqlSession = SqlSessionUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.selectUserById(1);
兩種方式的對比
通過SqlSession發(fā)送SQL語句
不需要定義mapper(dao)接口,可以直接通過“ 命名空間 + id ”的方式發(fā)送SQL語句
通過SqlSession獲取Mapper接口,再通過Mapper接口發(fā)送SQL語句
需要定義mapper接口,并在接口中定義抽象方法,通過獲取mapper接口對象,再調(diào)用方法的形式發(fā)送SQL語句。
說明:建議使用Mapper接口發(fā)送SQL語句的方式,理由如下:
- 使用Mapper接口編程可以消除SqlSession帶來的功能性代碼,提高代碼可讀性
- 使用Mapper接口,是完全體現(xiàn)面向?qū)ο蟮恼Z言,更加體現(xiàn)業(yè)務(wù)的邏輯
- 使用Mapper接口的方式,可以提前進(jìn)行代碼的錯(cuò)誤提示和檢驗(yàn),而直接使用SqlSession的方式,只有在代碼運(yùn)行時(shí)才會(huì)知道是否產(chǎn)生錯(cuò)誤
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot 加載 META-INF/spring.factories方式
這篇文章主要介紹了springboot 加載 META-INF/spring.factories方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java封裝數(shù)組實(shí)現(xiàn)在數(shù)組中查詢元素和修改元素操作示例
這篇文章主要介紹了Java封裝數(shù)組實(shí)現(xiàn)在數(shù)組中查詢元素和修改元素操作,結(jié)合實(shí)例形式分析了java針對數(shù)組元素查詢、修改的封裝操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-03-03
深入淺析springsecurity入門登錄授權(quán)
SpringSecurity為我們提供了基于注解的權(quán)限控制方案,這也是我們項(xiàng)目中主要采用的方式,我們可以使用注解去指定訪問對應(yīng)的資源所需的權(quán)限,這篇文章主要介紹了springsecurity入門登錄授權(quán),需要的朋友可以參考下2024-05-05
SpringCloud @RefreshScope注解源碼層面深入分析
@RefreshScope注解能幫助我們做局部的參數(shù)刷新,但侵入性較強(qiáng),需要開發(fā)階段提前預(yù)知可能的刷新點(diǎn),并且該注解底層是依賴于cglib進(jìn)行代理的,所以不要掉入cglib的坑,出現(xiàn)刷了也不更新情況2023-04-04
Json字符串轉(zhuǎn)Java對象和List代碼實(shí)例
這篇文章主要介紹了Json字符串轉(zhuǎn)Java對象和List代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Spring Boot應(yīng)用的極速部署腳本示例代碼
最近在工作中遇到了一個(gè)問題,需要極速的部署Spring Boot應(yīng)用,發(fā)現(xiàn)網(wǎng)上這方面的資料較少,所以自己來總結(jié)下,這篇文章主要給大家介紹了關(guān)于Spring Boot應(yīng)用的極速部署腳本的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08
SpringBoot實(shí)現(xiàn)圖形驗(yàn)證碼的示例代碼
驗(yàn)證碼的實(shí)現(xiàn)方式有很多,可以由前端實(shí)現(xiàn),也可以由后端進(jìn)行實(shí)現(xiàn),也有很多的插件和工具包可以使用,在這里,我們使用 Hutool 提供的小工具實(shí)現(xiàn),本文介紹SpringBoot實(shí)現(xiàn)圖形驗(yàn)證碼的實(shí)例,感興趣的朋友跟隨小編一起看看吧2025-12-12

