`
mzhj
  • 浏览: 227494 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

复杂对象ibatis插入,属性为list,怎么一次性插入

    博客分类:
  • DAO
阅读更多

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()); } } }
分享到:
评论

相关推荐

    ibatis list

    通过`&lt;iterate&gt;`标签,可以为每个用户对象动态生成一条插入语句,从而一次性插入多条记录。 ### 总结 iBatis框架的`&lt;iterate&gt;`标签提供了强大的动态SQL生成能力,特别是在批量数据操作方面。通过合理设置`property...

    常用ibatis配置

    2. 分页查询:分页是查询大量数据时常用的技术,可以避免一次性加载过多数据造成性能问题。在iBatis中,可以通过SQL语句的LIMIT关键字和offset参数进行分页。上述文档中的标签用于动态生成带有LIMIT和OFFSET子句的...

    ibatis3资料-介绍

    - **生命周期管理**:正确管理`SqlSessionFactory`和`SqlSession`的生命周期是至关重要的,通常`SqlSessionFactory`应该在整个应用中只创建一个实例,而`SqlSession`则应在一次请求处理过程中创建和关闭。...

    ibatis-core-3.0.jar.zip

    iBatis 3.0引入了动态SQL,允许在映射文件中使用条件语句,如`if`, `choose`, `when`, `otherwise`, `where`, `set`, `foreach`等,使得SQL语句可以根据Java对象的属性动态生成,提高了代码的可读性和灵活性。...

    ibatis批量存储

    在批量存储场景下,批处理可以一次性提交多个SQL语句,减少与数据库的交互次数,从而提升性能。使用Ibatis的批处理,首先需要开启SqlSession的自动提交,然后调用SqlSession的batch()方法进入批处理模式,接着执行多...

    ibatis api 英文文档

    11. **Batch Operations**:iBATIS提供了批处理功能,可以一次性提交多个插入、更新或删除操作,提升批量数据处理的效率。 12. **Error Handling**:当SQL执行出错时,iBATIS会抛出异常,提供错误信息帮助定位问题...

    ibatis批量处理

    iBatis提供了批处理功能,可以在一次数据库连接中执行多个SQL语句,这极大地提高了处理大量数据时的性能。iBatis通过`SqlMapClient`接口提供了几个关键方法来实现批处理: 1. **`startBatch()`**:开始批处理。 2. ...

    ibatis的使用,jar包,配置文件

    SqlSession的生命周期很短,通常在一次数据库交互后就应该关闭。 Mapper接口是业务逻辑层与数据访问层的桥梁,它定义了操作数据库的方法,这些方法与XML配置文件中的SQL语句对应。通过MyBatis的注解或者XML配置,...

    ibatis-api 帮助文档

    3. **SqlSession**:每个线程都应该有自己的SqlSession实例,它代表一次数据库会话,包含了一系列的数据库操作。SqlSession提供了执行SQL(包括查询、插入、更新、删除)的方法,并支持事务控制。 4. **Mapper接口*...

    ibatis入门例子

    如果在一次SqlSession中执行多个操作,可以手动调用`session.commit()`提交事务,或在发生异常时调用`session.rollback()`回滚事务。 总结,iBatis作为一款优秀的持久层框架,通过将SQL语句与Java代码分离,简化了...

    读取excel数据插入数据库

    最后,一次性将所有User对象通过MyBatis的`insertUserList`方法插入到数据库。 总结起来,通过Apache POI读取Excel数据和MyBatis插入数据库的流程如下: 1. 引入Apache POI和MyBatis相关依赖。 2. 使用POI读取Excel...

    Tutorial

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

    MyBatis技术文档.pdf

    - 分别查询主表和关联表,减少一次性加载的数据量。 3. **一对多映射处理**: - **使用 collection**: - 明确指定集合类型的映射规则。 - **分步查询**: - 同上,减少一次性加载的数据量。 #### 九、动态SQL - ...

    Spring系列面试题129道(附答案解析)

    依赖注入(DI)是一种设计模式,它允许一个对象通过构造器、工厂方法的参数或属性来定义它们对其他对象的依赖关系,然后由外部实体(通常是IoC容器)在运行期来解析这些依赖关系,并将依赖的对象注入到需要它们的...

    java程序员面试宝典 含答案

    - **解析方式**:DOM、SAX、StAX等,各有优缺点,DOM一次性加载整个文档,适合小规模;SAX和StAX是事件驱动,适合大规模。 - **XML应用**:配置文件、数据交换、文档存储等。 - **XML定义**:DTD、XML Schema和 ...

    好用的代码生成源码

    rapid-framework是一个以spring为核心的项目脚手架(或者称为胶水框架),框架将各个零散的框架(struts,strust2,springmvc,hibernate,ibatis,spring_jdbc,flex)搭建好,并内置一个代码生成器,辅助项目开发,可以生成...

    高级软件人才培训专家-day09-Mybatis

    - 性能更高:预编译 SQL 只需要编译一次,多次执行,减少了编译 SQL 语句的时间开销。 - 更加安全:预编译 SQL 可以防止 SQL 注入攻击。 - **SQL 注入**: - SQL 注入是一种常见的安全攻击方式,攻击者通过在输入...

Global site tag (gtag.js) - Google Analytics