当前位置: 首页 > news >正文

iBatis把一个表的sqlmap配置的多个xml中。

背景:

在日新月异的今天,作为程序员的,为了提高工作效率,我们需要努力地去“偷懒”,于是我们想尽办法去使用各种各样的工作方式、工作方法,因此,我们会使用到代码生成器,由于软件的项目是时刻变化着的,因此,很多时候需要去修改表结构,而iBatis配置文件这种东西,基本上是使用代码生成器自动生成的,但由于项目有很多特殊性,因此,我们不推荐把特殊性的SQL直接配置到代码生成器所生成的文件中去,因此,我们需要把某个表的iBatis配置,配置到另外一个xml中去。

 

实现:

其实我们只需要在iBatis配置中添加多一个xml就可以。但值得注意的是,必须把代码生成器生成的基础xml配置在特殊的xml配置之前,否则,特殊的xml使用基础xml中的resultMap时会报错。因为iBatis在初始化的时候,是根据<sqlMaps>的顺序逐个初始化的。

下面举个例子。虽然不是特殊的xml,但我还是把一个表的sql分开到2个xml中去进行配置:

下面是iBatis的<sqlMaps>的配置代码:

 

   < sqlMaps >
    
< sqlMap  resource ="Maps/Person_Auto.xml" />
    
< sqlMap  resource ="Maps/Person.xml" />
  
</ sqlMaps >

 

 

基础xml配置(Person_Auto.xml):

 

ExpandedBlockStart.gif 代码
<? xml version="1.0" encoding="utf-8"  ?>

< sqlMap  namespace ="Person"  xmlns ="http://ibatis.apache.org/mapping"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"   >
  
< alias >
    
< typeAlias  alias ="Person"  type ="piggyWinFormTemplet.Model.Person, piggyWinForm"   />
  
</ alias >

  
< resultMaps >
    
< resultMap  id ="SelectResult"  class ="Person" >
      
< result  property ="Id"  column ="PER_ID"   />
      
< result  property ="FirstName"  column ="PER_FIRST_NAME"   />
      
< result  property ="LastName"  column ="PER_LAST_NAME"   />
      
< result  property ="BirthDate"  column ="PER_BIRTH_DATE"   />
      
< result  property ="WeightInKilograms"  column ="PER_WEIGHT_KG"   />
      
< result  property ="HeightInMeters"  column ="PER_HEIGHT_M"   />
    
</ resultMap >
  
</ resultMaps >

  
< statements >

    
< select  id ="SelectByPrimaryKey"  parameterClass ="int"  resultMap ="SelectResult" >
      select
      PER_ID,
      PER_FIRST_NAME,
      PER_LAST_NAME,
      PER_BIRTH_DATE,
      PER_WEIGHT_KG,
      PER_HEIGHT_M
      from PERSON
      
< dynamic  prepend ="WHERE" >
        
< isParameterPresent >
          PER_ID = #value#
        
</ isParameterPresent >
      
</ dynamic >
    
</ select >

    
< insert  id ="Insert"  parameterClass ="Person"  resultClass ="int" >
      insert into Person (
      PER_ID,
      PER_FIRST_NAME,
      PER_LAST_NAME,
      PER_BIRTH_DATE,
      PER_WEIGHT_KG,
      PER_HEIGHT_M
      ) values (
      #Id:int#,
      #FirstName:varchar#,
      #LastName:varchar#,
      #BirthDate:smalldatetime#,
      #WeightInKilograms:decimal#,
      #HeightInMeters:decimal#
      )
    
</ insert >

    
< update  id ="Update"  parameterClass ="Person"  resultClass ="int" >
      update Person set
      
< isNotNull  property ="FirstName"   > PER_FIRST_NAME=#FirstName:varchar# </ isNotNull >
      
< isNotNull  property ="LastName"  prepend ="," > PER_LAST_NAME=#LastName:varchar# </ isNotNull >
      
