mysql概要(十五)存储过程(2)(java调用函数和存储过程)
使用存储过程的目的:
即将数据的函数处理放在数据库,这样主要是为了,多语言跨平台的使用(java,.net,php),不用重复的函数代码,直接调用存储过程。
(对于使用存储过程还是代码来处理数据的效率问题,这个应该是比较复杂的问题)
存储过程与自定义函数的区别:
存储过程实现过程要复杂些,而函数的针对性较强;
存储过程可以有多个返回值,而自定义函数只有一个返回值;
存储过程一般独立的来执行,而函数往往是作为其他SQL语句的一部分来使用;
存储过程存在的必要性(好处):
存储过程就是把经常使用的SQL语句或业务逻辑封装起来,预编译保存在数据库中,当需要的时候从数据库中直接调用,省去了编译的过程.
提高了运行速度;
同时降低网络数据传输量(传一堆SQL代码快,还是传一个存储过程名字和几个参数快)
---存储过程---
#修改mysql语句的结束符为//
(修改结束符的原因是存储过程中用到分号,作为语句的分隔符)
mysql > delimiter //
#定义一个过程,获取users表总记录数,将10设置到变量count中
(有点特别是,输入输出的都定义在括号中作为参数,in表示输入(下面参数:out表示输出标识,输出变量,类型)
create procedure simpleproc(out count int) begin select count(id) into count from users;(into 表示结果赋值给count) end //
#修改mysql语句的结束符为;
mysql > delimiter ;
#调用过程,将结果赋给变量a,@是定义变量的符号
call simpleproc(@a);
#显示变量a的值
select @a;
Java调用Mysql的过程
String sql = "{call simpleproc(?)}"; Connection conn = JdbcUtil.getConnection(); CallableStatement cstmt = conn.prepareCall(sql); cstmt.registerOutParameter(1,Types.INTEGER); cstmt.execute(); Integer count = cstmt.getInt(1); System.out.println("共有" + count + "人");
/** * 工具类 * @author AdminTC */ public class JdbcUtil { private static String driver = "com.mysql.jdbc.Driver"; private static String url = "jdbc:mysql://127.0.0.1:3306/js"; private static String user = "root"; private static String password = "root"; static{ try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws Exception{ return DriverManager.getConnection(url,user,password); } public static void close(Connection conn) throws Exception{ if(conn != null){ conn.close(); } } public static void close(Statement stmt) throws Exception{ if(stmt != null){ stmt.close(); } } public static void close(ResultSet rs) throws Exception{ if(rs != null){ rs.close(); } } }
/** * 演示Java调用Mysql的过程 * @author AdminTC */ public class TestJavaCallMysqlProc { public static void main(String[] args) throws Exception{ //Java调用过程的语法,这里只有一个?号,它是输出值 String sql = "{call simpleproc(?)}"; Connection conn = JdbcUtil.getConnection(); CallableStatement cstmt = conn.prepareCall(sql); //这个输出的?设置类型,?号下标从1开始 cstmt.registerOutParameter(1,Types.INTEGER); //执行过程的调用 cstmt.execute(); //接收过程的返回值 Integer count = cstmt.getInt(1); //显示 System.out.println("共有" + count + "个用户"); JdbcUtil.close(cstmt); JdbcUtil.close(conn); } }
----函数----
#修改mysql语句的结束符为//
mysql > delimiter //
#定义一个函数,完成字符串拼接
create function hello( s char(20) ) returns char(50) (定义最大输入字符和输出字符的长度) return concat('hello,',s,'!');(mysql自带拼接字符串函数) //
#修改mysql语句的结果符为;
mysql > delimiter ;
#调用函数
select hello('world');
Java调用Mysql的函数
String sql = "{? = call hello(?)}"; Connection conn = JdbcUtil.getConnection(); CallableStatement cstmt = conn.prepareCall(sql); cstmt.registerOutParameter(1,Types.VARCHAR); cstmt.setString(2,"zhaojun"); cstmt.execute(); String value = cstmt.getString(1); System.out.println(value); JdbcUtil.close(cstmt); JdbcUtil.close(conn);
/** * 演示Java调用Mysql的函数 * @author AdminTC */ public class TestJavaCallMysqlFunc { public static void main(String[] args) throws Exception{ String sql = "{? = call hello(?)}"; Connection conn = JdbcUtil.getConnection(); CallableStatement cstmt = conn.prepareCall(sql); //第一个输出的?设置类型 cstmt.registerOutParameter(1,Types.VARCHAR); //第二个输入的?设置值 cstmt.setString(2,"赵君"); //调用函数 cstmt.execute(); //接收返回的值 String value = cstmt.getString(1); //显示 System.out.println(value); JdbcUtil.close(cstmt); JdbcUtil.close(conn); } }

浙公网安备 33010602011771号