关闭

Sql Server的存储过程与Java代码相连接调用(二)

标签: SQL Server存储过程Java表值类型临时表
36人阅读 评论(0) 收藏 举报
分类:

               

        我所写的项目是使用Maven开发,在pom.xml中添加如下必要依赖:
        添加com.microsoft.sqlserver的mssql-jdbc 6.2.1.jre8的依赖

<dependency>  
    <groupId>com.microsoft.sqlserver</groupId>  
    <artifactId>mssql-jdbc</artifactId>  
    <version>6.2.1.jre8</version>  
</dependency> 

        

        在下面的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<Integer>() {
					@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<Student> 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<Student> getStuList() {
		return stuList;
	}

	public void setStuList(List<Student> 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
        }
    ]
}






0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:99490次
    • 积分:2131
    • 等级:
    • 排名:千里之外
    • 原创:59篇
    • 转载:175篇
    • 译文:0篇
    • 评论:73条
    最新评论