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,如需转载请自行联系原作者
相关文章
|
6月前
|
SQL API 数据库
MyBatisPlus-多记录操作及逻辑删除
MyBatisPlus-多记录操作及逻辑删除
293 0
|
Java
SpringDataJPA如何实现某分类下的全部信息【分页】
SpringDataJPA如何实现某分类下的全部信息【分页】
72 0
|
Java 数据库连接 数据库
hibernate自动导出数据库表
hibernate自动导出数据库表
140 0
|
Java 数据库连接 数据库
第11章—使用对象关系映射持久化数据—SpringBoot+SpringData+Jpa进行查询修改数据库
SpringBoot+SpringData+Jpa进行查询修改数据库 JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。但它又不限于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。
1362 0
|
Java 数据库连接
HIbernate处理数据更新丢失
使用乐观锁的机制处理: 第一步:  在持久类中添加version属性,并且添加对应的get.set方法; 第二步: 在全局配置文件中配置节点 以上两步便可以处理hibernate的数据更新丢失问题
833 0