用了mybatis很长一段时间了,可是感受用的都是比较基本的功能,不少mybatis相对ibatis的新功能都没怎么用过。好比其内置的注解功能之类的。此次遇到了一个问题,每次咱们在配置mybaits时,须要在mapping.sql.xml文件中写对应的执行sql脚本。这时咱们通常会先定义实体类来做为sql的返回类型或者执行sql的参数类型。好比以下代码 java
<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>>)。 sql
okay~大概讲解到此,说说此次的问题。之前都是指定了实体类,而后写好sql语句直接套用就能够了。可是如今有个问题,万一你的物理模型不肯定,也便是你的表结构不肯定,甚至连表名字都不肯定该怎么办呢?我此次遇到了这个问题。咱们有个需求,事先定义好了不少数据集的信息模型,针对这些信息模型生成物理模型。而咱们须要针对这些物理模型进行操做。而这些数据集一旦更新,信息模型以及物理模型都要变更,因此事先不可能彻底肯定物理表结构等等信息。此时应该怎么在mybatis中进行处理呢? mybatis
这里在说一下mybatis中一个属性:statementType。这个属性的做用是告诉mybatis咱们写的这个sql究竟是预编译(PRESTATEMENT)仍是非预编译(STATEMENT)的。有什么区别呢?若是是预编译的,那么系统在初始化时就会读取这段sql代码,将指定的实体类中的字段替换了相似#{}这样的语句,就是造成了相似这样的语句: app
"select * from tableName where code=?" 这个时候你在系统运行时再想向这句sql中替换tableName或者code,结果可想而知。若是是非预编译呢,结果恰好相反,他会在系统运行时才会去生成这样相似的语句。此时就能够去替换这些动态的字段或者表名之类。这样在结合以前所讲的返回类型的设置,咱们的问题就解决了 spa
。咱们能够不用设定参数和返回类型的实体类,只须要造成一个动态的表名和字段名的列表类。就能够动态对那些未知的物理模型进行操做.以下代码可做参考: 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>
对了,漏了一句,若是是非预编译的话,最好使用${}而不是#{} xml