JDBC基础

JDBC: java database connectivity java代码通过不同数据库的驱动操作数据库


image.png

JDBC API 主要功能

三件事,具体通过以下类/接口实现:
DriverManager:管理jdbc驱动
Connection:和数据库连接
Statement(PrepareStatement):增删改查
CallableStatement:调用数据库中的存储过程/存储函数
Result:返回的结果集


image.png

jdbc访问数据库的具体步骤

  1. 导入驱动,加载具体的驱动类
  2. 与数据库建立连接
  3. 发送sql,执行
  4. 处理结果集(查询)

数据库驱动

驱动jar 具体驱动类 连接字符串
Oracle ojdbc-x.jar oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@localhost:1521:orcl
MySQL mysql-connector-java-x.jar com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/数据库实例名
SqlServer sqljdbc-x.jar com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:microsoft:sqlserver:localhost:1433;databasename=数据库实例名

几个主要对象

Statement(PreparedStatement): 增删改查 (通过Connection产生)
CallableStatement :调用数据库中的 存储过程/存储函数 (通过Connection产生)
Result :返回的结果集(通过Statement产生)

Connection产生数据库的对象:
Statement createStatement();
PreparedStatement prepareStatement();
CallableStatement prepareCall();

Statement操作数据库:
增删改: executeUpdate();
查询:executeQuery();

ResultSet: 保存结果集 select * from xxx
next();光标下移,判断是否有下一条数据:true/false
previous(); 上一条数据,true/false;
rs.getString("name");

PreparedStatement操作数据库:
是Statement的子接口;

用法:

// String sql = "insert into student values(1,'zhangsan',36,'s3')";
String sql = "insert into student values(?,?,?,?)";
 PreparedStatement pstmt = connection.prepareStatement(sql);//预编译
pstmt.set(1,36);

PrepareStatement与Statement在使用时的区别

  1. Statement:
    sql
    executeUpdate(sql)
  2. PreparedStatement :
    sql(可能存在占位符?)
    在创建PreparedStatement对象时,将sql预编译 preparestatement(sql)
    executeUpdate()
    setXxx()替换占位符

推荐使用PreparedStatement,原因如下:

  1. 编码更加简便
    String name = "zs";
    int age = 23;
    stmt:
    String sql = "insert into student(stuno,stuname) values('"name"', "+age+")";
    stmt.executeUpdate(sql);
    pstmt:
    String sql = "insert into student(stuno,stuname) values(?, ?)";
    pstmt = connection.prepareStatement(sql);//预编译sql
    pstmt.setString(1,name);
    pstmt.setInt(2,age);
  2. 提高性能
    上面代码重复执行100次,stmt需要编译100次,pstmt则只需要编译1次。
  3. 安全(可以有效防止sql注入)
    stmt: 存在被sql注入的风险
    例如输入 用户名: 任意值 ’ or 1=1 --
    密码: 任意值
    分析:
    select count(*) from login where uname = '任意值' or 1=1 --‘ and upwd = ’ ”+pwd+"'
    pstmt:有效防止sql注入

总结:

  1. jdbc中除了Class.forName()抛出ClassNotFoundExeception,其他方法全部抛SQLException
  2. CallableStatement:调用 存储过程、存储函数
    connection.prepareCall(参数:存储过程或存储函数名)
    参数格式:
    存储过程:没有返回值,用Out参数替代
    { call 存储过程(参数列表) }
    存储函数:有返回值return
    { ? = call 存储函数名(参数列表) }
    create or replace addTwoNum (num1 in number,num2 in number,result out number) -- 1 + 2 => 3
    as
    begain
    result := num1+num2;
    end;
    /
    强调:
    如果通过sqlplus访问数据库,只需要开启:OracleServiceSID
    通过其他程序访问数据(sqldevelop、navicat、JDBC),需要开启OracleServiceSID、XXListener

JDBC调用存储过程的步骤:

  1. 产生 调用存储过程的对象(CallableStatement) cstmt = connection.prepareCall("...");
  2. 通过setXxx()处理 输出参数值 cstmt.setInt(1,30);
  3. 通过registerOutParameter(...)处理输出参数类型
  4. cstmt.execute()执行
  5. 接受 输出值(返回值)getXxx()

JDBC调用存储函数的步骤:
create or replace function addTwoNum (num1 in number,num2 in number) -- 1 + 2 => 3
as
result number;
begain
result := num1+num2;
return result;
end;
/

JDBC调用存储函数:与调存储过程的区别,在调用时,请注意返回参数的接收。

处理CLOB/BLOB类型:

  1. 存储路径 E:\wenjian\JDK_API_zh_CN.CHME:\wenjian\JDK_API_zh_CN.CHM
  2. CLOB(oracle):大文本数据 (小说->数据)varchar2: 最大4000byte
    mysql为Text类型
    BLOB:二进制
    clob:
  3. 先通过pstmt的?代替小说内容(占位符)
  4. 再通过pstmt.setCharaterStream(2,reader,(int)file.length());将上一步的?代替为小说流 注意第三个参数类int类型

取:

  1. 通过Reader reader = rs.getCharacterStream("NOVEL");
  2. 将Reader通过Writer出书即可。

blob:二进制 字节流 InputStream OutputStream

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本节介绍Statement接口及其子类PreparedStatement和CallableStatement。 它...
    zlb阅读 1,208评论 0 0
  • 本文内容 1.什么是JDBC以及为什么要使用JDBC 2.JDBC核心API的讲解 3.使用JDBC核心API进行...
    Vincilovfang阅读 1,245评论 0 11
  • JDBC简介 SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC。JDBC...
    奋斗的老王阅读 1,557评论 0 51
  • title: "Jdbc"date: 2019-08-14T11:03:49+08:00draft: true 本...
    Nuoccc阅读 365评论 0 1
  • 预编译sql处理(防止sql注入) Statement : 执行SQL命令CallableStatement : ...
    奋斗的老王阅读 1,165评论 2 52