ibatis批处理,多表关联查询

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添加连合查询的表guojia的list属性,如下:

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"/>,如下:

<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添加的循环,也只能循环一次,取一个值。

设置如下:

<%-- 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语句中关联几个表.如下:

<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>

原文:http://shenzhenchufa.blog.51cto.com/730213/262269

时间: 2024-08-09 16:33:08

ibatis批处理,多表关联查询的相关文章

Hibernate-多表关联查询结果的处理方法

Hibernate多表查询结果处理 (2014-07-06 20:45:40) 转载▼ 标签: hibernate 多表查询 结果集处理 分类: Java 如果我们在Hibernate中需要查询多个表的不同字段,那么如何来获取Hibernate多表查询的结果呢?有两种方式: 1. 对各个字段分别转化成对应类型,如下: Java代码: Query q = session.createQuery(" select members, classInfo.className " + "

RDIFramework.NET 中多表关联查询分页实例

RDIFramework.NET 中多表关联查询分页实例 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为指导思想,作为异质系统整合与互操作性.分布式应用提供了可行的解决方案. 分页非常的常见,基本任何项目都会涉及到分页,这没什么好谈的,大多数我们分页对单表的分页比较多,对多表的分页我们可以通过视图来实现,当然还有其他的方式,在这儿,我以一个实例展示下使用我们的RDIFramework.NET来实现多表

MySQL多表关联查询与存储过程

1.多表关联查询 --  **************关联查询(多表查询)**************** -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 1.1 交叉连接查询(不推荐.产生笛卡尔乘积现象:4 * 4=16,有些是重复记录) SELECT empName,deptName FROM employee,dept; -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 多表查询规则:1)确定查询哪些表   2)确定查询哪些字段   3)表与表之间连接条件

图解SQL多表关联查询

图解SQL多表关联查询 网上看了篇文章关于多表连接的,感觉很好,记录下来,以便日后自己学习  内连接 左连接 右连接 全外连接

Yii2中多表关联查询(join、joinwith) with是不执行sql的

Yii2中多表关联查询(join.joinwith) 我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name customer_id book_id) 图书表 (id book_name author_id) 作者表 (id author_name) 模型定义 下面是这4个个模型的定义,只写出其中的关联 Customer class Customer extends \

mark---[mysql多表关联查询的优化方法]

对于一个网站来说,数据库的结构至关重要.即要利于存储(入库不阻塞),又要利于查询(查询不锁表).网站数据库优化经验是一个积累的过程.下面就对多表关联查询的优化方法,举例说明. 现在社区分享类网站很火,就拿方维购物分享网站举例说明吧.也是对二次开发方维购物分享网站的一点总结,高手可以飞过. 购物分享的关键表有:分享表.图片表.文件表.评论表.标签表.分类表等. 围绕分享的表就么多,哇,那也不少啊.当我们查看一个图片的详细信息时,就要显示以上表里的信息.显示图片所属的分类.给图片打的标签.图片的评论

SQL两表关联查询&批量修改字段值

SQL关联查询&修改字段,正确范例如下: --批量修改报告单位名称&更新时间 --tt和tp两表关联查询,将符合条件的tt表中的principal字段更新到tp表的ruperson字段 merge into nhis34.t_publicplaces tp using standard.t_organization tt on (tt.orgcode = tp.r_orgcode and tp.create_time > '2015-05-07 00:00:00') when mat

oracle02--多表关联查询

1. 多表(关联)查询 多表查询也称之为关联查询.多表关联查询等,主要是指通过多个表的关联来获取数据的一种方式. 1.1. 多表映射关系 一对多:A表的一行数据,对应B表中的多条.如:一个部门可以对应多个员工. 多对一:B表中的多条对应A表的一行数据.如:多个员工对应一个部门. 多对多:学生和选修课表----学生和课程对应表. 一对一:人员基本信息和人员信息扩展表. 1.2. 笛卡尔集 笛卡尔集对于我们数据库的数据查询结果的影响: 1. 数据冗余.---笛卡尔集并不是我们所需要的数据. 2. 效

EF模式下 多表关联查询结果作为数据源 gridview无法编辑的问题解决思路

之前做项目都习惯了使用SQL方便又快捷,但是近期领导要求使用对象实体的方式进行程序的开发 比较了多个ORM框架之后 决定还是采用微软自家的EF吧 .初次使用EF,没有什么经验 ,在实际使用过程中 遇到了一些问题,也折腾了好长时间... 前天在开发某个功能的时候 一个小兄弟 就发现 采用EF模式 在多表关联查询的结果作为数据源的情况下 gridview可以正常的显示 但是无法进行编辑,各种属性也都没问题,这可怎么办?百度之,有人说这是因为EF下gridview编辑都是依托于实体类的 ,多表关联的结