如何使用Mybatis替换JDBC(二)

如何使用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. 接收到参数后如何使用;

扫描二维码关注公众号,回复: 11211317 查看本文章

我们现来介绍一个工具: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 !&quot;&quot;.equals(command.trim())">
   		AND COMMAND = #{command}
    </if>
    <if test="description != null and !&quot;&quot;.equals(description.trim())">
   		AND DESCRIPTION like '%' #{description} '%'
    </if>
  </select>

解释:

1. 在上面的程序中,command != null and !&quot;&quot;.equals(command.trim())中的&quot;&quot;表示双引号,原本应该为command != null and !"".equals(command.trim()),但是由于双引号在标签中会被转义,因此需要写成&quot;&quot;

2. 在上面的程序中,AND COMMAND = #{command}中的“#{command}”如果在SQL语句中表示“?”,此处为如果直接写成“?”,Mybatis无法正确的填充符号,因此需要写成#{command}。这是由Mybatis内部做的处理,大概原理是当解析到#{xxx}的时候,会将xxx保留,然后将整个#{xxx}替换成“?”,在将保留的xxx赋值给“?”。而对于花括号中的参数{command}的写法,可以视为与OGNL的写法相同。

到这里,用Mybatis替换JDBC的基本过程就结束了。

[参考视频]:https://www.imooc.com/video/2585

原创文章 6 获赞 12 访问量 805

猜你喜欢

转载自blog.csdn.net/qq_40602986/article/details/106077795