一、存储过程

创建

CREATE DEFINER=CURRENT_USER PROCEDURE `adder`(IN a int, IN b int, OUT sum int)
BEGIN
DECLARE c int; if a is null
then set a = 0;
end if; if b is null
then set b = 0;
end if; set sum = a + b;
END

代码方式

import com.alibaba.druid.pool.DruidDataSource;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import java.sql.*; public class StoredProcedureTest { private Connection conn;
private Statement statement;
private CallableStatement callableStatement;
private PreparedStatement preparedStatement;
private ResultSet resultSet; @BeforeEach
public void testDruid() throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://192.168.8.136:3306/jdbc");
dataSource.setUsername("root");
dataSource.setPassword("root"); conn = dataSource.getConnection();
} @AfterEach
public void end() throws Exception {
if (resultSet != null) {
resultSet.close();
}
if (preparedStatement != null) {
preparedStatement.close();
}
if (callableStatement != null) {
callableStatement.close();
}
if (statement != null) {
statement.close();
}
if (conn != null) {
conn.close();
}
} @Test
public void createProcedureAdder() throws SQLException {
String queryDrop = "DROP PROCEDURE IF EXISTS adderP";
String createProcedure = "CREATE DEFINER=`root`@`%` PROCEDURE `adderP`(IN a int, IN b int, OUT sum int)\n" +
"BEGIN\n" +
"\tDECLARE c int;\n" +
"\tif a is null then set a = 0;\n" +
"\tend if;\n" +
"\tif b is null then set b = 0;\n" +
"\tend if;\n" +
"\tset sum = a + b;\n" +
"END";
try {
statement = conn.createStatement();
statement.execute(queryDrop);
statement.executeUpdate(createProcedure);
} catch (SQLException e) {
e.printStackTrace();
}
}
}

调用

@Test
public void runStoredProcedures() {
try {
callableStatement = conn.prepareCall("{call adderP(?, ?, ?)}");
// 输入
callableStatement.setInt(1, 5);
callableStatement.setInt(2, 5);
// 输出
callableStatement.registerOutParameter(3, Types.INTEGER);
callableStatement.executeQuery(); // 获取结果
Integer result = callableStatement.getInt(3); System.out.println(result);
} catch (SQLException e) {
e.printStackTrace();
}
}

二、自定义函数

创建

CREATE DEFINER=`root`@`%` FUNCTION `adder`(`a` int,`b` int) RETURNS int(10)
BEGIN
-- 变量定义需在函数开头
DECLARE sum int UNSIGNED DEFAULT 0; if a is null then
set a = 0;
end if; if b is null then
set b = 0;
end if; set sum = a + b;
RETURN sum;
END

代码方式

@Test
public void createFunctionAdder() throws SQLException {
String queryDrop = "DROP FUNCTION IF EXISTS adderF";
String createProcedure = "CREATE DEFINER=CURRENT_USER FUNCTION `adderF`(`a` int,`b` int) RETURNS int(10)\n" +
"BEGIN\n" +
"-- \t变量定义需在函数开头\n" +
"\tDECLARE sum int UNSIGNED DEFAULT 0;\n" +
"\tif a is null then\n" +
"\t\tset a = 0;\n" +
"\tend if;\n" +
"\tif b is null then\n" +
"\t\tset b = 0;\n" +
"\tend if;\n" +
"\tset sum = a + b;\n" +
"\tRETURN sum;\n" +
"END";
try {
statement = conn.createStatement();
statement.execute(queryDrop);
statement.executeUpdate(createProcedure);
} catch (SQLException e) {
e.printStackTrace();
}
}

调用

@Test
public void runFunctions() {
try {
preparedStatement = conn.prepareStatement("SELECT adderF(?, ?)");
// 输入参数
preparedStatement.setInt(1, 5);
preparedStatement.setInt(2, 5);
// 输出
preparedStatement.executeQuery(); // 获取结果
resultSet = preparedStatement.getResultSet();
if (resultSet.next()) {
System.out.println(resultSet.getInt(1));
}
} catch (SQLException e) {
e.printStackTrace();
}
}


官方文档

https://www.cnblogs.com/lz2017/p/7500411.html

