目前在做一个项目,因为忙,很少关注开发者的代码,今天突然发现所有的人的都还不会写级联保存,太失望了。
这是我给出的一个例子:
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='员工(测试)'
`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_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; //更新时间
* 员工(测试)
*
* @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);
}
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;
}
}
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>
<!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>
<!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());
}
}
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;
}
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,如需转载请自行联系原作者