`

MyBatis创建Oracle触发器

 
阅读更多

 

转自:http://javawangzilong.iteye.com/blog/2144317

 

今天用mybatis创建oracle触发器的时候出现了一点问题,创建触发器的代码如下 

Java代码  收藏代码
  1. <update id="createTrigger_A_oracle" parameterType="HashMap">  
  2. CREATE OR REPLACE TRIGGER ${triggerName}  
  3. AFTER INSERT ON ${tableName}  
  4. FOR EACH ROW  
  5. BEGIN  
  6.   INSERT INTO S_CDC(TABLENAME,MODETYPE,DATASYS,TIMESTAMP) VALUES  ('${tableName}''A', :NEW.SYSCODE, 'B');  
  7. END;  
  8. </update>  



创建的时候报错了:如下: 

Java代码  收藏代码
  1. ### Error updating database.  Cause: java.sql.SQLException: 索引中丢失  IN 或 OUT 参数:: 1  
  2. ### The error may involve com.unissoft.synch.initMapper.createTrigger_U_oracle-Inline  
  3. ### The error occurred while setting parameters  
  4. ### SQL: CREATE OR REPLACE TRIGGER D_PRJ2_0002CDCTger_U   AFTER UPDATE ON D_PRJ2_0002   FOR EACH ROW   BEGIN    INSERT INTO S_CDC(TABLENAME,MODETYPE,DATASYS,TIMESTAMP) VALUES ('D_PRJ2_0002''A',:NEW.SYSCODE, 'B');   END;  
  5. ### Cause: java.sql.SQLException: 索引中丢失  IN 或 OUT 参数:: 1  


但是创建mysql,sqlserver类似的触发器没有问题 

最后发现BEGIN 中插入值的时候用到了:new, 
因为这些是写到了xml文件里面,所以我觉得有可能是因为:影响的, 
有可能在解析xml文件的时候,:影响了解析,没有办法将:new写入sql语句 

但是暂时还没有解决办法(因为是刚涉及mybatis,所以不排除我的写法有问题) 

今天这个问题已经解决,解决的方法如下 

Java代码  收藏代码
  1. <update id="createTrigger_A_oracle" parameterType="HashMap"  statementType="STATEMENT">  
  2. CREATE OR REPLACE TRIGGER ${triggerName}  
  3. AFTER INSERT ON ${tableName}  
  4. FOR EACH ROW  
  5. BEGIN  
  6.   INSERT INTO S_CDC(TABLENAME,MODETYPE,DATASYS,TIMESTAMP) VALUES  ('${tableName}''A', :NEW.SYSCODE, 'B');  
  7. END;  
  8. </update>  



在原来写的基础上,添加上属性statementType="STATEMENT" ,因为mybatis statementType属性有三种值,(statement,preparedstatement,callablestatement。)默认的值是preparedstatement,预编译的。 

因此有可能在预编译的时候没有通过,报了错 

后来我查了一下这三者之间的区别: 

Statement 每次执行sql语句,数据库都要执行sql语句的编译 ,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement. 

PreparedStatement是预编译的,使用PreparedStatement有几个好处 

a. 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。 

b. 安全性好,有效防止Sql注入等问题。 

c.  对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;

d.  代码的可读性和可维护性。 

CallableStatement接口扩展 PreparedStatement,用来调用存储过程,它提供了对输出和输入/输出参数的支持。CallableStatement 接口还具有对 PreparedStatement 接口提供的输入参数的支持。

 

 

转自:http://javawangzilong.iteye.com/blog/2144317

分享到:
评论

相关推荐

    Mybatis+oracle

    将Mybatis与Oracle结合,可以创建高效、灵活的数据访问应用。下面将详细阐述如何在Java项目中使用Mybatis来连接和操作Oracle数据库。 1. **Mybatis简介**: Mybatis 是一个基于Java的持久层框架,它解决了Java对象...

    毕业设计校园闲置物品交易系统(springboot+mybatis+oracle).zip

    《毕业设计校园闲置物品交易系统:基于SpringBoot+MyBatis+Oracle的实现》 本毕业设计项目旨在构建一个高效、便捷的校园闲置物品交易平台,采用先进的Java Web开发框架SpringBoot,结合轻量级持久层框架MyBatis,...

    oracle-SpringBoot Oracle示例-Samples.zip

    它支持SQL标准,包括PL/SQL编程语言,用于创建存储过程、触发器等。 2. **SpringBoot框架**:SpringBoot简化了Spring的配置,提供了自动配置、内嵌式Web服务器(如Tomcat)、健康检查、Actuator监控等功能。开发者...

    Oracle主键自增的办法

    但是,Oracle 提供了序列(Sequences)和触发器(Triggers)机制,以实现类似的功能。以下是一个在 Oracle 中创建自增主键的详细步骤: 1. **创建序列**: Oracle 中的序列是一种可以生成唯一整数序列的对象。在这...

    MyBatis+Spring整合示例

    同时,为了实现主键自增,我们使用了Oracle数据库的序列(sequence)和触发器(trigger)机制。序列`pda2_user_sequence`用于生成主键值,触发器`id_auto_increment_triger`则在插入新记录时自动填充ID字段。 接着...

    国产化改造,如何将Oracle数据完整迁移到DM数据库。

    2. 确定需要移植的数据库对象,包括序列表、分区表、视图、物化视图、自定义类型、触发器、同义词、存储过程、函数、包等。 3. 统计Oracle数据库基础信息,包括数据库块大小、编码格式等。 4. 统计Oracle数据中的...

    xxl-job 2.2.0使用oracle数据库,替换resources/mybatis-mapper中的文件

    与MySQL等其他数据库相比,Oracle在数据类型、存储过程、触发器、分区表等方面有更丰富的功能。在使用Oracle时,我们需要确保XXL-JOB的相关SQL语句和数据结构与Oracle兼容。 在XXL-JOB 2.2.0中,mybatis-mapper文件...

    JavaEE+Oracle+SpringBoot+Mybatis+Maven开发的银行管理系统+源码+项目解析+文档+界面展示

    用到了Oracle数据库存储过程、触发器等功能。 系统利用 java 开发,使用 Spring Boot 框架、MyBatis 框架简化逻辑操作; 模板引擎使用 Thymeleaf; 前端同时使用 BootStrap 技术,借鉴已有的后台管理网站模板开发; ...

    mybatis 反向工程

    - **SQL Server**:SQL Server 有自己的存储过程、触发器等,反向工程时可以生成对应的 CRUD 方法。 - **MySQL**:MySQL 的特点是轻量级和快速,但不支持分区表。在反向工程中,可以简化一些处理逻辑。 在实际开发...

    基于spring+mybatis的quartz应用

    本文将深入探讨如何在Spring和MyBatis环境中集成Quartz,并支持MySQL和Oracle等多种数据库。 首先,Quartz的核心概念包括Job(任务)、Trigger(触发器)和Scheduler(调度器)。Job定义了具体要执行的任务,...

    基于SSM(SpringMVC+Spring+MyBatis)实现的教务、学生、培训班CRM

    数据库文件(.sql)是Oracle数据库的脚本,包含了教务、学生、培训班等相关表的创建语句、初始数据及可能的存储过程和触发器。Oracle是企业级的关系型数据库管理系统,以其稳定性、性能和丰富的特性被广泛使用。在这...

    oracle里建一个自增字段示例

    在Oracle数据库中,自增字段通常通过序列(Sequence)和触发器(Trigger)来实现。本篇文章将详细解释如何创建一个自增字段,并通过具体的步骤和代码示例来进行说明。 #### 序列(Sequence) 序列是一种数据库对象...

    汽车项目mybatis

    在Oracle等数据库中,可以创建序列对象,每次调用时返回一个递增的值。触发器则是一种数据库级别的事件监听机制,当特定的DML(数据操纵语言)操作如INSERT、UPDATE或DELETE发生时,触发器可以自动执行额外的逻辑。...

    Oracle_DBA_java.rar_oracle_oracle 笔记

    - ORM框架:如Hibernate、MyBatis等,将Java对象映射到Oracle数据库表,简化数据库操作。 4. **Java在Oracle中的应用** - Java Stored Procedures:在数据库中编写和执行Java代码,提供数据库内计算和处理能力。 ...

    java实现增删改查使用Oracle数据库

    Oracle数据库提供了一些特有的函数和特性,例如游标、存储过程、触发器等。在Java中,可以调用CallableStatement来执行存储过程。 八、最佳实践 1. 使用PreparedStatement而非Statement,提高性能和安全性。 2. ...

    Ibatis+Oracle(含对应数据库sql) 源码

    在实践中,你可以期待找到如何创建Oracle数据库表的SQL脚本,如何配置Ibatis以连接Oracle,如何编写和执行SQL语句,以及如何在Java代码中调用这些操作的示例。 总的来说,这个资源将帮助学习者理解以下几个关键知识...

    SSH框架实现增删改查,Oracle数据库

    Oracle支持多种高级特性,如存储过程、触发器和分区等,可以提高数据处理的效率和安全性。 5. **CRUD操作**: - **Create**(创建):在添加数据时,我们首先需要在业务层(Service)创建一个新的实体对象,填充...

    环境搭建spring

    此外,还需要理解Oracle的数据类型、存储过程、触发器等特性,以便进行高效的数据操作。 在环境搭建过程中,以下是几个关键步骤: 1. **安装与配置**: 首先,确保JDK、Oracle数据库和相关的驱动(ojdbc.jar)已...

    oracle_spring

    此外,Spring Data JPA或MyBatis等ORM(对象关系映射)工具也可以与Oracle数据库协同工作,将数据库操作转换为面向对象的API,提高开发效率。 在实际应用中,Spring的DataSourceTransactionManager可以用来管理事务...

Global site tag (gtag.js) - Google Analytics