ibatis入门教程:详解与高级特性

需积分: 0 0 下载量 134 浏览量 更新于2024-07-26 收藏 269KB DOC 举报
Ibatis教程详解是一份针对ibatis初学者非常实用的文档,它详细介绍了ibatis的各种概念和技术细节。该文档由夏昕在2004年8月1日和9月1日进行了两次更新,主要涵盖以下几个关键部分: 1. **版本更新**:文档最初发布于2004年8月,并在9月进行了补充,增加了ibatis在Spring框架中的集成部分。 2. **版权说明**:作者强调文档可在网络上免费传播,但要求在引用时保持完整性和征求作者同意,同时鼓励读者通过反馈问题、提供改进意见或分享自身经验作为对他人的支持。 3. **准备工作**:文档开始介绍ibatis的安装和环境配置,包括如何构建基础代码,让读者了解开发环境的搭建步骤。 4. **基础概念**: - **ibatis配置**:涵盖了配置文件的编写,这是ibatis的核心部分,它定义了SQL语句的执行逻辑和数据库连接设置。 - **基础语义**:讲解了SqlMapClientBuilder和SqlMapClient的使用,这些是ibatis客户端的主要组件,用于与数据库交互。 - **基本操作示例**:通过实例演示如何执行基本的CRUD(Create, Read, Update, Delete)操作。 5. **高级特性**: - **数据关联**:探讨了一对多和一对一关联的处理,ibatis支持复杂的数据关系映射。 - **延迟加载**:介绍如何通过ibatis避免一次性加载所有数据,提高性能。 - **动态映射**:允许在运行时动态改变SQL查询,增强了灵活性。 - **事务管理**:文档介绍了基于JDBC和JTA的两种事务处理机制,以及如何进行外部事务管理,如缓存的使用。 - **Cache**:讨论了内存型(MEMORY)、LRU(最近最少使用)、FIFO(先进先出)和OSCache(操作系统缓存)等不同类型的缓存策略,提升数据访问效率。 6. **对比其他ORM工具**:文档指出ibatis与Hibernate和Apache OJB等其他ORM框架的区别,ibatis更倾向于“半自动化”,即提供一定程度的自动化,但要求开发者有一定的SQL理解和参与,相比“一站式”解决方案,ibatis更加灵活。 这份文档适合希望通过ibatis进行数据库操作的开发人员深入学习和实践,尤其对于那些希望理解底层原理和自定义SQL的开发者来说,有着很高的参考价值。

JDBC Connection [org.postgresql.jdbc.PgConnection@49f1bf43] will not be managed by Spring ==> Preparing: select z.*,y.PDTCLASS_CLASS FROM ( SELECT * FROM (SELECT r.PDT_PLANEX_PDTID,r.PDT_PLANEX_TYPE ,r.SUM_NUM,e.SUM_NUM2,e.COUNT_NUM FROM (SELECT SUM(t.PDT_PLANEX_NUM) as SUM_NUM,t.PDT_PLANEX_PDTID,t.PDT_PLANEX_TYPE FROM c_pdt_plan_ex t WHERE t.PDT_PLANEX_DELETED = 0 and t.DATA_FROM = ? and to_timestamp(?, 'yyyy-MM-dd HH:mm:ss.SSS') >= t.PDT_PLANEX_BEGIN and t.PDT_PLANEX_END >= to_timestamp(?, 'yyyy-MM-dd HH:mm:ss.SSS') GROUP BY t.PDT_PLANEX_PDTID,t.PDT_PLANEX_TYPE )r LEFT JOIN (SELECT SUM(o.WEISHT_NET_WGHT) SUM_NUM2,COUNT(1) COUNT_NUM,o.PDTINF_PDT,o.PDTINF_CLASS,o.PDT_PLANEX_PDTID,o.PDT_PLANEX_TYPE FROM(SELECT * FROM(SELECT * FROM (SELECT q.*, p.* FROM ( SELECT t.PDT_PLANEX_ID, t.PDT_PLANEX_NUM, t.PDT_PLANEX_PDTID, t.PDT_PLANEX_TYPE, t.PDT_PLANEX_BEGIN, t.PDT_PLANEX_END, t.PDT_PLANEX_COID FROM c_pdt_plan_ex t WHERE t.PDT_PLANEX_DELETED = 0 and t.DATA_FROM = ? and to_timestamp(?, 'yyyy-MM-dd HH:mm:ss.SSS') >= t.PDT_PLANEX_BEGIN and t.PDT_PLANEX_END >= to_timestamp(?, 'yyyy-MM-dd HH:mm:ss.SSS') GROUP BY t.PDT_PLANEX_PDTID, t.PDT_PLANEX_COID, t.PDT_PLANEX_TYPE, t.PDT_PLANEX_BEGIN, t.PDT_PLANEX_END, t.PDT_PLANEX_COID ) q LEFT JOIN (SELECT PDTINF_PDT, PDTINF_ID , PDTINF_CLASS FROM c_products_info WHERE PDTINF_DELETED=0 and DATA_FROM = ? )p on q.PDT_PLANEX_PDTID=p.PDTINF_ID)k LEFT JOIN (select g.CPY_CO,g.CPY_ID from c_companys g where CPY_DELETED=0 and DATA_FROM = ? ) c ON k.PDT_PLANEX_COID=c.CPY_ID)k inner JOIN (select j.WEISHT_NET_WGHT,j.WEISHT_PRODUCT,j.WEISHT_CO,j.WEISHT_EMPTY_TM,j.WEISHT_FULL_TM from c_weight_sheets j where WEISHT_DELETED = 0 and DATA_FROM = ? )r ON k.PDTINF_PDT=r.WEISHT_PRODUCT and k.CPY_CO=r.WEISHT_CO AND k.PDT_PLANEX_BEGIN <= r.WEISHT_FULL_TM AND k.PDT_PLANEX_END >= r.WEISHT_FULL_TM ORDER BY k.PDTINF_PDT )o GROUP BY o.PDT_PLANEX_PDTID)e ON e.PDT_PLANEX_PDTID=r.PDT_PLANEX_PDTID AND e.PDT_PLANEX_TYPE=r.PDT_PLANEX_TYPE)w left join (SELECT PDTINF_PDT, PDTINF_ID , PDTINF_CLASS FROM c_products_info WHERE PDTINF_DELETED=0 and DATA_FROM = ? )p on w.PDT_PLANEX_PDTID=p.PDTINF_ID) z left join (select PDTCLASS_CLASS,PDTCLASS_ID from c_pdt_class where PDTCLASS_DELETED=0) y on z.PDTINF_CLASS=y.PDTCLASS_ID ==> Parameters: e9f6ed8e091611ec842700163e092c06(String), 2023-10-08 23:59:59(String), 2020-10-08 23:59:59(String), e9f6ed8e091611ec842700163e092c06(String), 2023-10-08 23:59:59(String), 2020-10-08 23:59:59(String), e9f6ed8e091611ec842700163e092c06(String), e9f6ed8e091611ec842700163e092c06(String), e9f6ed8e091611ec842700163e092c06(String), e9f6ed8e091611ec842700163e092c06(String) Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@57f98196] [2023-06-01 21:16:02] [ERROR] -- Servlet.service() for servlet [dispatcherServlet] in context with path [/szIntranetweb] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: org.postgresql.util.PSQLException: 错误: 字段 "t.pdt_planex_id" 必须出现在 GROUP BY 子句中或者在聚合函数中使用

2023-06-02 上传