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();
        }
    }
}
View Code
/**
 * 演示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);
    }
}
View Code

 

----函数----

#修改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);
    }
}
View Code

 

posted @ 2017-05-31 19:31  假程序猿  阅读(1428)  评论(0)    收藏  举报