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 )<=
- to_date(#{endDate},'yyyy/mm/dd')) and
- (to_date(#{beginDate},'yyyy/mm/dd')
- <=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>
对了,漏了一句,如果是非预编译的话,最好使用${}而不是#{}
MyBatis构建sql时动态传入表名以及字段名的更多相关文章
- [转]MyBatis动态传入表名、字段名参数的解决办法
一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到.这 ...
- mybatis动态调用表名和字段名
以后慢慢启用个人博客:http://www.yuanrengu.com/index.php/mybatis1021.html 一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用 ...
- 【死磕jeesite源码】mybatis动态调用表名和字段名
本文转载自夏雪冬日 一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字 ...
- MyBatis,动态传入表名,字段名的解决办法
转载:http://luoyu-ds.iteye.com/blog/1517607 今天做项目,遇到的问题就是需求修改数据表的记录,而且字段名都不是固定的,也就是说是需要通过参数传入的, 本来这也不是 ...
- MyBatis动态传入表名
mybatis里#{}与${}的用法: 在动态sql解析过程,#{}与${}的效果是不一样的: #{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符. 如以下 ...
- MyBatis动态传入表名,字段名参数的解决办法---statementType用法
statementType="STATEMENT" 要实现动态传入表名.列名,需要做如下修改 添加属性statementType="STATEMENT" 同时s ...
- MyBatis动态传入表名,字段名参数的解决办法
原文:http://blog.csdn.net/xichenguan/article/details/50393748 要实现动态传入表名.列名,需要做如下修改 添加属性statementType=& ...
- mybatis动态传入表名、列名
原文:http://luoyu-ds.iteye.com/blog/1517607 要实现动态传入表名.列名,需要做如下修改 添加属性statementType=”STATEMENT” (可省略) 同 ...
- Mybatis 使用Mybatis时实体类属性名和表中的字段名不一致
开发中,实体类中的属性名和对应的表中的字段名不一定都是完全相同的,这样可能会导致用实体类接收返回的结果时导致查询到的结果无法映射到实体类的属性中,那么该如何解决这种字段名和实体类属性名不相同的冲突呢? ...
随机推荐
- 【TFS】解决TFS编译中文乱码问题
前言; TFS2018做程序集成非常方便,线上编译然后直接生成docker镜像,但是在使用过程中遇到编译窗口中文乱码的问题,这个问题找了好久没人知道怎么解决.如下: 这个问题不解决,每次编译失败,研发 ...
- mysql复制表结构和内容
许多时候我们想复制一张表部分或者全部内容,或者只复制一张表的框架,这种需求应该说我们很常见. 其实想要实现这种需求十分简单. 表一: mysql> select * from student_i ...
- 每天一个Linux命令(16)which命令
which命令用于查找并显示给定命令的绝对路径. 环境变量PATH中保存了查找命令时需要遍历的目录.which指令会在环境变量$PATH设置的目录里查找符合条件的文件.也就是说,使用which命令,就 ...
- 【JavaScript学习整理】js基础
HTML,CSS属于标记语言, JavaScript是基于客户端的脚本语言. 变量: 语法 var 变量名 = value var是系统内部关键字,用来声明变量 变量名规则: 1.不能以数字开头 ...
- JavaScriptr -- 常用对象 String, date, prototype
<script type="text/javascript"> //给已有的对象添加自定义功能 function getMax() { var max = this[0 ...
- codevs1997 守卫者的挑战
题目描述 Description 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突 然,眼前一道亮光闪过.“我,Nizem,是黑魔法圣殿的守卫者. ...
- ubuntu commands mysql
use table; //选择某个表 show tables; //展现有几个表 select * from table; //显示表内容
- matlab对点云旋转平移
1.显示茶壶点云 ptCloud = pcread('teapot.ply');figure(1)pcshow(ptCloud); title('Teapot'); 2.Create a transf ...
- cocos2d-x3.0rc打包apk遇到的一些问题记录
下载cocos2d-x3.0rc后根据官方教程进行环境配置等等一系列过程没有遇到什么问题 打包apk时出现一些问题: 按照官方教程cmd下运行cocos run -p android -m relea ...
- Delphi 读取 c# webservice XML的base64编码图片字符串转化图片并显示
Delphi 读取 c# webservice XML的base64编码图片字符串转化图片并显示 在 开发中遇到应用c#及asp.net的在的webservice 保存图片并以xml文件形式现实出来 ...