public class PfStuffInfoVo implements Serializable {
/** 信息Id */
private String infoId;
/** 项目Id */
private String proid;
/** 附件信息 */
private List<PfFileVo> fileList;
...
这是我的对象 该怎么把fileList属性已插入,PfFileVo 有对应的表
貌似iBatis没有提供多个关联对象的同时插入
你需要再Service层调用多个DAO去做多个关联对象的插入操作
批处理在iBatis里是肯定有的
貌似叫batchUpdate方法
不记得了,这个你可以上网搜搜,答案很多的
iBatis3里貌似确实木有批量插入,很郁闷的说
回答者:clarck_913 - 2011-05-05 09:24:52
可以通过ibatis建立一对多的映射
POJO
Java code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
public class Customer {
private Long id;
private String name;
private String address;
private String postcode;
private String sex;
private List<Orders> orderlist = new ArrayList<Orders>();
public class Orders {
private Long id;
private String code;
private Long customerId;
private Customer customer;
Customer.xml
XML code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="customer">
<typeAlias alias="customer" type="com.lavasoft.ssi.domain.Customer"/>
<resultMap id="result_base" class="customer">
<result property="id" column="id"/>
<result property="name" column="name"/>
<result property="address" column="address"/>
<result property="postcode" column="postcode"/>
<result property="sex" column="sex"/>
</resultMap>
<resultMap id="result" class="customer" extends="result_base">
<result property="orderlist" column="id" select="orders.findByCustomerId"/>
</resultMap>
<insert id="insert" parameterClass="customer">
insert into customer(address,postcode,sex,name) values(#address#,#postcode#,#sex#,#name#)
<selectKey keyProperty="id" resultClass="long">
select LAST_INSERT_ID()
</selectKey>
</insert>
<select id="getById" parameterClass="long" resultMap="result_base">
select * from customer where id = #value#
</select>
<select id="getWithCashById" parameterClass="long" resultMap="result">
select * from customer where id = #value#
</select>
<select id="getWithCashByIdInnerjoin" parameterClass="long" resultClass="customer" resultMap="result">
select c.* from customer c inner join orders o on c.id=o.customerId
</select>
</sqlMap>
Orders.xml
XML code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="orders">
<typeAlias alias="orders" type="com.lavasoft.ssi.domain.Orders"/>
<resultMap id="result_base" class="orders">
<result property="id" column="id"/>
<result property="code" column="code"/>
<result property="customerId" column="customerId"/>
</resultMap>
<resultMap id="result" class="orders" extends="result_base">
<result property="customer" column="customerId" select="customer.getById"/>
</resultMap>
<insert id="insert" parameterClass="orders">
insert into orders(id,code,customerId) values(#id#,#code#,#customerId#)
<selectKey keyProperty="id" resultClass="long">
select LAST_INSERT_ID()
</selectKey>
</insert>
<select id="findByCustomerId" resultMap="result_base" parameterClass="long">
select * from orders where customerId = #value#
</select>
<select id="getById" parameterClass="long" resultMap="result_base">
select * from orders where id = #value#
</select>
<select id="getByIdWithCash" resultMap="result" resultClass="orders" parameterClass="long">
select * from orders where id = #value#
</select>
</sqlMap>
DAO
Java code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
public interface CustomerDAO {
public Long insert(Customer c);
public List<Customer> getById(Long id);
public List<Customer> getWithCashById(Long id);
public List<Customer> getWithCashByIdInnerjoin();
}
public class CustomerDAOImpl extends SqlMapClientDaoSupport implements CustomerDAO {
public Long insert(Customer c) {
return (Long) getSqlMapClientTemplate().insert("customer.insert",c);
}
public List<Customer> getById(Long id) {
return getSqlMapClientTemplate().queryForList("customer.getById",id);
}
public List<Customer> getWithCashById(Long id) {
return getSqlMapClientTemplate().queryForList("customer.getWithCashById",id);
}
public List<Customer> getWithCashByIdInnerjoin(){
return getSqlMapClientTemplate().queryForList("customer.getWithCashByIdInnerjoin");
}
}
public interface OrdersDAO {
public Long insert(Orders o);
public Orders getById(Long id);
public List<Orders> findByCustomerId(Long cid);
public List<Orders> getByIdWithCash(Long id);
}
public class OrdersDAOImpl extends SqlMapClientDaoSupport implements OrdersDAO {
public Long insert(Orders o) {
return (Long) getSqlMapClientTemplate().insert("orders.insert", o);
}
public Orders getById(Long id) {
return (Orders) getSqlMapClientTemplate().queryForObject("orders.getById", id);
}
public List<Orders> findByCustomerId(Long cid) {
return getSqlMapClientTemplate().queryForList("orders.findByCustomerId", cid);
}
public List<Orders> getByIdWithCash(Long id) {
return (List<Orders>) getSqlMapClientTemplate().queryForList("orders.getByIdWithCash",id);
}
}
test
Java code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-6-15 22:50:15<br>
* <b>Note</b>: 客户订单一对多模型:客户
*/
public class CustomerDAOTest {
private CustomerDAO customerDAO = (CustomerDAO) ApplicationContextUtils.getApplicationContext().getBean("customerDAO");
public void testInsert() {
System.out.println("--------insert(Customer c)--------");
Customer c = new Customer();
//fuck!竟然不支持级联保存!
// Orders order1 = new Orders("o1");
// Orders order2 = new Orders("o2");
// c.getOrderlist().add(order1);
// c.getOrderlist().add(order2);
c.setName("多对一");
c.setSex("M");
c.setPostcode("450003");
c.setAddress("郑州市花园路");
Long pk = customerDAO.insert(c);
System.out.println("插入数据的ID=" + pk);
}
public void testGetById() {
System.out.println("--------getById(Long id)--------");
Long pk = 1L;
List<Customer> list = customerDAO.getById(pk);
for (Customer c : list) {
System.out.println(c);
}
}
public void testGetWithCashById() {
System.out.println("--------getWithCashById(Long id)--------");
Long pk = 1L;
List<Customer> list = customerDAO.getWithCashById(pk);
for (Customer c : list) {
System.out.println(c);
}
}
public void testGetWithCashByIdInnerjoin() {
System.out.println("--------getWithCashByIdInnerjoin()--------");
List<Customer> list = customerDAO.getWithCashByIdInnerjoin();
for (Customer c : list) {
System.out.println(c);
}
}
public static void main(String args[]) {
System.out.println("正在测试CustomerDAO");
CustomerDAOTest customerDAOTest = new CustomerDAOTest();
customerDAOTest.testInsert();
customerDAOTest.testGetById();
customerDAOTest.testGetWithCashById();
customerDAOTest.testGetWithCashByIdInnerjoin();
}
}
public class OrdersDAOTest {
OrdersDAO ordersDAO = (OrdersDAO) ApplicationContextUtils.getApplicationContext().getBean("ordersDAO");
public void testInsert() {
System.out.println("--------getWithCashById(Long id)--------");
Orders o = new Orders("o1");
o.setCustomerId(1L);
Long pk = ordersDAO.insert(o);
System.out.println("所插入数据ID=" + pk);
}
public void testGetById() {
System.out.println("--------getById(Long id)--------");
Orders o = ordersDAO.getById(1L);
System.out.println("查询结果:" + o.toString());
}
public void testFindByCustomerId() {
System.out.println("--------findByCustomerId(Long cid)--------");
List<Orders> list = ordersDAO.findByCustomerId(1L);
for(Orders o : list){
System.out.println(o);
}
}
public static void main(String args[]){
System.out.println("正在测试OrderDAO");
OrdersDAOTest ordersDAOTest = new OrdersDAOTest();
ordersDAOTest.testInsert();
ordersDAOTest.testGetById();
ordersDAOTest.testFindByCustomerId();
ordersDAOTest.testGetByIdWithCash();
}
public void testGetByIdWithCash(){
System.out.println("------------getByIdWithCash(Long id)----------");
List<Orders> list = ordersDAO.getByIdWithCash(1L);
for(Orders o : list){
System.out.println(o +"\n\t"+o.getCustomer().toString());
}
}
}
分享到:
相关推荐
通过`<iterate>`标签,可以为每个用户对象动态生成一条插入语句,从而一次性插入多条记录。 ### 总结 iBatis框架的`<iterate>`标签提供了强大的动态SQL生成能力,特别是在批量数据操作方面。通过合理设置`property...
2. 分页查询:分页是查询大量数据时常用的技术,可以避免一次性加载过多数据造成性能问题。在iBatis中,可以通过SQL语句的LIMIT关键字和offset参数进行分页。上述文档中的标签用于动态生成带有LIMIT和OFFSET子句的...
- **生命周期管理**:正确管理`SqlSessionFactory`和`SqlSession`的生命周期是至关重要的,通常`SqlSessionFactory`应该在整个应用中只创建一个实例,而`SqlSession`则应在一次请求处理过程中创建和关闭。...
iBatis 3.0引入了动态SQL,允许在映射文件中使用条件语句,如`if`, `choose`, `when`, `otherwise`, `where`, `set`, `foreach`等,使得SQL语句可以根据Java对象的属性动态生成,提高了代码的可读性和灵活性。...
在批量存储场景下,批处理可以一次性提交多个SQL语句,减少与数据库的交互次数,从而提升性能。使用Ibatis的批处理,首先需要开启SqlSession的自动提交,然后调用SqlSession的batch()方法进入批处理模式,接着执行多...
11. **Batch Operations**:iBATIS提供了批处理功能,可以一次性提交多个插入、更新或删除操作,提升批量数据处理的效率。 12. **Error Handling**:当SQL执行出错时,iBATIS会抛出异常,提供错误信息帮助定位问题...
iBatis提供了批处理功能,可以在一次数据库连接中执行多个SQL语句,这极大地提高了处理大量数据时的性能。iBatis通过`SqlMapClient`接口提供了几个关键方法来实现批处理: 1. **`startBatch()`**:开始批处理。 2. ...
SqlSession的生命周期很短,通常在一次数据库交互后就应该关闭。 Mapper接口是业务逻辑层与数据访问层的桥梁,它定义了操作数据库的方法,这些方法与XML配置文件中的SQL语句对应。通过MyBatis的注解或者XML配置,...
3. **SqlSession**:每个线程都应该有自己的SqlSession实例,它代表一次数据库会话,包含了一系列的数据库操作。SqlSession提供了执行SQL(包括查询、插入、更新、删除)的方法,并支持事务控制。 4. **Mapper接口*...
如果在一次SqlSession中执行多个操作,可以手动调用`session.commit()`提交事务,或在发生异常时调用`session.rollback()`回滚事务。 总结,iBatis作为一款优秀的持久层框架,通过将SQL语句与Java代码分离,简化了...
最后,一次性将所有User对象通过MyBatis的`insertUserList`方法插入到数据库。 总结起来,通过Apache POI读取Excel数据和MyBatis插入数据库的流程如下: 1. 引入Apache POI和MyBatis相关依赖。 2. 使用POI读取Excel...
Apache Derby 是一款轻量级的嵌入式数据库系统,而 iBATIS(现已更名为 MyBatis)是一种流行的 Java ORM(对象关系映射)框架。本教程适合中级水平的开发人员。 #### iBATIS 数据映射框架概述 iBATIS 是一个功能...
例如,如果我们只需要获取当前页的数据,可以避免一次性加载所有结果,而是只处理分页范围内的数据。 总的来说,Ibatis实现分页主要是通过自定义SQL和使用PageHelper插件来完成的。理解这一过程对于优化数据库查询...
在Java中,DOM和SAX是解析XML的两种方式,DOM一次性加载整个文档,适合小文件;SAX事件驱动,适合大文件。 Web服务主要指SOAP(Simple Object Access Protocol)和RESTful API。SOAP基于XML,遵循WSDL(Web Service...
- 分别查询主表和关联表,减少一次性加载的数据量。 3. **一对多映射处理**: - **使用 collection**: - 明确指定集合类型的映射规则。 - **分步查询**: - 同上,减少一次性加载的数据量。 #### 九、动态SQL - ...
依赖注入(DI)是一种设计模式,它允许一个对象通过构造器、工厂方法的参数或属性来定义它们对其他对象的依赖关系,然后由外部实体(通常是IoC容器)在运行期来解析这些依赖关系,并将依赖的对象注入到需要它们的...
- **解析方式**:DOM、SAX、StAX等,各有优缺点,DOM一次性加载整个文档,适合小规模;SAX和StAX是事件驱动,适合大规模。 - **XML应用**:配置文件、数据交换、文档存储等。 - **XML定义**:DTD、XML Schema和 ...
rapid-framework是一个以spring为核心的项目脚手架(或者称为胶水框架),框架将各个零散的框架(struts,strust2,springmvc,hibernate,ibatis,spring_jdbc,flex)搭建好,并内置一个代码生成器,辅助项目开发,可以生成...
- 性能更高:预编译 SQL 只需要编译一次,多次执行,减少了编译 SQL 语句的时间开销。 - 更加安全:预编译 SQL 可以防止 SQL 注入攻击。 - **SQL 注入**: - SQL 注入是一种常见的安全攻击方式,攻击者通过在输入...