`
wendy_wxie
  • 浏览: 118003 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

MyBatis构建sql时动态传入表名以及字段名

阅读更多

 用了mybatis很长一段时间了,但是感觉用的都是比较基本的功能,很多mybatis相对ibatis的新功能都没怎么用过。比如其内置的注解功能之类的。这次遇到了一个问题,每次我们在配置mybaits时,需要在mapping.sql.xml文件中写对应的执行sql脚本。这时我们一般会先定义实体类来作为sql的返回类型或者执行sql的参数类型。比如如下代码

<select id="queryApplyStatusNum" parameterType="ApplyCriteria"
		resultType="ApplyStatusNumDto">
		select
		o.statecode as statusCode,count(*) as statusNum
		from
		TM_ConsultationApply o
		where
		<if test="doctorCode != null and doctorCode != ''"> o.DoctorCode = #{doctorCode} and </if>
		<if test="beginDate != null and endDate != null">
			((trunc(o.AppointBeginDate )&lt;=
			to_date(#{endDate},'yyyy/mm/dd')) and
			(to_date(#{beginDate},'yyyy/mm/dd')
			&lt;=o.AppointEndDate)) and  </if>
		1=1
		group by o.statecode
</select>

     这是个很简单的查询,其中parameterType为对应的参数实体类,这些类中的字段将会替换sql语句中的类似#{}的语句,使之成为完整的sql 语句。同样的,resultType同样对应的是返回值的实体类。这里可以细说一下,其实在mybatis中,无论你指定还是不指定返回类型,mybatis都会默认的先将查询回的值放入一个hashMap中(如果返回的值不止一条就是一个包含hashMap的list)。这其中的区别在于,如果你指定了返回类型,mybatis将会根据返回类型的实体类来从hashMap中获取值并set到这个实体类中。如果不指定就默认返回一个HashMap<String,Object>(List<HashMap<String,Object>>)。

      okay~大概讲解到此,说说这次的问题。以前都是指定了实体类,然后写好sql语句直接套用就可以了。但是现在有个问题,万一你的物理模型不确定,也即是你的表结构不确定,甚至连表名字都不确定该怎么办呢?我这次遇到了这个问题。我们有个需求,事先定义好了很多数据集的信息模型,针对这些信息模型生成物理模型。而我们需要针对这些物理模型进行操作。而这些数据集一旦更新,信息模型以及物理模型都要变动,所以事先不可能完全确定物理表结构等等信息。此时应该怎么在mybatis中进行处理呢?

      这里在说一下mybatis中一个属性:statementType。这个属性的作用是告诉mybatis我们写的这个sql到底是预编译(PRESTATEMENT)还是非预编译(STATEMENT)的。有什么区别呢?如果是预编译的,那么系统在初始化时就会读取这段sql代码,将指定的实体类中的字段替换了类似#{}这样的语句,就是形成了类似这样的语句:

"select * from tableName where code=?" 这个时候你在系统运行时再想向这句sql中替换tableName或者code,结果可想而知。如果是非预编译呢,结果刚好相反,他会在系统运行时才会去生成这样类似的语句。此时就可以去替换这些动态的字段或者表名之类。这样在结合之前所讲的返回类型的设置,我们的问题就解决了

。我们可以不用设定参数和返回类型的实体类,只需要形成一个动态的表名和字段名的列表类。就可以动态对那些未知的物理模型进行操作.如下代码可作参考:

<select id="queryMetaList" resultType="Map" statementType="STATEMENT">
		select * from ${tableName} t where
		<foreach item="item" index="index" collection="field" open=" "
			separator="and" close=" ">
			<choose>
				<when test="item.fieldType == 'DATE' and item.dateQueryFlag == 0">
					${item.fieldCode} between
					to_date('${item.fieldValue}','yyyy-mm-dd
					hh24:mi:ss') 
				</when>
				<when test="item.fieldType == 'DATE' and item.dateQueryFlag == 1">
					to_date('${item.fieldValue}','yyyy-mm-dd
					hh24:mi:ss') 
				</when>
				<when test="item.fieldItemCode != null and item.fieldItemCode != ''">
					${item.fieldCode} =
					'${item.fieldItemCode}'
				</when>
				<otherwise>
					${item.fieldCode} =
					'${item.fieldValue}'
				</otherwise>
			</choose>
		</foreach>

</select>

对了,漏了一句,如果是非预编译的话,最好使用${}而不是#{}

 

okay~~搞定收工~~

3
14
分享到:
评论
5 楼 tarena_hhh 2015-03-19  
请问小哥,
插入的有例子吗?
4 楼 Song_939 2014-11-17  
好像用这样写的话分页也有困难
3 楼 aslijiasheng 2013-11-07  
如果返回类型是LIST<MAP<OBJECT,OBJECT>> resulttype里应该怎么写啊,楼主
2 楼 青春的、脚步 2012-12-29  
如果使用like模糊查询呢   好像就没这么顺利
1 楼 xsgkaka 2012-11-02  
看这个东西受教了,能否运用到自定义表单内部,看来又多了一种解决方法

相关推荐

    Mybatis动态调用表名和字段名的解决方法

    注意,由于使用了`${}`,你需要确保传入的表名和字段名是安全的,并且在传入字段名时,如果它是字符串,记得在传入参数前加上单引号,以避免SQL注入问题,例如`String columnName = "'" + columnName + "'"`。...

    mybatis plus 的动态表名的配置详解

    `getParamValue` 方法用于从元对象中获取 `关键字段名` 的值,这里替换为实际的字段名,然后将其添加到表名后面,形成动态表名。 例如,如果执行的 SQL 是针对 `table1`,并且传入的对象中有 `code` 字段,那么...

    mybatis创建一个或多个新用户 insert 字段和表名不确定时动态添加问题

    在MyBatis中,有时我们需要处理动态SQL,特别是在插入数据时,字段和表名可能根据不同的情况变化。本文将深入探讨如何在MyBatis中解决插入一个或多个新用户时,字段和表名不确定的问题。 首先,我们来看一下Java...

    Mybatis现学现用

    MyBatis排序时使用order by 动态参数时需要注意,用$而不是# 字符串替换 默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,...

    MyBatis动态条件通用查询

    MyBatis动态条件通用查询是数据库操作中常见的一种需求,它允许开发者在不编写大量重复SQL语句的情况下,根据传入的参数灵活地执行查询。这个功能的核心在于利用MyBatis的动态SQL特性,结合Map数据结构来构建可变的...

    2024最新MyBatis CRUD操作,动态SQL HM

    通过上述步骤,我们可以清楚地看到如何使用 MyBatis 实现 CRUD 操作以及如何利用其提供的动态 SQL 功能来构建更加灵活和强大的 SQL 语句。在实际开发过程中,合理利用 MyBatis 提供的各种元素和功能,可以使我们的 ...

    美元符实现 动态传入表名称,修改共有字段方法

    在处理这类情况时,可以结合MyBatis的动态SQL功能,比如`&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`等标签,以及`&lt;foreach&gt;`标签来遍历和构建复杂的SQL语句。 总的来说,MyBatis中的井号(#)和美元符($)是动态...

    SQL查询字段被包含语句

    然而,当需要查询的关键词数量增加时,这种方式可能会导致查询语句变得冗长且效率低下,尤其是在使用ORM框架如MyBatis时,需要动态构建SQL语句。这时,我们可以利用`CHARINDEX`函数来优化查询。 `CHARINDEX`是SQL ...

    mybatis中的动态sql, 涉及 where trim set if foreach等

    当数据库表中有多个字段需要更新时,`set`元素能够根据传入的参数动态决定哪些字段需要更新,哪些不需要。 **示例代码:** ```xml update Author != null"&gt;username=#{username}, != null"&gt;password=#{...

    mybatisPlugin2.92

    3. 自动完成:在编写SQL时,插件提供代码补全功能,可以根据已有的表名、字段名等自动填充,减少手动输入的时间。 4. 参数校验:插件可以对传入的参数进行检查,防止因参数为空或错误导致的异常,提高代码的健壮性...

    mybatis-3.4.2

    这些XML映射文件中包含了与数据库交互的详细信息,如表名、字段名以及参数和结果映射。 2. **注解映射**:除了XML,MyBatis也支持注解方式来定义SQL语句,使得代码更加简洁,减少了XML配置文件的使用。 3. **动态...

    详解Mybatis框架SQL防注入指南

    3. `ORDER BY`后的字段:应当在Java代码中预先定义允许的字段列表,仅允许用户传入字段索引,而不是直接使用用户输入的字段名。 实战思路: 1. 分析项目源码,通过IDE的搜索功能寻找可能存在注入的XML文件,重点...

    mybatis-3.0.4源码

    3. 自动映射:MyBatis可以自动将数据库字段名与Java对象的驼峰命名属性进行映射。 三、动态SQL MyBatis的动态SQL功能非常强大,可以在XML映射文件中使用条件语句、foreach循环等,灵活构建SQL语句。例如,`&lt;if&gt;`,`...

    总结--Mybatis传递参数的几种方法

    Mybatis 传递参数的几种方法 Mybatis 中传递参数有多种方法,以下是其中的四种: 1. 传递单个参数 在 Mybatis 中,传递单个参数非常简单。可以直接将参数写在方法中,参数类型可以是 String,也可以是基本类型,...

    mybatis_02 输入输出映射 动态sql 对象关系映射 整合

    MyBatis提供了多种标签来帮助构建这些动态SQL,包括`if`, `where`, `set`, `sql/include`, `foreach`等。 **if标签** `if`标签根据传入的参数决定是否包含某个条件。这对于构造复杂的查询条件非常有用,例如根据...

    浅谈mybatis中的#和$的区别 以及防止sql注入的方法

    在MyBatis中,`#`和`$`在动态SQL中的使用有着明显的区别,它们在处理传入数据的方式上有所不同,同时也与SQL注入的安全问题密切相关。了解这些区别对于编写安全且高效的MyBatis映射文件至关重要。 1. **# 的使用**...

    MyBatis传入多个参数的问题

    在使用MyBatis框架进行数据库操作时,经常会遇到需要向SQL查询语句传入多个参数的情况。本文将详细介绍几种常见的多参数传递方法,并结合具体的代码示例来帮助读者更好地理解和应用这些技巧。 #### 一、单个参数 ...

    mybatis笔记

    1. **加入相关的JAR文件**:为了确保MyBatis可以正常运行,首先需要在项目的lib目录或者通过Maven等构建工具添加MyBatis的核心库以及其他相关依赖,例如用于数据库连接的JDBC驱动。 2. **创建数据库及相关的表**:...

    mybatis-3.2.7.zip

    - MyBatis的动态SQL非常强大,通过`&lt;if&gt;`, `&lt;choose&gt;`, `&lt;when&gt;`, `&lt;otherwise&gt;`, `&lt;where&gt;`, `&lt;trim&gt;`, `&lt;foreach&gt;`等标签实现灵活的SQL构建。 8. **缓存机制**: - MyBatis内置了一级缓存(SqlSession级别)和...

    MyBatis框架笔记1

    MyBatis的动态SQL功能使得在XML映射文件中可以根据条件灵活地构建SQL语句。例如,使用、、、等标签实现条件判断,标签用于循环遍历集合。这样,可以在不改变Java代码的情况下修改SQL逻辑,提高了代码的可维护性。 ...

Global site tag (gtag.js) - Google Analytics