`
hyw520110
  • 浏览: 222616 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ibatis批量处理+多表关联查询

    博客分类:
  • java
阅读更多

 ibatis批量操作

ibatis批量操作存在两种方式:
一种是直接在代码中进行循环操作,另一种是在配置文件中进行循环操作。
(1)在配置文件中循环:
1.情况一:多个输入参数循环次数不对称:
  处理方式:新建一个JAVABEAN,将各个参数作为其属性进行赋值。在配置文件中,获取其值,进行各自循环。
  如下例:要更新的字段Opr的值只有一个,而ID的值却有多个。
代码:
    view plaincopy to clipboardprint?
public void batchClientAppOperation(String[] appDevIds,String operation) throws Exception  
    {  
        try 
        {  
            AppOperation appOpr=new AppOperation();  
            appOpr.setOperation(operation);  
            appOpr.setAppDevIds(appDevIds);  
              
            this.getSqlMapClientTemplate().update("Device.ClientAppOperation", appOpr);  
        }  
        catch (DataAccessException ex)  
        {  
            throw new Exception(  
                    Constants.ERROR_CODE_DELETE_USER_BY_ID.getLongValue(),  
                    ex);  
        }  
    } 
public void batchClientAppOperation(String[] appDevIds,String operation) throws Exception
    {
        try
        {
            AppOperation appOpr=new AppOperation();
            appOpr.setOperation(operation);
            appOpr.setAppDevIds(appDevIds);
           
            this.getSqlMapClientTemplate().update("Device.ClientAppOperation", appOpr);
        }
        catch (DataAccessException ex)
        {
            throw new Exception(
                    Constants.ERROR_CODE_DELETE_USER_BY_ID.getLongValue(),
                    ex);
        }
    }
ibatis配置文件:
 view plaincopy to clipboardprint?
<update id="Device.ClientAppOperation" parameterClass="AppOperation"> 
        update T_Device_App_R_Info  
         set Opr=#operation#  
         where ID in  
        <iterate conjunction="," open="(" close=")" property="appDevIds"> 
            #appDevIds[]#  
        </iterate> 
 </update> 
<update id="Device.ClientAppOperation" parameterClass="AppOperation">
        update T_Device_App_R_Info
         set Opr=#operation#
         where ID in
        <iterate conjunction="," open="(" close=")" property="appDevIds">
            #appDevIds[]#
        </iterate>
 </update>
 
2.情况二:多个输入参数循环次数是对称的:
  处理方式:新建一个hashmap,将各个参数名作为key,参数值作为value。在配置文件中,获取各key-value,进行各自循环。
  如下例:将循环插入/更新的列名作为key,列值作为value放入hashmap中.(列名与列值是一一对应的,即循环次数对等)
view plaincopy to clipboardprint?
<!--  
插入一条新纪录  
$与#获取值的方式是一样的,只是$获取是对应参数的值,#会将获取的值加上引号,变为字符串类型。所以,一般用$来获取表名,列名,用#用获取要插入的值。  
--> 
<insert id="customPO_insert" parameterClass="customPO"> 
INSERT INTO $moduleTable$ (parentID  
<iterate property="fieldValueList" prepend="," conjunction=",">  --fieldValueList是customPO一属性  
$fieldValueList[].key$   --循环fieldValueList[]这个数组,因为此数组每个对象是map,可获得map的key.  
</iterate> 
)  
VALUES (#parentID#  
<iterate property="fieldValueList" prepend="," conjunction=","> 
#fieldValueList[].value#  
</iterate> 
)  
<selectKey resultClass="int" keyProperty="id"> 
SELECT last_insert_id()  
</selectKey> 
</insert> 
   
<!--更新--> 
<update id="customPO_update" parameterClass="customPO"> 
UPDATE $moduleTable$ SET  
<iterate property="fieldValueList" conjunction=","> 
$fieldValueList[].key$ = #fieldValueList[].value#  
</iterate> 
WHERE id = #id#  
</update> 
<!--
插入一条新纪录
$与#获取值的方式是一样的,只是$获取是对应参数的值,#会将获取的值加上引号,变为字符串类型。所以,一般用$来获取表名,列名,用#用获取要插入的值。
-->
<insert id="customPO_insert" parameterClass="customPO">
INSERT INTO $moduleTable$ (parentID
<iterate property="fieldValueList" prepend="," conjunction=",">  --fieldValueList是customPO一属性
$fieldValueList[].key$   --循环fieldValueList[]这个数组,因为此数组每个对象是map,可获得map的key.
</iterate>
)
VALUES (#parentID#
<iterate property="fieldValueList" prepend="," conjunction=",">
#fieldValueList[].value#
</iterate>
)
<selectKey resultClass="int" keyProperty="id">
SELECT last_insert_id()
</selectKey>
</insert>
 
<!--更新-->
<update id="customPO_update" parameterClass="customPO">
UPDATE $moduleTable$ SET
<iterate property="fieldValueList" conjunction=",">
$fieldValueList[].key$ = #fieldValueList[].value#
</iterate>
WHERE id = #id#
</update>
 
(2)
在代码中批量处理:
即是在startBatch()与executeBatch()之间循环调用操作数据库。如下:
   view plaincopy to clipboardprint?
public void batchUpdate(final String[] ids,final String appId) throws IEPGMException  
    {  
        try 
        {  
            final HashMap<String, String> map = new HashMap<String, String>();  
              
              
            this.getSqlMapClientTemplate().execute(new SqlMapClientCallback()  
            {  
                  
              public Object doInSqlMapClient( SqlMapExecutor executor) throws SQLException  
                {  
                    executor.startBatch();  
                    executor.delete("Application.deleteAppDevTypeMapById", appId);  
                    for(int i=0;i<ids.length;i++)  
                    {  
//由于map中key都是appId,ids,所以每次循环赋值后,map中也只有二个key,即是appId,ids,其值会被不断更新.  
                     map.put("appId",appId);  
                     map.put("ids",ids[i]);  
                     executor.insert("Application.insertAppDevTypeMap", map);  
                    }  
                    executor.executeBatch();  
                    return null;  
                }  
            });  
        }  
        catch (DataAccessException ex)  
        {  
            throw new IEPGMException(  
                    Constants.ERROR_CODE_DELETE_USER_BY_ID.getLongValue(),  
                    ex);  
        }  
    } 
public void batchUpdate(final String[] ids,final String appId) throws IEPGMException
    {
        try
        {
            final HashMap<String, String> map = new HashMap<String, String>();
           
           
            this.getSqlMapClientTemplate().execute(new SqlMapClientCallback()
            {
               
              public Object doInSqlMapClient( SqlMapExecutor executor) throws SQLException
                {
                    executor.startBatch();
                    executor.delete("Application.deleteAppDevTypeMapById", appId);
                    for(int i=0;i<ids.length;i++)
                    {
//由于map中key都是appId,ids,所以每次循环赋值后,map中也只有二个key,即是appId,ids,其值会被不断更新.
                     map.put("appId",appId);
                     map.put("ids",ids[i]);
                     executor.insert("Application.insertAppDevTypeMap", map);
                    }
                    executor.executeBatch();
                    return null;
                }
            });
        }
        catch (DataAccessException ex)
        {
            throw new IEPGMException(
                    Constants.ERROR_CODE_DELETE_USER_BY_ID.getLongValue(),
                    ex);
        }
    }
 
ibatis配置文件中:
view plaincopy to clipboardprint?
<delete id="Application.deleteAppDevTypeMapById" parameterClass="java.lang.String"> 
    DELETE FROM T_App_Spce_R_Info WHERE App_ID=#appId#;  
</delete> 
 
<insert id="Application.insertAppDevTypeMap" parameterClass="java.util.HashMap"> 
 INSERT INTO T_App_Spce_R_Info(App_ID,Spec_Code) VALUES(#appId#,#ids#);  
</insert> 
 <delete id="Application.deleteAppDevTypeMapById" parameterClass="java.lang.String">
     DELETE FROM T_App_Spce_R_Info WHERE App_ID=#appId#;
 </delete>
 
 <insert id="Application.insertAppDevTypeMap" parameterClass="java.util.HashMap">
  INSERT INTO T_App_Spce_R_Info(App_ID,Spec_Code) VALUES(#appId#,#ids#);
 </insert>
 
如何定义多表查询
1)
添加Guojia.java类,只是一个普通的javabean,对应guojia表中各字段,及其setter,getter,无须像hibernate一样设置对应关系。
2)
添加guojia.xml,只须添加:
 
view plaincopy to clipboardprint?
<sqlMap namespace="Guo"> 
       <typeAlias type="com.coship.dhm.iepgm.admin.entity.Guojia" alias="Guo" /> 
       <resultMap id="GuoResult" class="Guo" > 
              <result column="gid" property="gid" /> 
              <result column="userid" property="userid" /> 
              <result column="gname" property="gname" /> 
       </resultMap> 
</sqlMap> 
<sqlMap namespace="Guo">
       <typeAlias type="com.coship.dhm.iepgm.admin.entity.Guojia" alias="Guo" />
       <resultMap id="GuoResult" class="Guo" >
              <result column="gid" property="gid" />
              <result column="userid" property="userid" />
              <result column="gname" property="gname" />
       </resultMap>
</sqlMap>
 
无须添加如查询之类的东西。
3)
在当前类hwj.java添加连合查询的表guojia的list属性,如下:
   view plaincopy to clipboardprint?
private List<Guojia> guoList;  
  public List<Guojia> getGuoList() {  
            return guoList;  
     }  
     public void setGuoList(List<Guojia> guoList) {  
            this.guoList = guoList;  
     } 
  private List<Guojia> guoList;
    public List<Guojia> getGuoList() {
              return guoList;
       }
       public void setGuoList(List<Guojia> guoList) {
              this.guoList = guoList;
       }
 
4)
在当前表hwj.xml的resultMap中,添加<result property="guoList" resultMap="Guo.GuoResult"/>,如下:
     view plaincopy to clipboardprint?
<resultMap id="HwjResult" class="Hwj"> 
            <result column="staff_id" property="id" /> 
            <result column="longinName" property="loginName" /> 
            <result column="password" property="password" /> 
            <result column="staff_name" property="username" /> 
            <result column="status" property="status" /> 
            <result column="phone" property="phone" /> 
            <result column="email" property="email" /> 
            <result property="guoList" resultMap="Guo.GuoResult"/> 
     </resultMap> 
  <resultMap id="HwjResult" class="Hwj">
              <result column="staff_id" property="id" />
              <result column="longinName" property="loginName" />
              <result column="password" property="password" />
              <result column="staff_name" property="username" />
              <result column="status" property="status" />
              <result column="phone" property="phone" />
              <result column="email" property="email" />
              <result property="guoList" resultMap="Guo.GuoResult"/>
       </resultMap>
 
 
注意:resultMap="Guo.GuoResult"中的Guo对应上面guojia.xml中的namespace,GuoResult对应其resultMap的名.
5)
在sqlMapClient.xml导入guojia.xml
注意:
在resultMap中列出的各列,只能是select的各字段。不能多,也不能少。否则出错。
如:A表中有a,b两列。现select a from A。则resultMap只能列了关于a的列名—属性,不能多列b的东西,否则出错。
 
6)
若为三表连合查询,
1.对于第三个表的设置,跟上面设置第二个表一样。
2.同样,也只须在hwj.java,hwj.xml中进行相同的设置即可。
说明:
在页面显示时:
在hwj循环记录的iterator中,添加guojia,address各种的循环即可。
无须将address内嵌在guojia中:因为实际上hwj的查询语句查询出来是所有记录,guojia,address添加的循环,也只能循环一次,取一个值。
设置如下:
view plaincopy to clipboardprint?
<%-- guojia    --%>         
                                    <td  width="20%"> 
                                    <s:iterator value="#user.guoList" status="index1" id="l"> 
                                       <%-- <s:property value="#index1.index"/> --%> 
                                          <s:property value="gname" /> 
                                   </s:iterator></td> 
<%-- address        --%>         
                                    <td  width="20%"> 
                                    <s:iterator value="#user.addressList" status="index1" id="l"> 
                                       <%-- <s:property value="#index1.index"/> --%> 
                                          <s:property value="address" /> 
                                   </s:iterator></td> 
<%-- guojia    --%>      
                                    <td  width="20%">
                                    <s:iterator value="#user.guoList" status="index1" id="l">
                                       <%-- <s:property value="#index1.index"/> --%>
                                          <s:property value="gname" />
                                   </s:iterator></td>
<%-- address        --%>      
                                    <td  width="20%">
                                    <s:iterator value="#user.addressList" status="index1" id="l">
                                       <%-- <s:property value="#index1.index"/> --%>
                                          <s:property value="address" />
                                   </s:iterator></td>
 
 
(3)
resultMap中的的列与javaBean属性的对应关系,只能列出sql语句中select的字段,不能多也不能少,否则出错.----不关心sql语句中关联几个表.如下:
   view plaincopy to clipboardprint?
<resultMap id="DevTypeResult" class="DevType"> 
      <result column="Spec_Code" property="specCode" /> 
      <result column="Spec_Name" property="specName" /> 
      <result column="Vendor" property="vendor" /> 
      <result column="Brand" property="brand" /> 
      <result column="Model" property="model" /> 
   </resultMap> 
     
   <select id="DevType.findNoChoiceDevTypeById" parameterClass="java.lang.String" resultMap="DevTypeResult"> 
      SELECT distinct d.*   
      FROM T_App_Info a, T_Device_Spec d, T_App_Spce_R_Info r   
      WHERE a.App_ID=r.App_ID   
            AND r.Spec_Code!=d.Spec_Code  
            AND a.App_ID=#appId#  
      ORDER BY  d.Spec_Code;  
   </select> 
 <resultMap id="DevTypeResult" class="DevType">
       <result column="Spec_Code" property="specCode" />
       <result column="Spec_Name" property="specName" />
       <result column="Vendor" property="vendor" />
       <result column="Brand" property="brand" />
       <result column="Model" property="model" />
    </resultMap>
   
    <select id="DevType.findNoChoiceDevTypeById" parameterClass="java.lang.String" resultMap="DevTypeResult">
       SELECT distinct d.*
       FROM T_App_Info a, T_Device_Spec d, T_App_Spce_R_Info r
       WHERE a.App_ID=r.App_ID
             AND r.Spec_Code!=d.Spec_Code
             AND a.App_ID=#appId#
       ORDER BY  d.Spec_Code;
    </select>
 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/w40338544/archive/2010/06/28/5699568.aspx

分享到:
评论

相关推荐

    perl516-perl-Locale-Maketext-1.22-19.el6.centos.alt.noarch.rpm

    perl516-perl-Locale-Maketext-1.22-19.el6.centos.alt.noarch.rpm

    MATLAB仿真平台下的含碳捕集与垃圾焚烧虚拟电厂的协同优化调度策略研究:电转气技术下的能源利用与需求响应管理,MATLAB代码:计及电转气协同的含碳捕集与垃圾焚烧电厂优化调度 关键词:碳捕集 电厂

    MATLAB仿真平台下的含碳捕集与垃圾焚烧虚拟电厂的协同优化调度策略研究:电转气技术下的能源利用与需求响应管理,MATLAB代码:计及电转气协同的含碳捕集与垃圾焚烧电厂优化调度 关键词:碳捕集 电厂 需求响应 优化调度 电转气协同调度 参考文档:《计及电转气协同的含碳捕集与垃圾焚烧电厂优化调度》完全复现 仿真平台:MATLAB+CPLEX 主要内容:代码主要做的是一个计及电转气协同的含碳捕集与垃圾焚烧电厂优化调度问题,基本调度框架是碳捕集电厂–电转气–燃气机组协同利用框架,碳捕集的 CO2 可作为电转气原料, 生成的天然气则供应给燃气机组; 并通过联合调度将碳捕集能耗和烟气处理能耗进行负荷转移以平抑可再生能源波动,使得风电 光伏实现间接可调度而被灵活利用,代码采用的是非智能算法求解,因为本文问题复杂智能算法难以求解,故使用的是yalmip+cplex求解器完成求解 这段代码是一个关于电转气协同的含碳捕集与垃圾焚烧电厂优化调度的程序。下面我将对程序进行详细分析。 首先,程序开始时进行了一些初始化的操作,包括清空命令窗口、清除变量和关闭所有图形窗口。 然后,定义了一系列的参数,这

    温州市乡镇边界,shp格式

    shp格式,可直接导入arcgis使用

    snappy-1.1.0-3.el7.x64-86.rpm.tar.gz

    1、文件内容:snappy-1.1.0-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/snappy-1.1.0-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    perl516-perl-libs-5.16.3-19.el6.centos.alt.x86_64.rpm

    perl516-perl-libs-5.16.3-19.el6.centos.alt.x86_64.rpm

    si-units-0.6.5-1.el7.x64-86.rpm.tar.gz

    1、文件内容:si-units-0.6.5-1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/si-units-0.6.5-1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    svrcore-devel-4.1.3-2.el7.x64-86.rpm.tar.gz

    1、文件内容:svrcore-devel-4.1.3-2.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/svrcore-devel-4.1.3-2.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    宠物管理系统(源码+数据库+论文+ppt)java开发ssm框架javaweb,可做计算机毕业设计或课程设计

    宠物管理系统(源码+数据库+论文+ppt)java开发ssm框架javaweb,可做计算机毕业设计或课程设计 【功能需求】 整个网上宠物管理系统的设计与实现,主要实现的功能有以下几点: (1)前台用户:首页、宠物用品、宠物商店、宠物领养、宠物挂失、论坛信息、宠物资讯、个人中心、后台管理、购物车、客服咨询 (2)管理员:首页、个人中心、宠物分类管理、商品分类管理、宠物用品管理、宠物商店管理、宠物领养管理、用户管理、宠物寄存管理、用户领养管理、宠物挂失管理、论坛管理、管理员管理、系统管理、订单管理等功能; 【环境需要】 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.数据库:MySql 5.7/8.0等版本均可; 【购买须知】 本源码项目经过严格的调试,项目已确保无误,可直接用于课程实训或毕业设计提交。里面都有配套的运行环境软件,讲解视频,部署视频教程,一应俱全,可以自己按照教程导入运行。附有论文参考,使学习者能够快速掌握系统设计和实现的核心技术。

    一个功能强大的图表生成工具,支持多种图表类型和数据可视化

    ## 功能特点 1. 数据导入 - 支持Excel文件 - 支持CSV文件 - 数据预览 - 自动识别列 2. 图表类型 - 折线图 - 柱状图 - 饼图 - 散点图 - 箱线图 - 热力图 3. 图表设置 - 自定义标题 - 主题选择 - 轴标签设置 - 样式调整 4. 其他功能 - 实时预览 - 高清导出 - 多种格式 - 简单操作

    perl516-perl-DBI-1.630-4.el6.centos.alt.x86_64.rpm

    perl516-perl-DBI-1.630-4.el6.centos.alt.x86_64.rpm

    strace-4.24-7.el7-9.x64-86.rpm.tar.gz

    1、文件内容:strace-4.24-7.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/strace-4.24-7.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    sos-3.9-5.el7.centos.12.x64-86.rpm.tar.gz

    1、文件内容:sos-3.9-5.el7.centos.12.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/sos-3.9-5.el7.centos.12.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    srp-daemon-22.4-6.el7-9.x64-86.rpm.tar.gz

    1、文件内容:srp_daemon-22.4-6.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/srp_daemon-22.4-6.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    supermin5-devel-5.1.19-1.el7.x64-86.rpm.tar.gz

    1、文件内容:supermin5-devel-5.1.19-1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/supermin5-devel-5.1.19-1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    国土变更小飞机工具分享

    找到image文件扫一扫获取授权

    一个将 Ollama 与 Flask 框架结合的 Python 源码

    一个将 Ollama 与 Flask 框架结合的 Python 源码,创建一个 Web 服务,用户可以通过浏览器或其他工具向该服务发送请求,调用 Ollama 模型生成文本。

    perl516-perl-DateTime-1.06-3.el6.centos.alt.x86_64.rpm

    perl516-perl-DateTime-1.06-3.el6.centos.alt.x86_64.rpm

    Python IDE PyCharm的多平台安装指南和技术应用入门

    内容概要:本文档详细介绍了如何在不同操作系统(Windows、macOS 和 Linux)上安装 PyCharm这一集成开发环境(IDE)。文档不仅讲解了具体的下载渠道以及步骤指引——涵盖社区版和专业版的选择,而且还引导用户进行首次配置,包括外观定制、键盘布局选定以及必要的组件启用,并指出在首次使用的各个阶段可能会遇到的关键事项,像是授权激活。此外,也提到了在启动过程中,针对不同平台的一些特定注意事项,例如在 Mac 中的安全性和隐私设置、Linux 下基于命令行的解压缩与启动方法。 适合人群:初次接触 Python 编程或有意向使用 PyCharm 提高生产力的程序员,尤其是对 PyCharm 不太熟悉的技术新手。 使用场景及目标:为希望使用 PyCharm 开发 Python程序的学生或专业人士提供详尽的操作指南,使其能够顺利完成安装,并熟悉 IDE 的基本特性及高级特性的初步认识,从而快速着手实际项目的开发。 阅读建议:用户可以按自己的操作系统直接跳转相关章节,逐步依照文档步骤来进行安装与配置。同时关注每段文字末提到的独特提醒项以保证顺利地使用 IDE 进行编码工作。对于计划长期使用 PyCharm 的用户来说,还可以探索更多高级插件以满足自身开发需求。

    perl516-perl-DateTime-TimeZone-1.63-5.el6.centos.alt.noarch.rpm

    perl516-perl-DateTime-TimeZone-1.63-5.el6.centos.alt.noarch.rpm

    爆火付费进群流量源码 吃瓜玩法变现

    全新前端UI界面,多种前端交互特效让页面不再单调,进群页面群成员数,群成员头像名称,每次刷新页面随机更新不重复,最下面评论和点赞也是如此随机刷新不重复 进群页面简介,群聊名称,群内展示,常见问题后台一键开关方便控制,付费进群系统后台自定义你的内容,底部显示你所设置的进群金额,也可以修改付费获取某些资源,搭建者自己集思广益,搭建的知识工具里面的内容才是内核,运营起来才是王道

Global site tag (gtag.js) - Google Analytics