在如何使用Mybatis替换JDBC(一)一文中已经实现了基本的用Mybatis替换JDBC,而里边的SQL语句是没有参数的简单查询语句,在实际开发中,这显然是不可能的。因此在这篇文章中将介绍当SQL语句中含有参数“?”的情况下,Mybatis如何进行处理。
我们从如下几个问题来展开处理:
1. 如何将参数传递到需要调用的SQL语句中;
将参数传递到SQL语句中,只需要在调用执行SQL语句的方法sqlSession.selectList()时向该方法传入需要传入的参数名即可:
messageList = sqlSession.selectList(Message.queryMessage, command);
上面这种情况是当只需要向SQL语句中传入一个参数的情况,如果需要传入两个(或多个)参数呢?由于selectList()方法中只允许有两个参数,因此不能直接写成sqlSession.selectList(Message.queryMessage, command, descirption);。或许可以考虑重写这个方法(这是我目前的一种想法,但是不知道内部实现,好像不太好搞)?也许可行,但是更为直接的方法是用封装的思想,将两个参数通过一个对象封装起来,向selectList()方法中的第二个参数传入一个对象即可:
Message message = new Message();
message.setCommand(command);
message.setDescription(description);
messageList = sqlSession.selectList(Message.queryMessage, message);
2. 配置文件中如何去接收参数;
在实现了向SQL语句传入参数之后,SQL语句中如何去接收传入的参数?在如何使用Mybatis替换JDBC(一)中,对于select标签,我们删除了其中的一个暂时没有用到的属性parameterType,在这个属性中,如果需要接收SQL中的参数只有一个,那么可以直接将该属性设置成对应的参数类型(例如参数类型是String):
<select id="queryMessageList" parameterType="String" resultMap="MessageResult"></select>
如果需要接收的参数是两个(或多个),和传入参数同样的原理-接收含有需要传入参数属性的对象,当然传入是传入的对象,接收的自然是对象的类型,此处的对象类型需要从根包开始写路径:
<select id="queryMessageList" parameterType="com.test.bean.Message" resultMap="MessageResult"></select>
到现在参数是接收进来了,还有一个问题是:我们知道在使用JDBC的时候,SQL语句中参数的表示使用一个"?"来占位的,那么使用Mybatis同样需要在SQL语句中用某个符号或者表达式来占位,那这个符号或者表达式是怎样写的?往下看。
3. 接收到参数后如何使用;
我们现来介绍一个工具:OGNL表达式,关于OGNL给出如下介绍:
根据业务需求首先需要判断传过来的值是否为空或为空字符串。
在OGNL表达式的介绍中已经介绍了,要从自定义类型中取值,可以直接使用属性名来进行判断,所以有可以在配置文件中写入判断条件,如果符合条件,则对SQL语句进行拼接“AND COMMAND = ?”:
<select id="queryMessageList" parameterType="com.test.bean.Message" resultMap="MessageResult">
SELECT ID, COMMAND, DESCRIPTION, CONTENT FROM MESSAGE WHERE 1=1
<if test="command != null and !"".equals(command.trim())">
AND COMMAND = #{command}
</if>
<if test="description != null and !"".equals(description.trim())">
AND DESCRIPTION like '%' #{description} '%'
</if>
</select>
解释:
1. 在上面的程序中,command != null and !"".equals(command.trim())中的“""”表示双引号,原本应该为command != null and !"".equals(command.trim()),但是由于双引号在标签中会被转义,因此需要写成""
2. 在上面的程序中,AND COMMAND = #{command}中的“#{command}”如果在SQL语句中表示“?”,此处为如果直接写成“?”,Mybatis无法正确的填充符号,因此需要写成#{command}。这是由Mybatis内部做的处理,大概原理是当解析到#{xxx}的时候,会将xxx保留,然后将整个#{xxx}替换成“?”,在将保留的xxx赋值给“?”。而对于花括号中的参数{command}的写法,可以视为与OGNL的写法相同。
到这里,用Mybatis替换JDBC的基本过程就结束了。