MyBatis单个参数的动态语句引用

原创 2013年12月02日 14:24:04

在使用mybatis的动态sql时,有时需要根据参数值来动态拼接mysql,比如下面的示例:
根据出版社和作者查询图书列表,如果为空则不做该条件过滤(注:此处有2个参数)

public void getBookList(String publisher,String author){
         Map<String,Object> maps = new HashMap<String, Object>();
         maps.put("publisher", publisher);
         maps.put("author", author);
         
         this.getListByEntity("getBookList",maps);
}

<select id="getBookList"  resultType="Book">
         SELECT * FROM bookinfo
         <where>
                   <if test="publisher != null">
                            publisher = #{publisher}
                   </if>
                   <if test="author != null">
                            AND author = #{author}
                   </if>
         </where>
</select>

如上写法,是没有问题的,但是当情况变得简单的时候,比如只根据作者查询图书列表的时候,当然我们可以采用和上面相同的处理方法,在方法中将参数封装到map中去。但是当我们直接使用String作为参数来查询时,就需要注意一个问题:

public void getBookList(String author){

         this.getListByEntity("getBookListByAuthor",author);
}

<select id="getBookListByAuthor" parameterType="java.lang.String" resultType="Book">
         SELECT * FROM bookinfo
         <where>
                   <if test="author != null">
                            author = #{author}
                   </if>
         </where>
</select>

看似没有问题,当我们运行的时候,报异常了,原因是当我们的参数为String时,在sql语句中#{author} 会去我们传进来的参数调getAuthor()方法获取参数,很明显,String没有对应的方法,所以报错了,那我们这里要如何引用author对象呢,需要采用下面的写法:

<select id="getBookListByAuthor" parameterType="java.lang.String" resultType="Book">
         SELECT * FROM bookinfo
         <where>
                   <if test="_parameter != null">
                            AND author = #{author}
                   </if>
         </where>
</select>

结论当mybatis传参为单个参数时,在sql语句中需要使用_parameter 来引用这个参数

MyBatis之传入参数

在MyBatis的select、insert、update、delete这些元素中都提到了parameterType这个属性。MyBatis现在可以使用的parameterType有基本数据类型和JA...

mybatis中关于传入参数parameterType

众所周知,mybatis的传入参数可以是各种Java的基本数据类型:包含int,String,Date等。基本数据类型作为传参,只能传入一个。通过#{参数名} 即可获取传入的值 ,复杂数据类型:包含J...
  • Truong
  • Truong
  • 2013年12月11日 22:04
  • 148555

MyBatis: SQL语句中传入单个String类型的参数的获取

MyBatis: SQL语句中传入单个String类型的参数的获取

mybatis 参数处理,单个参数,多个参数

1、单个参数 mybatis不做特殊处理。#{参数名}即可取出值,参数名随意取 2、多个参数 mybatis会将其封装成map, key:param1,param2,。。。paramN,或参数的索引 ...
  • hamov
  • hamov
  • 2017年09月04日 23:36
  • 189

MyBatis传入多个参数的问题

 一、单个参数: public List getXXBeanList(String xxCode);   select t.* from tableName t where t.id...

MyBatis多参数传递的四种方式

一、多参数传递之注解方式示例 若映射器中的方法只有一个参数,则在对应的SQL语句中,可以采用#{参数名}的方式来引用此参数,以前的例子多属于此类。但这种方法却不适用于需要传递多个参数的情况,今天就来...

Mybatis——传单个参数和多个参数的方法

传单个参数单个参数:mybatis不会做特殊处理,#{参数名/任意名}:取出参数值。传多个参数方法一public Employee getEmpByIdAndLastName(Integer id,S...

[DB][mybatis]MyBatis mapper文件中的变量引用方式#{}与${}的差别

MyBatis mapper文件中的变量引用方式#{}与${}的差别         默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置P...
  • szwangdf
  • szwangdf
  • 2014年05月23日 16:12
  • 47657

MyBatis中sql片段的定义与引用

在开发中,SQL的拼接很常见,有很对拼接的sql具有重复性高的特点,这时最好把重复的sql抽取出来,作为公用的sql片段。定义sql片段: ...

深入了解MyBatis参数

相信很多人都遇到过下面这些异常:"Parameter 'xxx' not found. Available parameters are [...]"等等 不只是上面提到的这几个,我认为有很多的错误都...
  • isea533
  • isea533
  • 2015年03月02日 09:36
  • 117174
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MyBatis单个参数的动态语句引用
举报原因:
原因补充:

(最多只允许输入30个字)