mysql 触发器 存储过程 java调用
触发器和存储过程是为了提高SQL的运行效率。
SQL语句先编译、后执行,而触发器与存储过程都会提前预编译完成,且只编译一次,供反复调用。
随着时代的进步,硬件与带宽的提升,触发器和存储过程提升效率并不明显,所以在传统或并发量低的项目中已经很少用到了。
1.触发器
简单的作用示意:用于增删改的时候,表关联的连贯操作(具体根据需求的表设计定义)。以前会有人说可以用来做日志统计,现实开发中,其实很少有人用库表做日志。
创建:
CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW exesql
注释:
trigger_name 触发器名称
trigger_time 触发时间,值:BEFORE、AFTER
trigger_event 触发事件,值:INSERT、DELETE、UPDATE
tb_name 表名称,触发器建立在哪个表的基础上
exesql 触发器条件满足时,执行的sql或函数
列子:
DELIMITER $$
drop trigger if exists ms.trigger_test;
create trigger ms.trigger_test after insert
on ms.master for each row
begin
INSERT INTO slave (s_id, s_content) VALUES (new.m_id,new.m_content);
end
$$
注:
DELIMITER $$ 定义结束符$$,意味SQL语句以$$结束,mysql默认;分号结束。
new表示记录更新后的值,更新前的值用old
该脚本不可以在视图工具Navicat或dbvisual里执行。
必须如图执行
2.存储过程
简单描述:存储过程是一个特定的SQL语句集,在数据库中只需编译一次,重复使用。一般项目不建议使用存储过程,维护麻烦。
优点:重复使用、减少网络流量、防止SQL注入(关键)
缺点:应用层程序员调试麻烦、可移植性低、可扩展性差
CREATE PROCEDURE PROCEDURE_NAME (PROCEDURE_MODE PARAM_NAME PARAM_TYPE) EXE_SQL
注释:
PROCEDURE_NAME 存储过程名字
PROCEDURE_MODE 存储过程类型,有IN、OUT、INOUT
PARAM_NAME 参数引用名称
PARAM_TYPE 参数类型(int、varchar、datetime等等)
EXE_SQL 执行sql语句
IN例子:
DELIMITER $$
DROP PROCEDURE IF EXISTS ms.in_procedure;
CREATE PROCEDURE ms.in_procedure(IN param int)
BEGIN
SELECT param;
SET param=3;
SELECT param;
END
$$ SET @param=1;
CALL ms.in_procedure(@param);
SELECT @param;
$$
注:
DELIMITER $$ 定义结束符$$,意味SQL语句以$$结束,mysql默认;分号结束。
该脚本不可以在视图工具Navicat或dbvisual里执行。
必须如图执行
OUT例子:
DELIMITER $$
DROP PROCEDURE IF EXISTS ms.out_procedure;
CREATE PROCEDURE ms.out_procedure(OUT param int)
BEGIN
SELECT param;
SET param=3;
SELECT param;
END
$$ SET @param=1;
CALL ms.out_procedure(@param);
SELECT @param;
$$
注:
DELIMITER $$ 定义结束符$$,意味SQL语句以$$结束,mysql默认;分号结束。
该脚本不可以在视图工具Navicat或dbvisual里执行。
必须如图执行
INOUT例子
DELIMITER $$
DROP PROCEDURE IF EXISTS ms.inout_procedure;
CREATE PROCEDURE ms.inout_procedure(INOUT param int)
BEGIN
SELECT param;
SET param=3;
SELECT param;
END
$$ SET @param=1;
CALL ms.inout_procedure(@param);
SELECT @param;
$$
注:
DELIMITER $$ 定义结束符$$,意味SQL语句以$$结束,mysql默认;分号结束。
该脚本不可以在视图工具Navicat或dbvisual里执行。
必须如图执行
3.java调用存储过程
package com.nginx.session.test; import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.CallableStatementCreator;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class)
@SpringBootTest
public class JDBCTest {
@Autowired
private JdbcTemplate jdbcTemplate; @Test
public void test(){
Integer value = jdbcTemplate.execute(new CallableStatementCreator() {
@Override
public CallableStatement createCallableStatement(Connection con) throws SQLException {
String storedProc = "{call ms.inout_procedure (?)}";
CallableStatement cs = con.prepareCall(storedProc);
cs.setInt(1,1);
return cs;
}
}, new CallableStatementCallback<Integer>() {
@Override
public Integer doInCallableStatement(CallableStatement cs) throws SQLException {
cs.execute();
return cs.getInt(1);
}
});
System.out.println(value);
}
}
mysql 触发器 存储过程 java调用的更多相关文章
- JDBC对MySQL数据库存储过程的调用
一.MySQL数据库存储过程: 1.什么是存储过程 存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完成特定功能而编写的一组的SQL语句集.存储过程经编译存储在数据库中,用 ...
- mysql创建存储过程及调用
创建存储过程简单示例: DELIMITER //CREATE PROCEDURE ccgc()BEGINSELECT * FROM TEXT;SELECT * FROM s_user;END//DEL ...
- Oracle存储过程java 调用
1.nest表组合成结果集,然后以游标变量的形式返回 --创建类型 create or replace package mytest is -- Author : ADMINISTRATOR -- ...
- Java调用MySQL存储过程
Java调用MySQL的存储过程,需要用JDBC连接,环境eclipse 首先查看MySQL中的数据库的存储过程,接着编写代码调用 mysql> show procedure status; + ...
- Mysql 视图 游标 触发器 存储过程 事务
Mysql 视图 触发器 存储过程 游标 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中 ...
- iBatis调用存储过程以及MySQL创建存储过程
首先是MySQL中创建存储过程的SQL -- 列出全部的存储过程 SHOW PROCEDURE STATUS; -- 查看一个已存在的存储过程的创建语句,假设此存储过程不存在,会提示SQL错误(130 ...
- MySQL笔记 存储过程 游标 触发器
第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就 ...
- 关于mysql触发器和存储过程的理解
内容源自:一篇很棒的 MySQL 触发器学习教程 一.触发器概念 触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊 ...
- Mysql存储过程及调用
存储过程: 存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量.有条件执行以及其它强大的 ...
随机推荐
- JAVA自定义注解 ------ Annotation
日常开发工作中,合理的使用注解,可以简化代码编写以及使代码结构更加简单,下面记录下,JAVA自定义注解的开发过程. 定义注解声明类. 编写注解处理器(主要起作用部分). 使用注解. 相关知识点介绍, ...
- Vsphere笔记07 Vcenter 部署流程 2
7.Vcenter 部署流程 2 Vcenter 安装需求 1.硬件要求 CPU:支持VT-X技术并开启内存:4G或4G 以上 2.系统要求 Windows 2008 R2 x64 Vsp ...
- Hibernate每个具体类一张表映射(使用注释)
在每个类创建一张表的情况下, 表中不使用Null值的列. 这种方法的缺点是在子类表中创建了重复的列. 在这里,我们需要在父类中使用@Inheritance(strategy = Inheritance ...
- java web 开发入门实例
学习是个技巧活,关键是要找到重点的地方,新手在这方面的坑尤其多.看别人的教程一步一步的跟着做,隔几步就遇到一个新知识点,忍不住就百度往深处了解,一晃半天就过去了. 有的知识点要深入学习的,有的是了解下 ...
- Hive查询错误:FAILED: RuntimeException Cannot make directory: hdfs://
解决方法,关闭hadoop安全模式: hadoop dfsadmin -safemode leave
- 在MathType中输入罗马数字的方法
MathType作为数学公式编辑器的编辑功能非常的强大,其中包含了许许多多各种各样的数学符号,甚至标记符号也很全面.编辑公式时有时为了让公式看起来会更有条理,会进行一定的序号设置,当然也可以对公式进行 ...
- VC++ 得到的函数地址与实际函数地址不一致的原因。
我想试验一个计算汇编指令长度的代码是否正确,因而写了如下code进行验证,但结果非常奇怪 #include <stdio.h> #include <Windows.h> int ...
- JavaScript 初步认识
首先呢 要成为WEB全栈工程师呢 JavaScript 是必须要会的 高级技术看自身兴趣爱好,但是基础必须掌握 因为有良好的基础学习jQuery会比较轻松. js是一门轻量的脚本语言 我学它主要目的是 ...
- 队列实现 (双向循环链表 C++)
队列是非常easy的.可是用数组实现可能更好点. . (事实上我认为数组在多个队列的时候更难) 然后我是第一次写双向循环链表.指向太乱了. 我这里是依照自己的想法.建立了一个头节点,一个尾节点,然后依 ...
- 持续集成 解决 Jenkins 中无法展示 HTML 样式的问题
对于测试报告来说,除了内容的简洁精炼,样式的美观也很重要.常用的做法是,采用HTML格式的文档,并搭配CSS和JS,实现自定义的样式和动画效果(例如展开.折叠等). 在Jenkins中要展示HTML文 ...