< isNotNull  property ="BirthDate"  prepend ="," > PER_BIRTH_DATE=#BirthDate:smalldatetime# </ isNotNull >
      
< isNotNull  property ="WeightInKilograms"  prepend ="," > PER_WEIGHT_KG=#WeightInKilograms:decimal# </ isNotNull >
      
< isNotNull  property ="HeightInMeters"  prepend ="," > PER_HEIGHT_M=#HeightInMeters:decimal# </ isNotNull >
      where PER_ID=#Id:int#
    
</ update >
   

    
< delete  id ="Delete"  parameterClass ="int"  resultClass ="int" >
      delete from PERSON
      where PER_ID = #value#
    
</ delete >

  
</ statements >

</ sqlMap >

 

 

特殊xml配置(Person.xml):

 

ExpandedBlockStart.gif 代码
<? xml version="1.0" encoding="utf-8"  ?>

< sqlMap  namespace ="Person"  xmlns ="http://ibatis.apache.org/mapping"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"   >

  
< statements >
    
< select  id ="SelectAll"  resultMap ="SelectResult" >
      select
      PER_ID,
      PER_FIRST_NAME,
      PER_LAST_NAME,
      PER_BIRTH_DATE,
      PER_WEIGHT_KG,
      PER_HEIGHT_M
      from PERSON
    
</ select >

  
</ statements >
</ sqlMap >

 

 

总结:类似的这种情况不只是出现在这种地方,我们,类似的还有我们的model类。我们加个字段,我们就得用代码生成器对其重新生成。我们最好还得派生出一个子类来继承该自动生成的类,把我们项目中的特殊性代码写在该派生类里,这样,我们用代码生成器生成后可以直接进行替换,不用担心把特殊性代码给覆盖掉。

 原创作品出自努力偷懒,转载请说明文章出处http://www.cnblogs.com/kfarvid/

分类: iBatis.NET

相关文章:

  • 先舍后得
  • 使用sliverlight时遇到的问题及解决方法
  • execute immediate
  • 我的Blog从百度搬到这里了,百度不再更新了
  • Git常用操作指南
  • OSPF多区域配置和虚电路
  • 测试工作中经常用到的一丢Linux命令
  • HDU 1086 You can Solve a Geometry Problem too
  • [Notes]python argparse模块
  • 最新50个不错的免费PSD素材下载(下篇)
  • Hibernate(五)之一对多多对一映射关系
  • Windows 7的预备知识系列之二:认识Windows 7中的窗口
  • [jquery]this触发自身click事件,当前控件向上滑出
  • 转:获取网页URL地址及参数等的两种方法(js和C#)
  • 前后端数据交互的方式有哪些?
  • 2017-08-04 前端日报
  • Debian下无root权限使用Python访问Oracle
  • go语言学习初探(一)
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Python 反序列化安全问题(二)
  • React 快速上手 - 07 前端路由 react-router
  • React中的“虫洞”——Context
  • underscore源码剖析之整体架构
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Vue UI框架库开发介绍
  • vue:响应原理
  • 基于web的全景—— Pannellum小试
  • 将 Measurements 和 Units 应用到物理学
  • 每天10道Java面试题,跟我走,offer有!
  • 驱动程序原理
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何学习JavaEE,项目又该如何做?
  • 算法-插入排序
  • 微信开放平台全网发布【失败】的几点排查方法
  • 我与Jetbrains的这些年
  • 再谈express与koa的对比
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 我们雇佣了一只大猴子...
  • #define,static,const,三种常量的区别
  • #Linux(帮助手册)
  • #宝哥教你#查看jquery绑定的事件函数
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (编译到47%失败)to be deleted
  • (二)springcloud实战之config配置中心
  • (南京观海微电子)——COF介绍
  • (转)母版页和相对路径
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net 提取注释生成API文档 帮助文档
  • .Net6使用WebSocket与前端进行通信
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [1]-基于图搜索的路径规划基础
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项