`
binyan17
  • 浏览: 204162 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

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

 
阅读更多

 

ibatis批量操作存在两种方式:
一种是直接在代码中进行循环操作,另一种是在配置文件中进行循环操作。
(1)在配置文件中循环:
1.情况一:多个输入参数循环次数不对称:
  处理方式:新建一个JAVABEAN,将各个参数作为其属性进行赋值。在配置文件中,获取其值,进行各自循环。
  如下例:要更新的字段Opr的值只有一个,而ID的值却有多个。
代码:
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配置文件:
<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中.(列名与列值是一一对应的,即循环次数对等)

<!--
插入一条新纪录
$与#获取值的方式是一样的,只是$获取是对应参数的值,#会将获取的值加上引号,变为字符串类型。所以,一般用$来获取表名,列名,用#用获取要插入的值。
-->
<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()之间循环调用操作数据库。如下:

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配置文件中:

 <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,只须添加:
 
<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添加连合查询的表guojialist属性,如下:
4)
  private List<Guojia> guoList;
    public List<Guojia> getGuoList() {
              return guoList;
       }
       public void setGuoList(List<Guojia> guoList) {
              this.guoList = guoList;
       }
 
在当前表hwj.xmlresultMap中,添加<result property="guoList" resultMap="Guo.GuoResult"/>,如下:
注意:resultMap="Guo.GuoResult"中的Guo对应上面guojia.xml中的namespaceGuoResult对应其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>
 
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添加的循环,也只能循环一次,取一个值。
设置如下:
3
<%-- 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>
 
resultMap中的的列与javaBean属性的对应关系,只能列出sql语句中select的字段,不能多也不能少,否则出错.----不关心sql语句中关联几个表.如下:
 <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>
 

 

分享到:
评论

相关推荐

    ibatis的批量插入DAO实例

    通过以上步骤,我们就完成了Ibatis批量插入的DAO实例。在实际项目中,根据业务需求可能需要对SQL语句进行优化,如开启或关闭数据库的自动提交,或者调整批处理的大小以平衡性能和内存消耗。此外,Ibatis还支持使用`...

    ibatis n+1选择问题 的几种解决方案

    通过这种方式,iBATIS可以在一个查询中处理复杂的关联关系,减少数据库交互。 7. **缓存(Caching)**: 利用iBATIS的二级缓存,可以存储已经查询过的数据,减少对数据库的重复访问。但这需要考虑到缓存管理和一致...

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    在Java代码中,通过MyBatis的SqlSession对象加载或保存相关的对象,Ibatis会自动处理一对多的关联填充和删除规则。 接着,批处理操作是提高性能的关键。在Ibatis中,可以通过设置SqlSession的flushCache和useCache...

    ibatis api,ibatis文档,ibatis说明文档

    通过阅读文档,你可以了解如何配置Ibatis、创建Mapper接口和XML映射文件,以及如何处理复杂的查询和关联。 在说明文档中,通常会包含以下内容: 1. 安装和配置:介绍如何将Ibatis集成到项目中,包括Maven或Gradle...

    ibatis常用sql语句

    iBATIS是早期流行的Java持久层框架之一,它通过SQL映射文件将SQL语句与Java对象关联起来,实现数据的持久化操作。iBATIS的核心功能在于其强大的SQL映射能力和动态SQL生成机制,这使得开发人员能够灵活地处理复杂的...

    IBatis.NET开发文档

    - 批量操作:如何利用iBATIS进行批量插入、更新或删除。 - 动态SQL的最佳实践:分享编写高效动态SQL的技巧和注意事项。 通过深入学习这些文档,开发者可以熟练掌握iBATIS.NET,实现高效、灵活的数据访问,同时...

    ibatis-2.3.

    iBATIS 是一个开源的 Java 库,它为 SQL 数据库提供了映射框架,允许将 SQL 查询与 Java 代码直接关联,从而简化了数据访问层(DAL)的开发工作。在 iBATIS 2.3 版本中,我们可能会关注以下几个关键知识点: 1. **...

    iBatis.rar 开发文档

    例如,它可能涵盖一对一、一对多、多对多的复杂关联映射,以及如何利用、标签处理嵌套结果。此外,可能会讲解如何使用Executor执行器进行批量操作,以及如何利用TypeHandler处理自定义数据类型。 通过阅读这三份...

    Ibatis所有的包

    6. ResultMap结果映射:ResultMap用于处理查询结果到Java对象的映射,它可以定义复杂的结果映射规则,如关联、嵌套查询等,使得数据的转换更为灵活。 在提供的文件列表中,"ibatis-2.3.0.677"是Ibatis的一个旧版本...

    ibatis 的关系映射

    标题 "ibatis 的关系映射" 指涉的是在使用 iBatis 框架时,如何处理数据库中的关联关系,包括一对一、一对多和多对多的关系映射。iBatis 是一个轻量级的 Java ORM(对象关系映射)框架,它允许开发者将 SQL 查询直接...

    Mybatis多对多关联映射源码

    Mybatis在处理多对多映射时,会根据配置生成SQL查询语句,通常包括一个主查询和多个子查询。主查询获取主要实体,然后通过子查询获取关联的实体集合。Mybatis的Executor执行器在解析SQL并执行后,将结果集转化为...

    ibatis2.3源码

    3. **Executor**:执行器是iBATIS的核心组件,负责处理SQL的执行,包括简单执行、批量执行和缓存管理。 4. **ParameterMapping**和**ResultMapping**:这两个概念定义了如何将Java对象的属性与SQL语句中的参数和...

    ibatis源代码

    在Ibatis中,SQL的执行、结果集的映射以及参数的绑定都由框架来处理,降低了开发人员的工作负担。 Ibatis 的核心组件包括: 1. **SqlSessionFactory**: SqlSessionFactory 是 Ibatis 的核心工厂类,它负责创建...

    iBATIS实战

    本书是讲述iBATIS框架的权威著作。书中既详实地介绍了iBATIS的设计理念和基础知识,也讨论了动态SQL、高速缓存、DAD框架等高级主题,还讲解了iBATIS在实际开发中的应用。书的最后给出了一个设计优雅、层次清晰的示例...

    ibatis-sqlmap-2.3.4.726-sources.jar.zip_birth84v_cutting1v2_ibat

    iBatis的核心功能是SQL映射,它通过XML配置文件或注解方式定义了SQL语句及其关联的Java对象。在2.3.4.726这个版本中,我们可以期待看到一些关键组件,如SqlMapConfig.xml配置文件的解析逻辑,SqlMapClient的构建和...

    ibatis2.3.4.726增删改查源码实例

    Ibatis会自动将接口方法与XML文件中的SQL关联,实现动态SQL执行。 4. **SqlSession**:它是Ibatis执行SQL的会话对象,负责执行SQL和返回结果集。在`WebRoot`目录下的Java控制器类中,你会看到通过SqlSessionFactory...

    ibatis api 英文文档

    11. **Batch Operations**:iBATIS提供了批处理功能,可以一次性提交多个插入、更新或删除操作,提升批量数据处理的效率。 12. **Error Handling**:当SQL执行出错时,iBATIS会抛出异常,提供错误信息帮助定位问题...

    iBatis 轻量级持久层架构

    - **避免过多的嵌套查询**:尽量将复杂查询转化为多次简单查询,或使用子查询优化。 - **事务管理**:根据业务需求合理设置事务隔离级别,避免不必要的回滚和锁表。 - **合理使用参数绑定**:避免使用字符串拼接...

    ibatis in action

    书中的案例涵盖了各种常见应用场景,如单表操作、多表关联查询、批量更新等,全面展示了iBatis在实际开发中的应用。 总之,《iBatis in Action》是学习和掌握iBatis框架的绝佳资源,无论你是初学者还是有经验的...

Global site tag (gtag.js) - Google Analytics