java-调用数据库存储过程实现增删改查

首先需要建立一个存储过程
存在user表
表结构
插入一条信息做测试
在这里插入图片描述
设建立存储过程getUserNameAndSexById()用于根据id查询user表的name和sex 代码如下
可能会因为存在多条执行语句出现1064错误

Mysql解释器一遇到;号时就结束,回车以后就执行了。但是现在并不希望Mysql这么做,因为存储过程中可能包含很多分号的语句,所以怎么办了,很简单Mysql给我们提供了delimiter关键字,delimiter作用就是把;分号替换成指定的符号,比如//或 。 当 再 出 现 / / 或 。当再出现//或 //时,Mysql解释器才会执行命令。

在这里插入图片描述
解决方案再开始加上delimiter // 结尾加上//即可

完整代码:
在这里插入图片描述
通过sql可以查看你数据库的存储过程 代码show procedure status;

接下来就是使用Java语言调用存储过程实现增删改查了

直接上模板代码

首先这里采用调取DBConnection类连接数据库的方法 可以避免以后重复写连接代码实属一劳永逸

DBConnercion.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBConnection {
	private static final String driverName="com.mysql.jdbc.Driver";
	private static final String url="jdbc:mysql://localhost:3306/javaweb";
	private static final String user="root";
	private static final String password="123456";
	
	private DBConnection() {
	}static {
		try {
			Class.forName(driverName);
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	//get获取数据库连接信息
	public static Connection getConnection()throws SQLException{
		return DriverManager.getConnection(url,user,password);
	}
	
	//关闭数据库连接
	public static void close(ResultSet rs,Statement st,Connection conn) {
		try {
			if(rs!=null)
				rs.close();
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				if(st!=null)
					st.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}finally{
				try{
					if(conn!=null)
						conn.close();
				}catch(SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
}

Main.java

import java.sql.*;
public class Test {
	
	public static void main(String[] args) {
		getNAmeSex();
	}
	
	public static void getNAmeSex() {
		//三大连接基础
		Connection conn=null;
		CallableStatement cs=null;
		ResultSet rs=null;
		
		try {
			//调用DBConnection获取数据库连接信息
			conn=DBConnection.getConnection();
			//定义调用存储过程的sql语句
			String sql="{call getUserNameAndSexById(?,?,?)}";
			//获取CAllablestatement对象
			cs=conn.prepareCall(sql);
			//设置传入存储过程的参数
			cs.setInt(1, 1);//in的参数
			cs.registerOutParameter(2, Types.VARCHAR);//out参数
			cs.registerOutParameter(3, Types.VARCHAR);//out参数
			//执行存储过程
			cs.execute();
			//获得返回值 两种方式
			String name=cs.getString(2);//通过位置索引调用
			String sex=cs.getString("userSex");//通过名字
			System.out.print(name+"+"+sex);
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
}
 

注意!
这样下来的返回值只能有一条,如果你的sql语句返回多个记录,会产生SQL错误
在这里插入图片描述
需要在mysql设置临时表存储

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值