15、JDBC-CallableStatement的更多相关文章

  1. 15、Jdbc的优化(BeanUtils组件)

    Jdbc的优化! BeanUtils组件 自定义一个持久层的框架 DbUtils组件 案例优化 1. BeanUtils组件 1.1    简介 程序中对javabean的操作很频繁, 所以apach ...

  2. 40、JDBC相关概念介绍

    1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡,同样道理,我们安装好数据 ...

  3. mybatis基本流程、jdbc连接、ps:附mybatis(乐观锁)实现

    一.前言 Mybatis和Hibernate一样,是一个优秀的持久层框架.已经说过很多次了,原生的jdbc操作存在大量的重复性代码(如注册驱动,创建连接,创建statement,结果集检测等).框架的 ...

  4. 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

    1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...

  5. java语言体系的技术简介之JSP、Servlet、JDBC、JavaBean(Application)

    转自:https://zhangkunnan.iteye.com/blog/2040462 前言 Java语言 Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.Servlet. ...

  6. ABP(现代ASP.NET样板开发框架)系列之15、ABP应用层——应用服务(Application services)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之15.ABP应用层——应用服务(Application services) ABP是“ASP.NET Boiler ...

  7. 十五、JDBC操作数据库

    1.数据库特点 实现数据共享.减少数据的冗余度.数据的独立性.数据集中控制.数据的一致性和可维护性. 2.数据库种类和功能 (1)层次型数据库:类似于树结构,是一组通过链接而互相联系在一起的记录. ( ...

  8. Spring总结——AOP、JDBC和事务的总结

    1.上一次总结了 Spring 的核心三大组件(Core,Beans,Context),今天总结的 AOP.JDBC和事务都可以看成是核心三大组件的应用. 其中 Spring 的事务管理又以 AOP ...

  9. 15、TCP/IP协议

    15.TCP/IP协议       几台孤立计算机系统组在一起形成网络,几个孤立网络连在一起形成一个网络的网络,即互连网.一个互连网就是一组通过相同协议族互连在一起的网络. 互联网的目的之一是在应用程 ...

  10. 输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。

    输入一个正数n,输出所有和为n连续正数序列.例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5.4-6和7-8. #define N 15 void findS ...

随机推荐

  1. P1055 书号

    P1055 题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字.11位识别码和33位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号 ...

  2. springboot 简单搭建

    springboot的入门请参考:https://blog.csdn.net/hanjun0612/article/details/81538449 这里就简单看下搭建: 一,看一下项目结构: 创建一 ...

  3. C# 两个类是否继承关系

    IsAssignableFrom:确定指定类型的实例是否可以分配给当前类型的实例 B继承自A static void Main(string[] args) { Type a = typeof(A); ...

  4. 查询SQL执行情况

    /* 查询SQL执行情况 包含逻辑读取信息,执行信息等情况*/ SELECT creation_time N'语句编译时间' ,last_execution_time N'上次执行时间' ,total ...

  5. 戴尔服务器H330阵列卡取消磁盘阵列教程

    一:服务器开机看到ctrl+R提示,按ctrl+r进入阵列卡配置界面 二:按ctrl+N 转到PD Mgmt查看硬盘信息,确认硬盘状态:Ready 三:光标移到需配置硬盘上,按F2,选择 conver ...

  6. [NOIP2017] 逛公园 【最短路】【强连通分量】

    题目分析: 首先考虑无数条的情况.出现这种情况一定是一条合法路径经过了$ 0 $环中的点.那么预先判出$ 0 $环中的点和其与$ 1 $和$ n $的距离.加起来若离最短路径不超过$ k $则输出$ ...

  7. yoj维护

    维护 启动容器 docker start yoj 暂停容器 docker stop yoj 重启容器 docker restart yoj 进入容器的终端 docker attach yok 保存容器 ...

  8. 【XSY1552】自动机 构造

    题目大意 给你一个自动机,包含\(n\)个状态,指令集为前\(m\)个小写字母,对于每个状态\(s\)和每个指令\(i\),自动机均有后继\(T(s,i)\).请你求出一个长度不超过\(2^{20}\ ...

  9. zabbix 监控 WEB 应用性能

    1.介绍使用 zabbix_sender 发送采集的 WEB 状态值,使用 pycurl 来采集 WEB 状态zabbix_sender发送数据,需保证主机名与zabbix server记录的主机名一 ...

  10. linux开发板出现Read-only file system的解决办法

    @2018-11-29 创建文件夹出现如下提示 mkdir: can't create directory 'test': Read-only file system 使用命令 mount rw -o ...