MyBatis 查询中未替换参数

Posted

技术标签:

【中文标题】MyBatis 查询中未替换参数【英文标题】:Parameters are not getting subsituted in MyBatis query 【发布时间】:2012-02-22 09:10:03 【问题描述】:

以下是我在 BrandMapper.xml 中的选择查询。

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


我的问题是BrandService 中的getBrand 函数返回一个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 = ?

参数没有被替换。我无法弄清楚我在这里做错了什么。

【问题讨论】:

附注:这里是不是用错了DAO?按照惯例,DAO 应该是提供检索数据库映射对象的方法的类,而不是对象本身,对吧? 【参考方案1】:

问号是Prepared Statements 中的占位符,记录的查询非常好,看起来和预期的一样。实际值应作为单独的参数随查询传递到您的数据库。

【讨论】:

是的,你是对的。实际上错误不在mybatis中,它在顶层。传给mybatis的参数(即brandmapper.getBrand)本身为null。另一方面,mybatis 不应该对其进行一些验证检查,因为它知道它需要一个参数并且它得到一个空值吗?可以节省我很多时间。 @n3o 如果 db 列为空,则 Null 值可以是有效值。

以上是关于MyBatis 查询中未替换参数的主要内容,如果未能解决你的问题,请参考以下文章

mybatis 中 # 和 $ 的区别及应用场景

Mybatis单表多表查询,动态SQL使用

mybatis参数date怎么模糊查询

mybatis中的字符串替换

mybatis中怎么传参数可以提高查询效率

mybatis模糊查询防止SQL注入