MyBatis 向Sql语句中动态传参数·动态SQL拼接

在动态传递参数的时候,需要用到OGNL表达式,不懂的童鞋可以下去百度,这里制作一个简要的介绍

在向XML文件传递参数的时候,需要用到sqlSession.selectList("Message.queryMessageList",message); message就是你要传递的参数。一般来说,这个message是一个对象,因为这里只能传递一个参数,而对象可以将很多参数封装起来。

XML文件接收到参数以后,会动态的执行Sql语句,但是具体要怎么传递参数呢,这就需要用到<if>标签来判断,但是在判断时,就需要用到OGNL表达式。关于OGNL我这里只列出基本的用法,见下图:

tips:OGNL中可以直接调用java中的函数和语法。

直接贴出例子:<if test="command!=null&amp;&amp;!&quot;&quot;.equals(command.trim())"> and COMMAND=#{command}</if>

&amp;是&的转义表达,&quot;是 " 的转义表达,#{command}表示这个值由Bean中的command表示。

这个表达式用java写出来就是:if (command != null && !"".equals(command.trim())) { * sql.append(" and COMMAND=?"); } ?表示被代替的位置。


 具体xml:

<?xml version="1.0" encoding="UTF-8"?>
<!--

       Copyright 2009-2016 the original author or authors.

       Licensed under the Apache License, Version 2.0 (the "License");
       you may not use this file except in compliance with the License.
       You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing, software
       distributed under the License is distributed on an "AS IS" BASIS,
       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       See the License for the specific language governing permissions and
       limitations under the License.

-->
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="Message">

  <resultMap type="com.daley.bean.Message" id="MessageResult">
    <id column="ID" jdbcType="INTEGER" property="id"/>
    <result column="COMMAND" jdbcType="VARCHAR" property="command"/>
    <result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/>
    <result column="CONTENT" jdbcType="VARCHAR" property="content"/>
  </resultMap>

  <select id="queryMessageList" parameterType="com.daley.bean.Message" resultMap="MessageResult">
    select ID,COMMAND,DESCRIPTION,CONTENT from message where 1=1
    <if test="command!=null&&!"".equals(command.trim())"> and COMMAND=#{command}</if>
    <if test="description!=null&&!"".equals(description.trim())"> and DESCRIPTION like '%' #{description} '%'</if>
  </select>

</mapper>

Bean文件

package com.daley.bean;
/**
 * @author Daley
 * Date 2016-11-28
 * project_name MicroMessage
 * 与消息表对应的实体类
 */
public class Message {
	private String id;
	private String command;
	private String description;
	private String content;
	public Message(){

	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getCommand() {
		return command;
	}
	public void setCommand(String command) {
		this.command = command;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
}

这是一个简单的学习项目,如果想看具体的文件,可以访问我的github下载。这篇文章是承接 : 

MyBatis 学习入门·基本配置·项目实例 

http://blog.csdn.net/sinat_32873711/article/details/53397594

XML标签

GitHub DemoZip地址:https://github.com/DaleyChao/MicroMessage/archive/7008032e9381cea8d197dabff9625bb339713d1c.zip

GitHub项目地址:(SQL语句拼接功能完善)https://github.com/DaleyChao/MicroMessage/tree/7008032e9381cea8d197dabff9625bb339713d1c

时间: 2024-10-02 14:34:20

MyBatis 向Sql语句中动态传参数&#183;动态SQL拼接的相关文章

SQL语句中的一些参数如何用变量来代替?

可以采用exec方法declare @tempStr varchar(350)select @tempStr='Update weekcount set ['+convert(varchar,@week)+']=['+convert(varchar,@week)+']+1 where userid='''+replace(@user,'''','''''')+''''exec(@tempStr)注意: 使exec不能返回一些变量的值,而且当前的变量值在exec的语句里无效.

在SQL语句中的一些参数如何用变量来代替?

变量|语句 可以采用exec方法declare @tempStr varchar(350)select @tempStr='Update weekcount set ['+convert(varchar,@week)+']=['+convert(varchar,@week)+']+1 where userid='''+replace(@user,'''','''''')+''''exec(@tempStr)注意: 使exec不能返回一些变量的值,而且当前的变量值在exec的语句里无效.

sql 语句中in的用法总结

问题描述 sql 语句中in的用法总结 sql 语句中 in的用法都有什么?在网上说有两种但是只见有一种用法,另一种用法是什么? 解决方案 sql语句Group By用法一则SQL语句中的NOT IN 的优化sql语句判断 case when用法(二) 解决方案二: http://blog.csdn.net/naruto517308294/article/details/8650507 解决方案三: 就一种吧http://www.w3schools.com/sql/sql_in.asp 解决方案

请教大虾:向SQL语句中传递参数的问题

问题描述 1.SqlConnectionconn1=newSqlConnection("database=charm;server=sql8;user=sa;pwd=8");2.this.mA=newSqlDataAdapter("selectgdcode,gdno,gddesc,gdunit,gdpricfromslgoodsql1",conn1);3.stringsql1="wheregdcode='"+combo1+"'"

ireport使用中文的问题(不是乱码,是不认sql语句中的中文)!

问题描述 我在建新的report模板时,使用向导的方式创建,默认的sql语句中如果包含中文,则不能正常显示结果,也没有报错.比如sql语句为"select name,age from user where name = '张三'",则在预览报表的时候,显示不出任何内容,但是在数据库中确实是存在内容的.有没有人遇到同样的问题呢....困扰很久了,帮帮忙! 解决方案 select name,age from user where name = '张三' hibernate3查询参数为中文时

sql 语句中的问号学习笔记

我看到的一个实例    代码如下 复制代码 String sql = "SELECT userid,name FROM tuser WHERE userid=? AND password=?" ;   pstmt = conn.prepareStatement(sql) ;   pstmt.setString(1,userid) ; // 这里设置了第一个?的值   pstmt.setString(2,password) ; // 这里设置了第二个?的值 等你"setStri

正则表达式替换SQL语句中的字段

问题描述 我想用正则表达式匹配一个insert的SQL语句,能够自动地将变量赋给对应的字段,比如SQL="insert into table(item1,item2,item3) values(:item1,:item2,:item3)"map.put(item1,"111")map.put(item2,"222")map.put(item3,"333")我想用正则表达式自动的将SQL语句中的:item1,:item2,:it

解析SQL语句中Replace INTO与INSERT INTO的不同之处

本篇文章是对SQL语句中Replace INTO与INSERT INTO的不同之处进行了详细的分析介绍,需要的朋友参考下   REPLACE的运行与INSERT很相似.只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除. 注意,除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义.该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行. 所有列

解析sql语句中left

以下是对在sql语句中left_join.inner_join中的on与where的区别进行了详细的分析介绍,需要的朋友可以参考下   table a(id, type): id     type ---------------------------------- 1      1         2      1          3      2          table b(id, class): id    class -------------------------------