iBatis2 级联保存

目前在做一个项目,因为忙,很少关注开发者的代码,今天突然发现所有的人的都还不会写级联保存,太失望了。
 
这是我给出的一个例子:
 
MySQL 5.5.21
ibatis 2.3.x
Spring 3.1
 
1、数据脚本
CREATE TABLE `test_dept` ( 
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID'
    `dept_name` varchar(24) NOT NULL COMMENT '部门名称'
    `createtime` datetime NOT NULL COMMENT '创建时间'
    `updatetime` datetime NOT NULL COMMENT '更新时间'
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=gbk COMMENT='部门(测试)' 

CREATE TABLE `test_person` ( 
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID'
    `person_name` varchar(24) NOT NULL COMMENT '人员名'
    `dept_id` bigint(20) NOT NULL COMMENT '部门ID'
    `createtime` datetime NOT NULL COMMENT '创建时间'
    `updatetime` datetime NOT NULL COMMENT '更新时间'
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=gbk COMMENT='员工(测试)'
 
2、java代码
 
/** 
* 部门(测试) 

* @author leizhimin 
*/
 
public class Test_dept extends GenericEntity implements Serializable { 
        private String dept_name;                    //部门名称 
        private java.sql.Timestamp createtime;                    //创建时间 
        private java.sql.Timestamp updatetime;                    //更新时间 

        private List<Test_person> personList= new ArrayList<Test_person>(0);
 
/** 
* 员工(测试) 

* @author leizhimin 
*/
 
public class Test_person extends GenericEntity implements Serializable { 
        private String person_name;                    //人员名 
        private long dept_id;                    //部门ID 
        private java.sql.Timestamp createtime;                    //创建时间 
        private java.sql.Timestamp updatetime;                    //更新时间
 
package com.asiainfo.tdmc.service; 

import com.asiainfo.tdmc.entity.Test_dept; 
import com.asiainfo.tdmc.entity.Test_person; 

import java.util.List; 
import java.util.Map; 

/** 
* Created by IntelliJ IDEA. 

* @author leizhimin 2012-03-16 09:57 
*/
 
public interface TestSV { 
        Test_dept saveTest_dept(Test_dept test_dept); 

        Test_dept updateTest_dept(Test_dept test_dept); 

        void deleteTest_dept(long id); 

        List<Test_dept> queryTest_dept(Map<String,Object> map); 


        Test_person saveTest_person(Test_person test_person); 

        Test_person updateTest_person(Test_person test_person); 

        void deleteTest_person(long id); 

        List<Test_person> queryTest_person(Map<String,Object> map); 


}
 
package com.asiainfo.tdmc.service.impl; 

import com.asiainfo.tdmc.dao.Test_deptDAO; 
import com.asiainfo.tdmc.dao.Test_personDAO; 
import com.asiainfo.tdmc.entity.Test_dept; 
import com.asiainfo.tdmc.entity.Test_person; 
import com.asiainfo.tdmc.service.TestSV; 

import java.util.List; 
import java.util.Map; 

/** 
* Created by IntelliJ IDEA. 

* @author leizhimin 2012-03-16 10:02 
*/
 
public class TestSVImpl implements TestSV{ 
        private Test_deptDAO test_deptDAO; 
        private Test_personDAO test_personDAO; 
         
        @Override 
        public Test_dept saveTest_dept(Test_dept test_dept) { 
                test_dept =    test_deptDAO.insert(test_dept); 
//                if(true) throw new RuntimeException(); 
                for (Test_person person : test_dept.getPersonList()) { 
                        person.setDept_id(test_dept.getId()); 
                } 
                test_personDAO.batchInsert(test_dept.getPersonList()); 
                return test_dept; 
        } 

        @Override 
        public Test_dept updateTest_dept(Test_dept test_dept) { 
                return test_deptDAO.update(test_dept); 
        } 

        @Override 
        public void deleteTest_dept(long id) { 
                test_deptDAO.delete(id); 
        } 

        @Override 
        public List<Test_dept> queryTest_dept(Map<String, Object> map) { 
                return test_deptDAO.query(map); 
        } 

        @Override 
        public Test_person saveTest_person(Test_person test_person) { 
                return test_personDAO.insert(test_person); 
        } 

        @Override 
        public Test_person updateTest_person(Test_person test_person) { 
                return test_personDAO.update(test_person); 
        } 

        @Override 
        public void deleteTest_person(long id) { 
                test_personDAO.delete(id); 
        } 

        @Override 
        public List<Test_person> queryTest_person(Map<String, Object> map) { 
                return test_personDAO.query(map); 
        } 

        public void setTest_deptDAO(Test_deptDAO test_deptDAO) { 
                this.test_deptDAO = test_deptDAO; 
        } 

        public void setTest_personDAO(Test_personDAO test_personDAO) { 
                this.test_personDAO = test_personDAO; 
        } 

 
<?xml version="1.0" encoding="GBK"?> 
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" 
                "http://ibatis.apache.org/dtd/sql-map-2.dtd" > 
<!-- test_dept: 部门(测试)--> 
<sqlMap namespace="Test_dept"> 
        <typeAlias alias="Test_dept" type="com.asiainfo.tdmc.entity.Test_dept"/> 
        <resultMap id="result_base" class="Test_dept"> 
                <result property="id" column="id"/> 
                <result property="dept_name" column="dept_name"/> 
                <result property="createtime" column="createtime"/> 
                <result property="updatetime" column="updatetime"/> 
        </resultMap> 
        <resultMap id="result" class="Test_dept" extends="result_base"> 
                <result property="personList" column="id" select="Test_person.load"/> 
        </resultMap> 

        <insert id="insert" parameterClass="Test_dept"> 
                insert into test_dept( 
                        dept_name, 
                        createtime, 
                        updatetime 
                ) values( 
                        #dept_name#, 
                        now(), 
                        now() 
                ) 
                <selectKey keyProperty="id" resultClass="long"> 
                        select LAST_INSERT_ID() 
                </selectKey> 
        </insert> 

        <update id="update" parameterClass="Test_dept"> 
                update test_dept set 
                        dept_name=#dept_name#, 
                        updatetime=now() 
                where id = #id# 
        </update> 

        <delete id="delete" parameterClass="long"> 
                delete from test_dept where id=#value# 
        </delete> 

        <select id="load" parameterClass="long" resultClass="Test_dept" resultMap="Test_dept.result_base"> 
                select * from test_dept where id=#value# 
        </select> 

        <sql id="sql_query_where"> 
                <dynamic prepend="where"> 
                        <isNotEmpty prepend="and" property="dept_name"> 
                                dept_name=#dept_name# 
                        </isNotEmpty> 
                        <isNotEmpty prepend="and" property="createtime"> 
                                createtime=#createtime# 
                        </isNotEmpty> 
                        <isNotEmpty prepend="and" property="updatetime"> 
                                updatetime=#updatetime# 
                        </isNotEmpty> 
                </dynamic> 
        </sql> 

        <select id="query" parameterClass="map" resultMap="Test_dept.result"> 
                select * from test_dept 
                <include refid="sql_query_where"/> 
                <dynamic prepend=""> 
                        <isNotEmpty property="sortColumns"> 
                                order by #sortColumns# 
                        </isNotEmpty> 
                </dynamic> 
        </select> 

        <select id="count" parameterClass="map" resultClass="int"> 
                select count(1) from test_dept 
                <include refid="sql_query_where"/> 
        </select> 
</sqlMap> 
 
<?xml version="1.0" encoding="GBK"?> 
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" 
                "http://ibatis.apache.org/dtd/sql-map-2.dtd" > 
<!-- test_person: 员工(测试)--> 
<sqlMap namespace="Test_person"> 
        <typeAlias alias="Test_person" type="com.asiainfo.tdmc.entity.Test_person"/> 
        <resultMap id="result_base" class="Test_person"> 
                <result property="id" column="id"/> 
                <result property="person_name" column="person_name"/> 
                <result property="dept_id" column="dept_id"/> 
                <result property="createtime" column="createtime"/> 
                <result property="updatetime" column="updatetime"/> 
        </resultMap> 

        <insert id="insert" parameterClass="Test_person"> 
                insert into test_person( 
                        person_name, 
                        dept_id, 
                        createtime, 
                        updatetime 
                ) values( 
                        #person_name#, 
                        #dept_id#, 
                        now(), 
                        now() 
                ) 
                <selectKey keyProperty="id" resultClass="long"> 
                        select LAST_INSERT_ID() 
                </selectKey> 
        </insert> 

        <update id="update" parameterClass="Test_person"> 
                update test_person set 
                        person_name=#person_name#, 
                        dept_id=#dept_id#, 
                        updatetime=now() 
                where id = #id# 
        </update> 

        <delete id="delete" parameterClass="long"> 
                delete from test_person where id=#value# 
        </delete> 

        <select id="load" parameterClass="long" resultClass="Test_person" resultMap="Test_person.result_base"> 
                select * from test_person where id=#value# 
        </select> 

        <sql id="sql_query_where"> 
                <dynamic prepend="where"> 
                        <isNotEmpty prepend="and" property="person_name"> 
                                person_name=#person_name# 
                        </isNotEmpty> 
                        <isNotEmpty prepend="and" property="dept_id"> 
                                dept_id=#dept_id# 
                        </isNotEmpty> 
                        <isNotEmpty prepend="and" property="createtime"> 
                                createtime=#createtime# 
                        </isNotEmpty> 
                        <isNotEmpty prepend="and" property="updatetime"> 
                                updatetime=#updatetime# 
                        </isNotEmpty> 
                </dynamic> 
        </sql> 

        <select id="query" parameterClass="map" resultMap="Test_person.result_base"> 
                select * from test_person 
                <include refid="sql_query_where"/> 
                <dynamic prepend=""> 
                        <isNotEmpty property="sortColumns"> 
                                order by #sortColumns# 
                        </isNotEmpty> 
                </dynamic> 
        </select> 

        <select id="count" parameterClass="map" resultClass="int"> 
                select count(1) from test_person 
                <include refid="sql_query_where"/> 
        </select> 
</sqlMap> 
 
3、测试类
package com.asiainfo.tdmc.service.impl; 

import com.asiainfo.tdmc.common.ApplicationContextUtils; 
import com.asiainfo.tdmc.entity.Test_dept; 
import com.asiainfo.tdmc.entity.Test_person; 
import com.asiainfo.tdmc.service.TestSV; 

/** 
* Created by IntelliJ IDEA. 

* @author leizhimin 2012-03-16 10:07 
*/
 
public class Test { 

        /** 
         * @param args 
         */
 
        public static void main(String[] args) { 
                TestSV testSV = (TestSV) ApplicationContextUtils.getApplicationContext().getBean("testSV"); 
                 
                Test_dept dept = new Test_dept(); 
                dept.setDept_name("dept1"); 
                Test_person person1 = new Test_person(); 
                person1.setPerson_name("zhangsan"); 
                Test_person person2 = new Test_person(); 
                person2.setPerson_name("lisi"); 

                dept.getPersonList().add(person1); 
                dept.getPersonList().add(person2); 

                //级联保存 
                testSV.saveTest_dept(dept); 

                System.out.println(dept.getId()); 
        } 
}
 
4、说明
 
级联保存是在:
        public Test_dept saveTest_dept(Test_dept test_dept) { 
                test_dept =    test_deptDAO.insert(test_dept); 
                //级联保存 
                for (Test_person person : test_dept.getPersonList()) { 
                        person.setDept_id(test_dept.getId()); 
                } 
                test_personDAO.batchInsert(test_dept.getPersonList()); 
                return test_dept; 
        }
 
 
级联保存的目的是为了数据一致,业务完整,操作便捷。
 


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/807825,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值