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對(duì)比
MyBatis中有兩種SQL語句的執(zhí)行方式,如下:
- 通過SqlSession發(fā)送SQL語句
- 例如:sqlSession.slectone()的形式。
- 通過SqlSession獲取Mapper接口,通過Mapper接口發(fā)送SQL語句
- 例如:sqlSession.getMapper()的形式。
封裝工具類
封裝一個(gè)類SqlSession工具類,用于生產(chǎn)SqlSession對(duì)象,下面的例子為了節(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對(duì)象 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接口對(duì)象,通過調(diào)用mapper中的方法,實(shí)現(xiàn)發(fā)送SQL語句,這樣完全避免了通過實(shí)現(xiàn)Mapper接口的方式來直接執(zhí)行對(duì)應(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);
兩種方式的對(duì)比
通過SqlSession發(fā)送SQL語句
不需要定義mapper(dao)接口,可以直接通過“ 命名空間 + id ”的方式發(fā)送SQL語句
通過SqlSession獲取Mapper接口,再通過Mapper接口發(fā)送SQL語句
需要定義mapper接口,并在接口中定義抽象方法,通過獲取mapper接口對(duì)象,再調(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)文章
spring異步service中處理線程數(shù)限制詳解
這篇文章主要給大家介紹了關(guān)于spring異步service中處理線程數(shù)限制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09利用JWT如何實(shí)現(xiàn)對(duì)API的授權(quán)訪問詳解
這篇文章主要給大家介紹了關(guān)于利用JWT如何實(shí)現(xiàn)對(duì)API的授權(quán)訪問的相關(guān)資料,需要的朋友可以參考下2018-09-09Java的動(dòng)態(tài)代理和靜態(tài)代理詳解
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java 異步實(shí)現(xiàn)的幾種方式小結(jié)
這篇文章主要介紹了Java 異步實(shí)現(xiàn)的幾種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08通過Feign進(jìn)行調(diào)用@FeignClient?找不到的解決方案
這篇文章主要介紹了通過Feign進(jìn)行調(diào)用@FeignClient?找不到的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03