触发器和存储过程是为了提高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调用的更多相关文章

  1. JDBC对MySQL数据库存储过程的调用

    一.MySQL数据库存储过程: 1.什么是存储过程 存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完成特定功能而编写的一组的SQL语句集.存储过程经编译存储在数据库中,用 ...

  2. mysql创建存储过程及调用

    创建存储过程简单示例: DELIMITER //CREATE PROCEDURE ccgc()BEGINSELECT * FROM TEXT;SELECT * FROM s_user;END//DEL ...

  3. Oracle存储过程java 调用

    1.nest表组合成结果集,然后以游标变量的形式返回 --创建类型 create or replace package mytest is -- Author  : ADMINISTRATOR  -- ...

  4. Java调用MySQL存储过程

    Java调用MySQL的存储过程,需要用JDBC连接,环境eclipse 首先查看MySQL中的数据库的存储过程,接着编写代码调用 mysql> show procedure status; + ...

  5. Mysql 视图 游标 触发器 存储过程 事务

    Mysql 视图 触发器 存储过程 游标 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中 ...

  6. iBatis调用存储过程以及MySQL创建存储过程

    首先是MySQL中创建存储过程的SQL -- 列出全部的存储过程 SHOW PROCEDURE STATUS; -- 查看一个已存在的存储过程的创建语句,假设此存储过程不存在,会提示SQL错误(130 ...

  7. MySQL笔记 存储过程 游标 触发器

    第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就 ...

  8. 关于mysql触发器和存储过程的理解

    内容源自:一篇很棒的 MySQL 触发器学习教程 一.触发器概念 触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊 ...

  9. Mysql存储过程及调用

     存储过程: 存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量.有条件执行以及其它强大的 ...

随机推荐

  1. 【藏】使用Entity Framework时要注意的一些性能问题

    这篇文章写的很好: http://diaosbook.com/Post/2012/12/9/performance-issue-in-select-one-or-few-colums-via-enti ...

  2. Power Network - poj 1459 (最大流 Edmonds-Karp算法)

      Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 24788   Accepted: 12922 Description A ...

  3. 在 RHEL/CentOS 7 上配置NTP时间服务器

    一.NTP简介 网络时间协议 - NTP - 是运行在传输层 123 号端口的 UDP 协议,它允许计算机通过网络同步准确时间.随着时间的流逝,计算机内部时间会出现漂移,这会导致时间不一致问题,尤其是 ...

  4. ASP.NET管道技术

    Asp.net mvc是基于dnf(.net framework )实现了代码分离的开源框架.ASP.NET MVC框架拥有极强的定制以及扩展的特性.本文梳理了ASP.NET MVC的管道(pipel ...

  5. WPF绑定Binding及模式

    绑定,就是把一个对象属性的值绑定在别的对象的属性上 1. 默认绑定 public class Company { public string Name { get; set; } } XAML代码 1 ...

  6. (转)Unity3D集成SVN进行版本控制

    首先,AssetServer确实很好用,Unity内部集成的管理界面,操作很简单,提交冲突的后还可以进行文件比对.但学习使用过程中,发现文件体积较大的项目文件目录(600M),我提交不上去,会返回没有 ...

  7. 操作XML-dom4j

    首先是到dom4j的官网dom4j文件包,下载之后解压如下所示. 在根目录中,找到dom4j-1.6.1jar包,加入到eclipse中的lib文件下,最后build path一下,即可使用相关的方法 ...

  8. 第二章----python基础

    概要:python是一种计算机编程语言,有自己的一套语法,编译器或者解释器负责把符合语法的程序代码翻译成CPU能识别的机器码,然后执行.python使用缩进来组织代码块,Python程序中大小写是敏感 ...

  9. 【BZOJ5055】膜法师 树状数组

    [BZOJ5055]膜法师 Description 题目描述 在给定的维度序列a中, 求出所有满足i<j<k且ai<aj<ak的ai*aj*ak的和 即 ∑ (a_i*a_j* ...

  10. Maven + Jetty 部署锁文件解决办法

    用Maven + Jetty 在Eclipse环境启动后,改静态文件的时候出现如下提示 就表示文件被锁住了. 解决办法如下: <plugin> <groupId>org.ecl ...