我所写的项目是使用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代码相连接调用(二)相关推荐

  1. python调用hive与java调用区别_python3.6.5基于kerberos认证的hive和hdfs连接调用方式

    1. Kerberos是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证.具体请查阅官网 2. 需要安装的包(基于centos) yum install libsasl2 ...

  2. qt调用mysql调用了存储过_Qt调用Server SQL中的存储过程

    Server SQL中的存储过程如下: CREATE procedure PINSERTPC @pcnum int, @pcname varchar(50), @pctype int, @ipaddr ...

  3. java指定sql生成xml_SQL Server根据查询结果,生成XML文件

    /* 'bcp' 不是内部或外部命令,也不是可运行的程序? 看看在C:\Program Files\Microsoft SQL Server\80\Tools\Binn里面有没有bcp.exe这个文件 ...

  4. json 插入数据_Power BI数据回写SQL Server(2)——存储过程一步到位

    在上一讲: Power BI数据回写SQL Server(1)没有中间商赚差价 中, 我们讲过,利用循环的方式将PQ中得到的table表逐行导入SQL Server中,有的朋友怀疑这种方式会不会造成数 ...

  5. 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 ...

  6. java代码转置sql数据_SQL Server中的数据科学:数据分析和转换–使用SQL透视和转置

    java代码转置sql数据 In data science, understanding and preparing data is critical, such as the use of the ...

  7. SQL Server中的部分存储过程

    介绍 (Introduction) SQL is an old language - almost 50 years! The first commercially-available version ...

  8. java sql 查询中的转义序列不对_在 JDBC 中使用 SQL 转义序列 - SQL Server | Microsoft Docs...

    使用 SQL 转义序列Using SQL escape sequences 08/12/2019 本文内容 按照 JDBC API 的定义,Microsoft JDBC Driver for SQL ...

  9. java sql 写入 float_SQL Server的小数数值类型(float 和 decimal)用法

    在SQL Server中,实际上小数数值只有两种数据类型:float 和 decimal,分别是近似数值和精确数值.其他小数类型,都可以使用float和decimal来替代,例如,双精度(double ...

  10. SQL Server中视图,存储过程,注入

    文章目录 一.视图 1.视图的概念 (1)视图的数据 (2)表视图的多样性 (3)视图的用途 2.视图的使用 1>视图的创建 (1)使用图文创建视图 (2)使用T-SQL创建视图 2> 删 ...

最新文章

  1. assert self.binded
  2. java线程池队列场景,Java面试题汇总
  3. SAP S/4HANA extensibility扩展原理介绍
  4. 聊聊如何构建一支自驱团队(二)
  5. 第九章——计数器/定时器和多功能接口芯片
  6. rest-framework框架的基本组件
  7. .NET微信扫码支付模式二API接口开发测试
  8. ati 缺少关键性文件_ATI显卡优化
  9. 嵌入式Linux系统工程师系列之ARM920T的MMU与Cache
  10. 鸿蒙版瑞幸咖啡开发日记(六)详情页与首页联动
  11. 分享几款C/C++在线编译器
  12. 一次微信公众号分享功能总结
  13. TensorFlow高阶张量叉乘
  14. win10打开蓝牙,蓝牙开关消失,蓝牙和其他设备设置,蓝牙开关不见了
  15. input输入框的原生事件
  16. 成为“黑客”前,必须学习的“计算机网络通信原理”
  17. Python-冒泡排序法
  18. x2检验(chi-square test)/ 卡方检验
  19. android 闹钟不响,为什么我写的Android闹钟到时间时却不会响
  20. 【收藏】2010年Ei收录的中国期刊

热门文章

  1. delphi盒子希腊打开潘多拉魔盒?债务重组或是唯一出
  2. Linear-gradient()
  3. 径向渐变加阴影html,CSS3 径向渐变(radial-gradient)
  4. 【转】IOS开发小技巧
  5. B站李沐讲论文笔记Transformer
  6. pygame编写飞机大战(9)-播放爆炸动画
  7. Windows 7 64位版本的内存错误导致蓝屏死机(Blue Screen to Death)
  8. 【论文导读】Continuity Scaling: A Rigorous Framework for Detecting andQuantifying Causality Accurately
  9. 出租车收费管理系统(MyEclipse+Java)
  10. php压力比例混合器图片,教你认识各种泡沫比例混合器