一、存储过程

创建

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. BZOJ4205卡牌配对——最大流+建图优化

    题目描述 现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C.把卡牌分为X,Y两类,分别有n1,n2张. 两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值互质,且两张卡牌类别不 ...

  2. flask之三方组件

    Flask-session Flask-session跟框架自带的session有什么区别呢 框架自带的session是通过请求上下文~放入到Local中的~那如果我们想把session放入别的地方怎 ...

  3. 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序

    题目大意 ​ Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...

  4. Wannafly挑战赛 22

    爆零祭 T1 这题第一反应gcd啊 所以就把每个a[i]对m取模 然后求它们的gcd 即res = gcd(a[1] % m, a[2] % m, ... , a[n] % m) ans = 1 + ...

  5. windows 路由转发

    netsh interface ipv6 install 将内网的2433端口转发到外网的11111端口netsh interface portproxy add v4tov4 listenaddre ...

  6. 使用 windows server 2012 性能监视器

    监控Windows server的内存.CPU.磁盘IO等性能 配置方法: 打开Aministrator Tools --> Performance Monitor Performances - ...

  7. 洛谷P1829 [国家集训队]Crash的数字表格

    题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时整除a和b的最小正整数.例如,LCM(6, ...

  8. Mybatis Generator的model生成中文注释,支持oracle和mysql(通过修改源码的方式来实现)

    在看本篇之前,最好先看一下上一篇通过实现CommentGenerator接口的方法来实现中文注释的例子,因为很多操作和上一篇基本是一致的,所以本篇可能不那么详细. 首先说一下上篇通过实现Comment ...

  9. 【转】C++ const 关键字总结

    const是一个C++语言的限定符,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性.另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一 ...

  10. centos7/RHEL7下快速搭建DNS域名解析服务器

    应用场境:此处搭建的DNS(Domain Name Server)更加偏向于企业内部需要一个域名服务器专门用来解析自己局域网内定义的域名: 比如:app1.company.com, app2.comp ...