mybatis基於註解開發遇到問題彙總
這裡寫程式碼片使用Mybatis開發持久層,龐大的xml配置檔案提供了強大的功能,但是sql語句需要在xml檔案中進行配置,並且必須遵循一定的規則。
現在可以使用註解開發來代替xml配置檔案。具體的流程就不再贅述,可以檢視《Java持久化之myBatis3》,此書大體介紹了註解開發,本文就實際開發中遇到的問題進行表述。
一. 引數繫結問題
1.#{}和${}使用出錯
@Select("select ad.*,ac.name as name,ac.acsid from acs_door ad left join acs_server ac on ad.serverid = ac.id where #{codingTerm} ")
List<AcsDoorBean> getList(@Param("codingTerm")String codingTerm);
codingTerm 是一個和許可權有關的字串,”coding like ‘%33%’”,
當使用#{}進行佔位符操作時,junit單元測試控制檯列印
==>Preparing: select ad.*,ac.name as name,ac.acsid from acs_door ad left join acs_server ac on ad.serverid = ac.id where ?
==> Parameters: ad.coding like '%33%'(String)
<== Total: 0
不會拋異常,sql語句沒問題,引數繫結也沒問題,但是無法從資料庫或得正確的資料。
所以考慮到#{}是提供佔位符的操作而${}可以用來進行sql拼接,而codingTerm不是表中的欄位,和實體類無法形成關係對映,所以不能使用佔位符,進行替換後控制檯列印如下,並且可以正常查出需要的資料。#{}就相當於sql語句的“?”進行佔位操作。
==> Preparing: select ad.*,ac.name as name,ac.acsid from acs_door ad left join acs_server ac on ad.serverid = ac.id where ad.coding like '%33%'
==> Parameters:
<== Columns: id, serverid, deviceid, doorid, doorname, name, comment, doorstate, doorcontrolstate, coding, emapLeft, emapTop, emapId, name, acsid
<== Row: 1, 1, 33, null, null, null, null, null, null, 33, null, null, null, null, null
<== Row: 2, 2, 33, null, null, null, null, null, null, 33, null, null, null,
<== Total: 3
**當使用${}進行拼接式codingTerm引數錢必須加@Param(“codingTerm”)註解,否則會報錯
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'codingTerm' in 'class java.lang.String'
二.輸出引數問題
@Select("select id from acs_door where doorname=?")
int isNameExistForAdd(@Param("doorname")String doorname);
當輸出的引數id型別為int,返回值型別也是int,程式碼沒問題,junit執行不報錯,但得不到自己想要的結果,因為id是表中欄位但沒有對映的類的去封裝,所以如果要返回值進行判斷的話需改成
@Select("select count(id) from acs_door where doorname=?")
int isNameExistForAdd(@Param("doorname")String doorname);
這樣就能返回你所需要的int型別的值進行下一步的判斷。
還有一個原因就是當你查詢的物件id為null時,int也沒辦法作為返回值型別。
三[email protected]註解的使用
@SelectProvider(type=AcsSqlProvider.class,method = "getAlarmListSql")
List<AcsAlarmBean> getAlarmList(AcsAlarmSearchBean alarmBean,String codingTerm, String sqlTermDeviceidDoorAlarm);
ACSSQLProvider類中提供sql語句,可以通過繼承SqlBuilder類拼接規範sql,但是親自測試不繼承也能獲取引數以及返回sql語句
public String getAlarmListSql(Map<String, Object> map)
{
AcsAlarmSearchBean searchBean = (AcsAlarmSearchBean) map.get("searchBean");
StringBuilder sql = new StringBuilder()
.append("select aa.*, ad.doorname as doorname from acs_alarm aa")
.append(" left join acs_door ad on ad.deviceid=aa.deviceid")
.append(" where ${codingTerm}")
.append(" and aa.deviceid in ${sqlTermDeviceidDoorAlarm}");
if ((searchBean.getDeviceid() != null) && (!searchBean.getDeviceid().equals("")))
{
sql.append(" and aa.deviceid=#{searchBean.deviceid}");
}
if (searchBean.getAlarmtype() != null)
{
sql.append(" and aa.alarmtype=#{alarmtype}");
}
if (searchBean.getAlarmstate() != null)
{
sql.append(" and aa.alarmstate=#{alarmstate}");
}
if ((searchBean.getAlarmTimeBegin() != null) && (searchBean.getAlarmTimeEnd() != null))
{
sql.append(" and alarmtime>=#{alarmTimeBegin} and alarmtime<DATE_ADD(#{alarmTimeEnd},INTERVAL 1 DAY)");
}
sql.append(" order by alarmtime desc ");
return sql.toString();
}
當出現兩個
public String getAlarmListSql(Map<String, Object> map)
{
AcsAlarmSearchBean searchBean = (AcsAlarmSearchBean) map.get("searchBean");
String codingTerm = (String) map.get("codingTerm");
String sqlTermDeviceidDoorAlarm = (String) map.get("sqlTermDeviceidDoorAlarm");
StringBuilder sql = new StringBuilder()
.append("select aa.*, ad.doorname as doorname from acs_alarm aa")
.append(" left join acs_door ad on ad.deviceid=aa.deviceid")
.append(" where ").append(codingTerm)
.append(" and aa.deviceid in ").append(sqlTermDeviceidDoorAlarm);
還有一個問題,當通過#{alarmtype}來獲取searchBean的alarmtype屬性時會報繫結錯誤org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'alarmtype' not found. Available parameters are [sqlTermDeviceidDoorAlarm, param1, param2, codingTerm, param3, searchBean]
,必須用#{searchBean.alarmtype}來獲取引數,引數繫結時無法識別#{alarmtype}的來源,必須指定。
相關推薦
mybatis基於註解開發遇到問題彙總
這裡寫程式碼片使用Mybatis開發持久層,龐大的xml配置檔案提供了強大的功能,但是sql語句需要在xml檔案中進行配置,並且必須遵循一定的規則。 現在可以使用註解開發來代替xml配置檔案。具體的流程就不再贅述,可以檢視《Java持久化之myBati
spring boot整合mybatis基於註解開發以及動態sql的使用
讓我們回憶一下上篇部落格中mybatis是怎樣發揮它的作用的,主要是三類檔案,第一mapper介面,第二xml檔案,第三全域性配置檔案(application.properties),而今天我們就是來簡化mybatis的工作的——利用註解替代xml配置檔案。 先貼出mapper介面程式碼 @
Spring基於註解開發異常
lib con 版本 mil line tex 宋體 開發 style 基於註解開發: 一開始:用的jar包: 百度查到: 導入aop包: 沒用 有的說: Spring版本和jdk版本不匹配 於是我換成了4.0版本 導入的jar包:
mybatis使用註解開發
plugins state let fig href ons class pub model 閱讀該篇文章將默認您已經能夠熟練使用mybatis配置mapper.xml進行開發了。首先把pom.xml貼出來吧。裏面有註釋 <project xmlns="
MyBatis基於註解的一對一、一對多和多對多的關係
“今年春盡,楊花似雪,猶不見還家” 前言 之前說了MyBatis常用註解 和基於註解的簡單增刪改查操作。 現在來了解下MyBatis基於註解的一對一、一對多和多對多的關係。 示例 一對一:一個人只有一個身份證號 PersonMapper .java im
sprngboot整合Mybatis(註解開發)
官方說明:MyBatis-Spring-Boot-Starter will help you use MyBatis with Spring Boot 其實就是myBatis看spring boot這麼火熱,為了迎合springboot也開發出一套解決方案來湊湊熱鬧, my
Mybatis基於註解的方式獲取新增記錄的自增長id
最近使用Springboot整合Mybatis開發,sql要寫在註解中,好多問題百度出來的方法都是配置檔案的形式,特此記錄遇到的問題 Mybatis獲取新增記錄的自增長id如下 @Insert("I
SpringBoot+Mybatis(註解開發)整合例項
新增依賴:pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:
mybatis基於註解(一對一,一對多,多對多)
QQ:979111986/5730473 微信:ainusers 現就職:新浪 微博:AinUser 微信公眾號:AinUser 郵箱:[email protected] 程式設計技術交流群:540049350 github:g
Solr之基於註解開發-yellowcong
通過註解的方式來開發Solr,Solr中,提供了一個@Field註解,可以定義實體bean和索引的關係,然後直接新增實體Bean,進行資料查詢,而不需要通過SolrInputDocument.addField 的方式進行資料的索引。需要重點注意的是1、實體
Mybatis基於註解實現多表查詢
對應的四種資料庫表關係中存在四種關係:一對多,多對應,一對一,多對多。在前文中已經實現了xml配置方式實現表關係的查詢,本文記錄一下Mybatis怎麼通過註解實現多表的查詢,算是一個知識的補充。 同樣的先介紹一下Demo的情況:存在兩個實體類使用者類和賬戶類,使用者類可能存在多個賬戶,即一對多的表關係
Mybatis-05 註解開發
# Mybatis-05 註解開發 ## 註解開發 **註解的核心是反射機制** 面向介面程式設計的根本原因:解耦,可拓展,提高複用,分層開發中、上層不用管具體的實現,大家都遵守共同的標準,使得開發變得容易,規範性好。 ### 1.介面類 註解在介面上實現 ```java public inte
在Mybatis-spring上基於註解的數據源實現方案
操作數 實例 模板 開發工程師 normal 取數 inter -c star 一、遇到的痛點 最近在學習Spring-boot過程中,涉及到操作數據庫。按照DOC引入mybatis-spring-boot-starter,然後按照套路配置application.
mybatis註解開發,動態sql
sele sel myba 開始 xls inorder from all nbsp 在利用mybatis註解開始時,如果沒有用到動態sql時,可以直接寫 @Select("select * from order") List<XlSubOrder> getA
基於Vue+Spring MVC+MyBatis+Shiro+Dubbo開發的分布式後臺管理系統
java dubbo shiro vue 分布式 最近項目中使用了shiro做權限管理,在開發過程中也踩了一些坑,於是便有了開發個應用鞏固一下所學知識的想法,正好在開發的過程裏學習一下Vue開發。技術棧方面,現在前後端分離大行其道,於是也采用了前後端分離的模式,前端基於Vue+Elemen
mybatis註解開發-動態SQL
sql語句 com jdbc new info ets stat -- -s 實體類以及表結構 在mybatis-config.xml中註冊mapper接口 -------------------------- 動態查詢@SelectProvider Emp
xlauch 1.0 基於springboot + mybatis + beetls 快速開發腳手架
springboot xlauch java beetl mybatis xlauch xlauch 是基於springboot + mybatis + beetls 快速開發腳手架, 包含了用戶管理,組織機構管理,角色管理,功能點管理,菜單管理,權限分配,數據權限分配,代碼生成,二次開
Spring boot 學習六 spring 繼承 mybatis (基於註解)
oot provide rom 構造 per 來看 color 如何使用 語言 MyBatis提供了多個註解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,這些都是建立動態語言和讓MyBat
Mybatis(二)基於註解的入門實例
調用 getc val void pass 搭建 for erb date 前言 上一篇簡單的介紹了Mybatis的概念和基於XML來實現數據庫的CRUD,這篇給大家實現基於註解的CRUD。 一、初始搭建 在基於註解當中前四步和上一篇基於XML是一樣的,分別是: 1)創建數
Java框架-mybatis延遲載入、快取和註解開發
1. 延遲載入 1.1 概念 在需要用到資料時才進行載入,不需要用到資料時就不載入資料。也稱作懶載入 好處:先從單表查詢,需要時再從關聯表去關聯查詢,大大提高資料庫效能 缺點:在大批量資料查詢時,由於查詢會耗時,可能導致使用者等待時間變長,影響使用者體驗