java调用存储过程 sql server,Sql Server的存储过程与Java代码相连接调用(二)
我所写的项目是使用Maven开发,在pom.xml中添加如下必要依赖:
添加com.microsoft.sqlserver的mssql-jdbc 6.2.1.jre8的依赖
com.microsoft.sqlserver
mssql-jdbc
6.2.1.jre8
在下面的Java代码块中,涉及到如何在Java中创建SQL Server的“表值变量”(临时表),以及Java代码如何去调用SQL Server的存储过程,如何传递在Java代码中所写的“表值变量”(临时表)。其中,代码中所调用的 proc_test01存储过程,可参考我写的博客:SQL
Server数据库学习之 -- 存储过程-游标-表值类型综合运用
我所写的代码有些简化,以“学生 -- 班级 -- 教师”这种经典模式来讲解自己所运用的知识点。可能网友直接将我的代码粘贴-复制,运行会报错。不过其中的知识点确是无误的!
在本篇文章中,最重要的是其运用到SQL Server表值类型变量这块知识。关于在Java代码中引入的Sql Server-Jar包,不能太低,否则无法使用“表值类型变量”这块知识。
import java.util.Map;
import com.microsoft.sqlserver.jdbc.SQLServerCallableStatement;
import com.microsoft.sqlserver.jdbc.SQLServerDataTable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.CallableStatementCreator;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class ClazzService {
/**
* 批量提交班级信息
*/
public int putClazz(Clazz clazz) throws SQLException {
Integer count = 0;
Integer testCount = sqlServerJdbcTemplate.execute(
new CallableStatementCreator() {
@Override
public CallableStatement createCallableStatement(Connection con) throws SQLException {
SQLServerCallableStatement cs = (SQLServerCallableStatement) con.prepareCall("exec proc_test01 ?, ?");
// 设置存储过程中所用的临时表名
SQLServerDataTable sourceDataTable = new SQLServerDataTable();
// 为临时表sourceDataTable添加表头字段和字段类型
sourceDataTable.addColumnMetadata("TEACHER", java.sql.Types.VARCHAR);
sourceDataTable.addColumnMetadata("CLANO", java.sql.Types.VARCHAR);
sourceDataTable.addColumnMetadata("SEX", java.sql.Types.CHAR);
sourceDataTable.addColumnMetadata("NAME", java.sql.Types.VARCHAR);
sourceDataTable.addColumnMetadata("AGE", java.sql.Types.INTEGER);
sourceDataTable.addColumnMetadata("STUNO", java.sql.Types.INTEGER);
// 可一次性将多个不同学生插入到同一个班级中
for (Student student : clazz.getStudent()) {
// 将数据添加进创建的Table表中
sourceDataTable.addRow(clazz.getTeacher(), clazz.getClaNo(),
student.getSex(), student.getName(),
student.getAge(), student.getStuNo());
}
// 字符串"clazz_Table"为调用数据库存储过程“proc_test01”中,其内部编写的临时表名称
cs.setStructured(1, "clazz_Table", sourceDataTable);
cs.registerOutParameter(2, java.sql.Types.INTEGER); // 可返回值的参数
return cs;
}
},
new CallableStatementCallback() {
@Override
public Integer doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
cs.execute();
return cs.getInt(2); // 将第“2”个参数的值返回。第“2”个参数,其类型是“返回值类型参数”
}
}
);
count = testCount; // 将testCount变量赋值给count变量
return count;
} // public int putClazz(Clazz clazz)
}
Student.java类(学生类),其代码如下
package com.entity;
public class Student {
private char sex; // 性别
private String name; // 姓名
private int age; // 年龄
private int stuNo; // 学号
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
}
Clazz.java类(班级类)
package com.entity;
import java.util.List;
public class Clazz {
private String teacher; // 班主任
private String claNo; // 班级编号
private ListstuList; //学生
public String getTeacher() {
return teacher;
}
public void setTeacher(String teacher) {
this.teacher = teacher;
}
public String getClaNo() {
return claNo;
}
public void setClaNo(String claNo) {
this.claNo = claNo;
}
public ListgetStuList() {
return stuList;
}
public void setStuList(ListstuList) {
this.stuList = stuList;
}
}
--------------------------------------------------------------------------
--------------------------------------------------------------------------
例如,写一接口,调用putClazz()函数,则可传递一组JSON数据,其数据格式如下所示。通过调用putClazz()函数,可以做到在一次提交数据过程中:一个班级可以插入多个学生信息。
JSON格式代码:
{
"teacher": "吴老师",
"clano": "打杂1班",
"stuList": [
{
"sex": "男",
"name": "吃瓜群众",
"age": 18,
"stuNo": 101001
},
{
"sex": "女",
"name": "如花",
"age": 16,
"stuNo": 101002
},
{
"sex": "女",
"name": "龅牙珍",
"age": 20,
"stuNo": 101001
}
]
}
java调用存储过程 sql server,Sql Server的存储过程与Java代码相连接调用(二)相关推荐
- python调用hive与java调用区别_python3.6.5基于kerberos认证的hive和hdfs连接调用方式
1. Kerberos是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证.具体请查阅官网 2. 需要安装的包(基于centos) yum install libsasl2 ...
- qt调用mysql调用了存储过_Qt调用Server SQL中的存储过程
Server SQL中的存储过程如下: CREATE procedure PINSERTPC @pcnum int, @pcname varchar(50), @pctype int, @ipaddr ...
- java指定sql生成xml_SQL Server根据查询结果,生成XML文件
/* 'bcp' 不是内部或外部命令,也不是可运行的程序? 看看在C:\Program Files\Microsoft SQL Server\80\Tools\Binn里面有没有bcp.exe这个文件 ...
- json 插入数据_Power BI数据回写SQL Server(2)——存储过程一步到位
在上一讲: Power BI数据回写SQL Server(1)没有中间商赚差价 中, 我们讲过,利用循环的方式将PQ中得到的table表逐行导入SQL Server中,有的朋友怀疑这种方式会不会造成数 ...
- JDBC编程可能遇到的错误:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or ..
文章目录 1.错误提示: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 2.提示:Loading class com.mysql.jd ...
- java代码转置sql数据_SQL Server中的数据科学:数据分析和转换–使用SQL透视和转置
java代码转置sql数据 In data science, understanding and preparing data is critical, such as the use of the ...
- SQL Server中的部分存储过程
介绍 (Introduction) SQL is an old language - almost 50 years! The first commercially-available version ...
- java sql 查询中的转义序列不对_在 JDBC 中使用 SQL 转义序列 - SQL Server | Microsoft Docs...
使用 SQL 转义序列Using SQL escape sequences 08/12/2019 本文内容 按照 JDBC API 的定义,Microsoft JDBC Driver for SQL ...
- java sql 写入 float_SQL Server的小数数值类型(float 和 decimal)用法
在SQL Server中,实际上小数数值只有两种数据类型:float 和 decimal,分别是近似数值和精确数值.其他小数类型,都可以使用float和decimal来替代,例如,双精度(double ...
- SQL Server中视图,存储过程,注入
文章目录 一.视图 1.视图的概念 (1)视图的数据 (2)表视图的多样性 (3)视图的用途 2.视图的使用 1>视图的创建 (1)使用图文创建视图 (2)使用T-SQL创建视图 2> 删 ...
最新文章
- assert self.binded
- java线程池队列场景,Java面试题汇总
- SAP S/4HANA extensibility扩展原理介绍
- 聊聊如何构建一支自驱团队(二)
- 第九章——计数器/定时器和多功能接口芯片
- rest-framework框架的基本组件
- .NET微信扫码支付模式二API接口开发测试
- ati 缺少关键性文件_ATI显卡优化
- 嵌入式Linux系统工程师系列之ARM920T的MMU与Cache
- 鸿蒙版瑞幸咖啡开发日记(六)详情页与首页联动
- 分享几款C/C++在线编译器
- 一次微信公众号分享功能总结
- TensorFlow高阶张量叉乘
- win10打开蓝牙,蓝牙开关消失,蓝牙和其他设备设置,蓝牙开关不见了
- input输入框的原生事件
- 成为“黑客”前,必须学习的“计算机网络通信原理”
- Python-冒泡排序法
- x2检验(chi-square test)/ 卡方检验
- android 闹钟不响,为什么我写的Android闹钟到时间时却不会响
- 【收藏】2010年Ei收录的中国期刊
热门文章
- delphi盒子希腊打开潘多拉魔盒?债务重组或是唯一出
- Linear-gradient()
- 径向渐变加阴影html,CSS3 径向渐变(radial-gradient)
- 【转】IOS开发小技巧
- B站李沐讲论文笔记Transformer
- pygame编写飞机大战(9)-播放爆炸动画
- Windows 7 64位版本的内存错误导致蓝屏死机(Blue Screen to Death)
- 【论文导读】Continuity Scaling: A Rigorous Framework for Detecting andQuantifying Causality Accurately
- 出租车收费管理系统(MyEclipse+Java)
- php压力比例混合器图片,教你认识各种泡沫比例混合器