15、JDBC-CallableStatement
一、存储过程
创建
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的更多相关文章
- 15、Jdbc的优化(BeanUtils组件)
Jdbc的优化! BeanUtils组件 自定义一个持久层的框架 DbUtils组件 案例优化 1. BeanUtils组件 1.1 简介 程序中对javabean的操作很频繁, 所以apach ...
- 40、JDBC相关概念介绍
1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡,同样道理,我们安装好数据 ...
- mybatis基本流程、jdbc连接、ps:附mybatis(乐观锁)实现
一.前言 Mybatis和Hibernate一样,是一个优秀的持久层框架.已经说过很多次了,原生的jdbc操作存在大量的重复性代码(如注册驱动,创建连接,创建statement,结果集检测等).框架的 ...
- 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\
1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...
- java语言体系的技术简介之JSP、Servlet、JDBC、JavaBean(Application)
转自:https://zhangkunnan.iteye.com/blog/2040462 前言 Java语言 Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.Servlet. ...
- ABP(现代ASP.NET样板开发框架)系列之15、ABP应用层——应用服务(Application services)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之15.ABP应用层——应用服务(Application services) ABP是“ASP.NET Boiler ...
- 十五、JDBC操作数据库
1.数据库特点 实现数据共享.减少数据的冗余度.数据的独立性.数据集中控制.数据的一致性和可维护性. 2.数据库种类和功能 (1)层次型数据库:类似于树结构,是一组通过链接而互相联系在一起的记录. ( ...
- Spring总结——AOP、JDBC和事务的总结
1.上一次总结了 Spring 的核心三大组件(Core,Beans,Context),今天总结的 AOP.JDBC和事务都可以看成是核心三大组件的应用. 其中 Spring 的事务管理又以 AOP ...
- 15、TCP/IP协议
15.TCP/IP协议 几台孤立计算机系统组在一起形成网络,几个孤立网络连在一起形成一个网络的网络,即互连网.一个互连网就是一组通过相同协议族互连在一起的网络. 互联网的目的之一是在应用程 ...
- 输入一个正数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 ...
随机推荐
- mysql GTID主从配置
主数据库配置 [mysqld] server_id=1 gtid_mode=on enforce_gtid_consistency=on skip_slave_start=1log_bin=maste ...
- 洛谷P1038神经网络题解
题目 这个题不得不说是一道大坑题,为什么这么说呢,这题目不仅难懂,还非常适合那种被生物奥赛刷下来而来到信息奥赛的学生. 因此我们先分析一下题目的坑点. 1: 题目的图分为输入层,输出层,以及中间层. ...
- python中可变参数和关键字参数总结
#_*_coding='utf-8' #可变参数 def person(name,age,*args): #定义了可变参数args print('传入的名字为:',name) print('传入的年龄 ...
- 【BZOJ5285】[HNOI2018]寻宝游戏(神仙题)
[BZOJ5285][HNOI2018]寻宝游戏(神仙题) 题面 BZOJ 洛谷 题解 既然是二进制按位的运算,显然按位考虑. 发现这样一个关系,如果是\(or\)的话,只要\(or\ 1\),那么无 ...
- Shell 流程控制-if 语句
单分支if条件语句 if [ 条件判断式 ] ; then程序fi 例子:判断分区使用率 #!/bin/bash # Author: huangrui (Email:mycheryhr@gmail.c ...
- 蓝桥杯 错误票据 (stringstream的使用)
题目链接:http://lx.lanqiao.cn/problem.page?gpid=T28 问题描述 某涉密单位下发了某种票据,并要在年终全部收回. 每张票据有唯一的ID号.全年所有票据的ID号是 ...
- Ubuntu16.04下的NetCore环境搭建(附录含Ubuntu 18.04 安装 NetCore2.1)
跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux VSCode安装:http://www.cnblogs.com/dunitia ...
- nio 阻塞 非阻塞 同步 异步
https://mp.weixin.qq.com/s/5SKgdkC0kaHN495psLd3Tg 说在前面 上篇NIO相关基础篇二,主要介绍了文件锁.以及比较关键的Selector,本篇继续NIO相 ...
- Docker自动补全容器名
Zsh Place the completion script in your /path/to/zsh/completion (typically ~/.zsh/completion/): 下载自动 ...
- Django 模板 继承和包含
##### 母版 ##### 这里是头部 {% block body-content %}{% endblock %} 这里是底部 #### 继承模板 ### {% extends 'layout.h ...