ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JDBC

2022-09-09 22:00:48  阅读:220  来源: 互联网

标签:语句 ps JDBC res 数据库 Statement sql


JDBC

简介

Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC API 允许用户访问任何形式的表格数据,尤其是存储在关系数据库中的数据。

执行流程:

  • 连接数据源,如:数据库。
  • 为数据库传递查询和更新指令。
  • 处理数据库响应并返回的结果。

基本使用

加载驱动 - Driver接口

在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。不同的数据库有不同的装载方法。驱动就是各个数据库厂商实现的Sun公司提出的JDBC接口,即对Connection等接口的实现类的jar文件。

装载MySQL驱动:

  • 5.0版本

    Class.forName("com.mysql.jdbc.Driver");
    
  • 8.0以上版本有所不同

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

建立连接 - Connection接口和DriverManager接口

import java.sql.Connection;
import java.sql.DriverManager;

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC","root","password");
  • MySQL 8.0 以上版本不需要建立 SSL 连接的,需要显示关闭。
  • allowPublicKeyRetrieval=true 允许客户端从服务器获取公钥。
  • 最后还需要设置 CST。

执行查询 - Statement接口

三种Statement类:

  • Statement:

    由createStatement创建,用于发送简单的SQL语句。(不带参数)

    import java.sql.Statement;
    
    Statement stmt = conn.createStatement();
    String sql = "INSERT INTO `t_user` (`username`, `pwd`, `regTime`) VALUES ('王五', '456', '2022-03-14 09:13:11')";
    stmt.execute(sql);
    
    • 纯靠字符串拼接,不方便。
    • 容易SQL注入
    • 常用Statement方法:
      • execute():运行语句,返回是否有结果集。
      • executeQuery():运行select语句,返回ResultSet结果集。
      • executeUpdate():运行insert/update/delete操作,返回更新的行数。
  • PreparedStatement:

    继承自Statement接口,由prepareStatement创建,用于发送含有一个或多个输入参数的sql语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入。我们一般都用PreparedStatement。

    import java.sql.PreparedStatement;
    
    String sql = "INSERT INTO `t_user` (`username`, `pwd`, `regTime`) VALUES (?, ?, ?)"; //占位符
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setString(1,"张三"); //参数索引从1开始而不是从0开始
    ps.setString(2,"456");
    ps.setDate(3,new java.sql.Date(System.currentTimeMillis()));
    
    ps.execute();
    
  • CallableStatement:

    继承自PreparedStatement。由方法prePareCall创建,用于调用存储过程。

展开结果集数据库 - ResultSet接口

String sql = "SELECT * FROM t_user WHERE id>?"; //占位符
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1,2); //查询ID大于2的

ResultSet res = ps.executeQuery();

while(res.next()){
    System.out.println(res.getInt(1) + "---" + res.getString(2) + "---" + res.getString(3) + "---" + res.getString(4));
}

关闭连接 - close()方法

后开先关,使用close()方法。

遵循:ResultSet-->Statement-->Connection的顺序,三个最好分开写。

finally {
    try{
        if(res!=null){
            res.close();
        }
    }
    catch (SQLException throwables) {
        throwables.printStackTrace();
    }
    try{
        if(ps!=null){
            ps.close();
        }
    }
    catch (SQLException throwables) {
        throwables.printStackTrace();
    }
    try{
        if(conn!=null){
            conn.close();
        }
    }
    catch (SQLException throwables) {
        throwables.printStackTrace();
    }
}

事务

基本概念

一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元。

  • 事务开始于:
    • 连接到数据库上,并执行一条DML语句(INSERT、UPDATE或DELETE)。
    • 前一个事务结束后,又输入了另外一条DML语句。
  • 事务结束于:
    • 执行COMMIT或ROLLBACK语句。
    • 执行一条DDL语句,例如CREATE TABLE语句;在这种情况下,会自动执行COMMIT语句。
    • 执行一条DCL语句,例如GRANT语句;在这种情况下,会自动执行COMMIT语句。
    • 断开与数据库的连接。
    • 执行了一条DML语句,该语句却失败了;在这种情况中,会为这个无效的DML语句执行ROLLBACK语句。
  • 事务的四大特点(ACID)
    • atomicity(原子性):表示一个事务内的所有操作是一个整体,要么全部成功,要么全失败;
    • consistency(一致性):表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前的状态:
    • isolation(隔离性):事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
    • durability(持久性):持久性事务完成之后,它对于系统的影响是永久性的。

使用

conn.setAutoCommit(flase); // JDBC默认自动提交
/**
*一系列SQL操作
*/
conn.commit(); // 手动提交
  • 这一系列SQL操作,只要有一个失败就会回滚到初始状态。

CLOB & BLOB

简介

  • CLOB ( Character Large Object)

    • 用于存储大量的文本数据

    • 大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的。而非一般的字段,一次即可读出数据。

    • MySQL中相关类型:

      • TINYTEXT最大长度为255(2A[8] - 1)字符的TEXT列。

      • TEXT[(M)]最大长度为65,535(2[1] - 1)字符的TEXT列。

      • MEDIUMTEXT最大长度为16,777,215(2A[24] - 1)字符的TEXT列。

      • LONGTEXT最大长度为4,294,967,295或4GB(2[2] - 1)字符的TEXT列。

  • BLOB(Binary Large Object)

    • 用于存储大量的二进制数据

    • 大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的。而非一般的字段,一次即可读出数据。

    • Mysql中相关类型:

      • TINYBLOB最大长度为255(2^[8] - 1)字节的BLOB列。

      • BLOB[(M)]最大长度为65,535(2^[16] - 1)字节的BLOB列。

      • MEDIUMBLOB最大长度为16,777,215(2^[24] - 1)字节的BLOB列。 -LONGBLOB最大长度为4,294,967,295或4GB(2^[32] - 1)字节的BLOB列。

CLOB使用

可使用流操作直接写入

ps.setClob(2, new FileReader(new File("d:/a.txt"))); // 将文本文件内容直接写入数据库
ps.setClob(2, new BuffereReader(new InputStreamReader(new ByteArrayInputStream("testString".getBytes())))); // 用流输入字符串

读出当然也是流

while(res.next()){
    Colb c = res.getClob("myInfo");
    Reader r = c.getCharacterStream();
    int temp = 0;
    while((temp=r.read())!=-1){
        System.out.print((char)temp);
    }
}

BLOB使用

可用字节流写入图片之类的

ps.setBlob(2, new FileInputStream("d:/a.jpg")); // 将图片内容直接写入数据库

读出

while(res.next()){
    Bolb b = res.getBlob("headImg");
    InputStream is = b.getBinaryStream();
    OutputStream os = new FileOutputStream("d:/a_downlod.jpg");
    int temp = 0;
    while((temp=is.read())!=-1){
        os.write(temp);
    }
}

  1. 16 ↩︎

  2. 32 ↩︎

标签:语句,ps,JDBC,res,数据库,Statement,sql
来源: https://www.cnblogs.com/AncilunKiang/p/16674046.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有