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


    今天项目需要用到动态表名,找到这一篇文章,亲测可用

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

    Java代码  收藏代码
    1. <select id="queryApplyStatusNum" parameterType="ApplyCriteria"  
    2.         resultType="ApplyStatusNumDto">  
    3.         select  
    4.         o.statecode as statusCode,count(*) as statusNum  
    5.         from  
    6.         TM_ConsultationApply o  
    7.         where  
    8.         <if test="doctorCode != null and doctorCode != ''"> o.DoctorCode = #{doctorCode} and </if>  
    9.         <if test="beginDate != null and endDate != null">  
    10.             ((trunc(o.AppointBeginDate )&lt;=  
    11.             to_date(#{endDate},'yyyy/mm/dd')) and  
    12.             (to_date(#{beginDate},'yyyy/mm/dd')  
    13.             &lt;=o.AppointEndDate)) and  </if>  
    14.         1=1  
    15.         group by o.statecode  
    16. </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,结果可想而知。如果是非预编译呢,结果刚好相反,他会在系统运行时才会去生成这样类似的语句。此时就可以去替换这些动态的字段或者表名之类。这样在结合之前所讲的返回类型的设置,我们的问题就解决了

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

    Sql代码  收藏代码
    1. <select id="queryMetaList" resultType="Map" statementType="STATEMENT">  
    2.         select * from ${tableName} t where  
    3.         <foreach item="item" index="index" collection="field" open=" "  
    4.             separator="and" close=" ">  
    5.             <choose>  
    6.                 <when test="item.fieldType == 'DATE' and item.dateQueryFlag == 0">  
    7.                     ${item.fieldCode} between  
    8.                     to_date('${item.fieldValue}','yyyy-mm-dd  
    9.                     hh24:mi:ss')   
    10.                 </when>  
    11.                 <when test="item.fieldType == 'DATE' and item.dateQueryFlag == 1">  
    12.                     to_date('${item.fieldValue}','yyyy-mm-dd  
    13.                     hh24:mi:ss')   
    14.                 </when>  
    15.                 <when test="item.fieldItemCode != null and item.fieldItemCode != ''">  
    16.                     ${item.fieldCode} =  
    17.                     '${item.fieldItemCode}'  
    18.                 </when>  
    19.                 <otherwise>  
    20.                     ${item.fieldCode} =  
    21.                     '${item.fieldValue}'  
    22.                 </otherwise>  
    23.             </choose>  
    24.         </foreach>  
    25.   
    26. </select>  

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

  • 相关阅读:
    liunx上升级python2至python3
    python之logging日志
    c# 脚本引擎 脚本编辑器
    设置 BCompare 打开文件时的默认字符编码
    Python调用动态库,获取BSTR字符串
    服务器CPU100%的排查日志
    栈(Stack)
    搭建个人的github.io博客
    django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found 3.7.17)
    virtualenv中使用python的虚拟环境
  • 原文地址:https://www.cnblogs.com/mrcharles/p/5028138.html
Copyright © 2020-2023  润新知