一、存储过程

创建

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. Dirichlet's Theorem on Arithmetic Progressions POJ - 3006 线性欧拉筛

    题意 给出a d n    给出数列 a,a+d,a+2d,a+3d......a+kd 问第n个数是几 保证答案不溢出 直接线性筛模拟即可 #include<cstdio> #inclu ...

  2. Subway POJ - 2502 最短路

    题意:给出地铁线  起点和 终点  坐地铁速度为v2  走路为v1 求起点到终点的最短距离  (答案需要四舍五入这里坑了好久) 拿给出的地铁站点 和起点终点建边即可  然后跑个迪杰斯特拉 #inclu ...

  3. ☆ [NOIp2016] 天天爱跑步 「树上差分」

    题目类型:LCA+思维 传送门:>Here< 题意:给出一棵树,有\(M\)个人在这棵树上跑步.每个人都从自己的起点\(s[i]\)跑到终点\(t[i]\),跑过一条边的时间为1秒.现在每 ...

  4. 【BZOJ1580】【USACO2009Hol】杀手游戏 计算几何

    题目描述 一个平面上有很多个点在运动.给你每个点的初始坐标和每个点的速度,求出最多有多少个点到\(0\)号店的距离同时不超过\(r\). \(n\leq 50000\) 题解 我们先把\(0\)号点平 ...

  5. Tomcat和Weblogic部署纯html文件

    1.首先纯html文件,得有一个入口 index.html 2.Tomcat是不需要指定web.xml的,因为即使你的文件里没有web.xml,也会读取conf 目录下的web.xml,在这个文件里边 ...

  6. Xadmin 组件基础使用以及全局配置

    xadmin 的安装 方式一 pip 安装 会因为编码问题导致报错 因此需要下载 更改 README.rst 后本地安装 详情点击这里 方式二 源码方式安装 在 github 上下载源码后 将 xad ...

  7. python_getpass 模块的使用

    可以实现输入用户密码的时候隐藏输入显示.更加安全. 默认自带Password: 的提示 如果自己指定提示内容就用自己的替换默认 import getpass passwd = getpass.getp ...

  8. pax3 quick start guide

    pax3 quick start guide 外观图: 配置:1 * pax3 主机:2 * 吸嘴(一个平的,一个凸的):2 * 底盖(一个烟草的,一个烟膏的):3 * 过滤片:1 * USB充:1 ...

  9. 【HDU - 4348】To the moon(主席树在线区间更新)

    BUPT2017 wintertraining(15) #8G 题意 给一个数组a,有n个数,m次操作.\(N, M ≤ 10^5, |A i| ≤ 10^9, 1 ≤ l ≤ r ≤ N, |d| ...

  10. 使用rt-thread中BSP-stm32 ENV构建工具报错

    @2019-01-23 [小记] --路径问题 参照rtt官方<STM32 系列 BSP 制作教程> 构建项目时出现如下错误 error1:打开 menuconfig 出错 解决方法: 根 ...