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 List stuList; //学生
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 List getStuList() {
return stuList;
}
public void setStuList(List stuList) {
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
}
]
}