您的位置:澳门新葡8455最新网站 > 编程教学 > callablestatement执行存储过程

callablestatement执行存储过程

发布时间:2019-10-07 12:56编辑:编程教学浏览(142)

    一.PreparedStatement执行sql语句

    1......

    1.先是连接数据库Dao.java
    package com.huan.dao;import org.junit.Test;import java.sql.*;/** * Created by pc on 17-5-1. */public class Dao { static String user ="root"; static String password = "root"; static String url = "jdbc:mysql://localhost:3306/eurasia_echarts?characterEncoding=UTF-8"; @Test public static Connection getDao() throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, user, password); if (null != conn) { System.out.println; } return conn; } public static void close(Statement state, Connection conn){ if(null != state){ try { state.close(); } catch (SQLException e) { e.printStackTrace(); } } if(null != conn){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(ResultSet rs, Statement state, Connection conn ){ if(null != rs){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(null != state){ try { state.close(); } catch (SQLException e) { e.printStackTrace(); } } if(null != conn){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }}
    

    Driver接口:数据库驱动程序的接口,全数具体数据库厂家须要的驱动程序需求贯彻次接口。

    2.PreparedStatement执行DML语句
    • 实行插入语句
    • 进行更新语句
    • 实施删除语句

    插入演示

    package com.huan.PreparedStatement;import com.huan.dao.Dao;import org.junit.Test;import java.sql.Connection;import java.sql.PreparedStatement;/** * Created by pc on 17-5-1. */public class Demo_preparedStatement { @Test public void test() throws Exception { Connection conn = null; PreparedStatement pstmt= null; conn = Dao.getDao(); //预编译的sql语句 String sql = " insert into mahuan  values; ";//一个问号表示一个参数占位值 //执行预编译sql语句 pstmt = conn.prepareStatement; //设置参数 pstmt.setString; pstmt.setInt;/*更新数据 String sql = " update mahuan set name =? where id =?; "; 执行预编译sql语句 pstmt = conn.prepareStatement; 设置参数 pstmt.setString; pstmt.setInt;删除数据 String sql = " delete from mahuan where id =?; "; 执行预编译sql语句 pstmt = conn.prepareStatement; 设置参数 pstmt.setInt;*/ int count = pstmt.executeUpdate(); System.out.println; Dao.close(pstmt,conn); }}
    

    图片 1图片 2

    • ### 3.PreparedStatement执行DQL语句

    • 施行查询语句

    package com.huan.PreparedStatement;import com.huan.dao.Dao;import org.junit.Test;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;/** * Created by pc on 17-5-1. */public class Demo_Select { @Test public void selectTest() throws Exception { Connection conn = null; PreparedStatement pstmt = null; conn = Dao.getDao(); String sql = " select * from mahuan; "; pstmt = conn.prepareStatement; ResultSet rs = pstmt.executeQuery(); while){ System.out.println("用列名称取值:编号:"+rs.getInt +" 姓名:"+rs.getString+" 年龄:"+rs.getString; } Dao.close(rs, pstmt,conn); }}
    

    图片 3

    PreparedStatement和Statement区别

    1.PreparedStatement比Statement功效高2.语法不平等3.PreparedStatement数额更安全

    Connection connect(String url,Properties info)用于获取数据库连接

    二.mysql注入

    仿照登陆:成立表users:

    • ###### 平常登陆:

      String name ="mahuan";String password = "123456";

    • ###### 当客户名

      String name ="mahuan' or 1=1-- '";String password = "456";

    地点这两条登陆都能够登入,然则第二条语句分明错误,那是使用mysql语法漏洞实行登陆

    图片 4

    2.....

    mysql注入成功(Statement)
    package com.huan.statemennt;import com.huan.dao.Dao;import org.junit.Test;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;/** * Created by pc on 17-5-1. */public class login { String name ="mahuan' or 1=1-- '"; String password = "456"; @Test public void login_Statement() throws Exception { Connection conn = null; Statement stmt = null; conn = Dao.getDao(); stmt = conn.createStatement(); String sql=" select * from users where name='"+name+"' and password='"+password+"'; "; ResultSet rs = stmt.executeQuery; if ){ System.out.println; }else { System.out.println; } }}
    

    图片 5image.png

    |-Connection接口:与现实的数据库的总是对象。

    mysql注入战败(PreparedStatement)
    package com.huan.statemennt;import com.huan.dao.Dao;import org.junit.Test;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;/** * Created by pc on 17-5-1. */public class login { String name ="mahuan' or 1=1-- '"; String password = "456"; @Test public void login_Statement() throws Exception { Connection conn = null; PreparedStatement stmt = null; conn = Dao.getDao(); String sql=" select * from users where name=? and password=?; "; stmt = conn.prepareStatement; stmt.setString; stmt.setString(2,password); ResultSet rs = stmt.executeQuery(); if ){ System.out.println; }else { System.out.println; } }}
    

    图片 6

    下边实例证实PreparedStatement比Statement更安全

    Statement         createStatement()制造四个静态sql语句对象

    三.callablestatement执行存款和储蓄进程(是PreparedStatement的子接口)

    • ###### 创制存款和储蓄进度

    怎么成立:Mysql学习笔记-存款和储蓄进度

    delimiter $create procedure pro_findid(in sid int)begin select * from mahuan where id =sid;end $
    
    • ###### 通进度序调用存款和储蓄进程,全部调用存储进度都用executeQuery
    package com.huan.statemennt;import com.huan.dao.Dao;import org.junit.Test;import java.sql.*;/** * Created by pc on 17-5-1. */public class login { String name ="mahuan' or 1=1-- '"; String password = "456"; @Test public void login_Statement() throws Exception { Connection conn = null; CallableStatement cstmt = null; conn = Dao.getDao(); String sql = " call pro_findid; "; cstmt = conn.prepareCall; cstmt.setInt; ResultSet rs =cstmt.executeQuery();//所有调用存储过程都用executeQuery while){ System.out.println("用列名称取值:编号:"+rs.getInt +" 姓名:"+rs.getString+" 年龄:"+rs.getString; } }}
    

    图片 7

    • ###### 创制存款和储蓄进程
    delimiter $create procedure pro_findidname(in sid int,out sname varcharbegin select name into sname from mahuan where id =sid;end $
    
    • ###### 施行带有输入输出参数的积攒进度
    package com.huan.statemennt;import com.huan.dao.Dao;import org.junit.Test;import java.sql.*;/** * Created by pc on 17-5-1. */public class login { String name ="mahuan' or 1=1-- '"; String password = "456"; @Test public void login_Statement() throws Exception { Connection conn = null; CallableStatement cstmt = null; conn = Dao.getDao(); String sql = " call pro_findidname; "; cstmt = conn.prepareCall; cstmt.setInt; cstmt.registerOutParameter(2, java.sql.Types.VARCHAR); cstmt.executeQuery(); String result = cstmt.getString; System.out.println; Dao.close(cstmt,conn); }}
    

    图片 8

    PreparedStatement        prepareStatement(String sql)创设预编写翻译的sql语句对象

    作品文集:JavaEE--学习笔记

    (存在sql注入漏洞的bug)

    3.....

    |-Statement接口:用于试行静态SQL语句

    int        executeUpdate(String sql)实践更新操作的sql语句(create/alter/drop/insert/update/delete)

    ResultSet      executeQuery(String sql)推行查询操作的sql语句

    (select)

    (可防止范流入漏洞,对sql语句举办预编写翻译)

    |-PreparedStatement接口:用于试行预编写翻译的SQL语句(是Statement的子接口)

    int      executeUpdate()实施更新操作的sql语句

    ResultSet     executeQuery()施行查询操作的sql语句

    4......

    |-ResultSet接口:结果集对象。存储全体数据库查询的结果,用该目的开展多少遍历。

    booleannext():把光标移动到下一行。借使下一行有数据,重临true,若无下一行数据,重回false。

    getXXX(列索引|列字段名称):获取字段的数码

    i"=��)

    第一种连接操作数据库的点子       存在sql注入的高风险

    率先步: 加载驱动

    Class.forName("com.mysql.jdbc.Driver");

    其次部:创制链接数据库

    Connection conn=driverManger.getConnection(url,user,password);

    第三部:创建Statement对象

    Statement statement=conn.createStatement();

    第四步:创建Sql语句

    String sql="sql语句";

    第五步:执行sql语句

    只要地点的sql语句是DDL. DML语句   就利用如下代码:

    statement.executeUpdate(sql);   能够用int类型去领受

    假若地点的sql语句是DQL语句,,正是用如下代码:

    statement.executeQuery(sql);   能够用int类型区接受

    第六步:  关闭  

    调用close方法        conn         statement

    if(conn!=null){conn.close()}    statement和conn 一样

    其次种办法   是用Statement的子接口   PreparedStatement   不会存在sql注入危害

    首先步: 加载驱动

    Class.forName("com.mysql.jdbc.Driver");

    第二步:创造链接数据库

    Connection conn=driverManger.getConnection(url,user,password);

    第三步:创建sql语句

    第四步:创建Preparedstatement对象

    Preparedstatement pstat=conn.preparedstatement(sql);

    实践DDL,DML语句代码如下

    ResultSet rs=pstat.executeupdate();     Result是个汇集    

    进行DQL语句代码如下

    ResultSet rs=pstat.executeQuery();

    第五步:关闭

    ResultSet也亟需关闭

    conn    pstat      rs  多个都要关闭

    statement 和 Preparedstatement的区别:

    1...语法分歧   

      statement:实践的事静态sql语句

    Preparedstatement:先实施预编译SQL语句: 能够用 ? 进行参数占位  后边给参数赋值

        比如1:      String sql="select * from user where uid=?;";

                         pstat.setInt(1,值);

                        int是基于sql语句 列字段(Uid)的类型,   1是第多少个?    值是填?的  

        比如2:         String sql ="INSERT INTO student(NAME,gender)

    VALUES(?,?)";//预编写翻译sql:使用?号替代参数值。贰个?号表示二个参数值

    2...法规不相同

    statement:不能够拓宽缓存

    Preparedstatement:能够伸开缓存,实施功效比statement快

    3...金昌主题材料

    statement:不可能防御sql注入

    Preparedstatement:能够免备sql注入

    JDBC的批管理:

    Statement批处理:

                         void      addBatch(String sql)加多sql到缓存区(一时半刻不发送)

                         int[]      executeBatch()试行批管理命令。发送全部缓存区的sql

                          void       clearBatch()清空sql缓存区

    PreparedStatement批处理:

                      void     addBatch()增加参数到缓存区

                     int[]      executeBatch()实施批管理命令。发送全体缓存区的sql

                    void      clearBatch()清空sql缓存区

    Mysql不扶助批管理优化,也不帮助PreparedStatement对象优化

    Oracle协理批管理优化,帮忙PreparedStatement对象优化。

    本文由澳门新葡8455最新网站发布于编程教学,转载请注明出处:callablestatement执行存储过程

    关键词: