1. 程式人生 > >mybatis基於註解開發遇到問題彙總

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();
    }

當出現兩個append使{};如下

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 概念 在需要用到資料時才進行載入,不需要用到資料時就不載入資料。也稱作懶載入 好處:先從單表查詢,需要時再從關聯表去關聯查詢,大大提高資料庫效能 缺點:在大批量資料查詢時,由於查詢會耗時,可能導致使用者等待時間變長,影響使用者體驗