2012-02-22 47 views
1

以下是我在BrandMapper.xml中的select查詢。參數在MyBatis查詢中沒有被提取

<select id="getBrand" parameterType="String" resultMap="brandResult"> 
    SELECT 
     B.bid as bid, 
     B.bname as bname, 
     B.avg_price as avg_price, 
     B.total_number as total_number, 
     P.pid as pid, 
     P.pname as pname, 
     P.bid as pbid, 
     P.bname as pbname, 
     P.specs as pspecs, 
     P.price as price 
    from Brands B left outer join Products P on P.bid = B.bid 
    where B.bname = #{bname, jdbcType=VARCHAR} 
</select> 

這是接口

public interface BrandMapper { 
    BrandDAO getBrand(String bname); 
} 

這是服務類

@Service 
public class BrandService { 
@Autowired 
private BrandMapper brandMapper; 
public BrandDAO getBrand(String bname) { 
    System.out.println("Inside DBService getBrand"); 
    return brandMapper.getBrand(bname); 
} 
} 

我的問題是,在BrandServicegetBrand函數返回值null。如果我使用硬編碼字符串替換BrandMapper.xml中的參數#{bname},它將起作用並返回正確的類。我在這裏做錯了什麼?是否有任何日誌或任何可用的地方可以查看正在構建的實際查詢?任何幫助表示讚賞。

我設法使用log4j的,使洛,這是這是越來越執行

SELECT B.bid as bid, B.bname as bname, B.avg_price as avg_price, B.total_number as total_number, P.pid as pid, P.pname as pname, P.bid as pbid, P.bname as pbname, P.specs as pspecs, P.price as price from Brands B left outer join Products P on P.bid = B.bid where B.bname = ? 

的參數是沒有得到更換查詢。我無法弄清楚我在這裏做錯了什麼。

+0

只是一個側面說明:這裏不是DAO使用錯了嗎?按照慣例,DAO應該是提供檢索數據庫映射對象的方法的類,而不是對象本身,對嗎? – 2012-02-22 09:37:37

回答

2

問號是Prepared Statements中的佔位符,記錄的查詢非常好,看起來和預期的一樣。實際值應該作爲單獨的參數沿查詢傳遞到數據庫。

+0

這並不能解釋爲什麼聲明給出不同的結果... – 2012-02-22 09:38:17

+0

是的,你是對的。其實這個錯誤不是在mybatis中,它是在頂層。傳遞給mybatis的參數(即brandmapper.getBrand)本身爲空。在不同的說明不應該mybatis做一些驗證檢查它,因爲它知道它期待一個參數,並得到一個空值?可以節省很多時間。 – n3o 2012-02-22 09:42:44

+0

@ n3o如果db列爲空,則空值可以是有效的值。 – mrembisz 2012-02-22 09:45:43