当前位置:   article > 正文

最详细的JDBC教程

jdbc教程

JDBC (Java Database Connectivity)

JDBC本质上属于一种服务,服务的特征,必须按照指定的规范进行操作

相关概念

核心包java.sql
DriverManager
Connection
Statement
PreparedStatement
ResultSet

JDBC对数据库的访问方式
  • JDBC-ODBC桥连接[Java支持的默认技术,不需要额外的配置]
    利用微软的ODBC技术进行数据库的连接,然后在利用JDBC技术访问ODBC技术进行数据库开发,中间走了两个连接技术,会造成性能影响
    流程:程序->JDBC->ODBC->数据库
  • JDBC连接
    直接利用JDBC进行数据库连接处理,一般只连接本都数据库服务器
    流程:程序->JDBC->数据库
  • JDBC网络连接[基本用这个]
    通过特定的网络协议连接指定的数据库服务
    流程:程序->JDBC->网络数据库(IP地址、端口号)
  • JDBC协议连接
    自己通过编写置顶的协议操作实现连接
JDBC-Mysql实例
  • 通过反射机制加载数据库驱动程序类
  • 数据库的连接需要一个网络的的连接地址
    地址结构: jdbc:mysql://IP:PORT/DBNAME
  • 数据库的用户名和密码

Mysql实例

private static final String JDBC_MYSQL_DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String DB_MYSQL_URL = 
"jdbc:mysql://localhost:3306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&characterEncoding=utf8";
static final String MYSQL_USER = "root";
static final String MYSQL_PASS = "root";
//注册驱动
Class.forName(JDBC_MYSQL_DRIVER);
//获取连接
Connection conn = DriverManager.getConnection(DB_MYSQL_URL,MYSQL_USER,MYSQL_PASS);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Oracle实例

private static final String JDBC_ORACLE_DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DB_ORACLE_URL = "jdbc:oracle:thin:@10.254.254.137:1521:orcl";
static final String ORACLE_USER = "c##orcltest";static final String ORACLE_PASS = "orcltest";
  • 1
  • 2
  • 3

工厂设计模式:
在这里插入图片描述

Statement接口

获取了java.sql.Connection接口对象之后,那么接下来就是执行SQL语句了,Statement接口就是SQL的执行器

public interface Statement extends Wrapper, AutoCloseable`
  • 1

一条Sql的执行就是一个Statement对象

  • 获取Statement接口对象
public Statement createStatement() throws SQLException
  • 1

SQLException是JDBC数据库开发中的最顶级异常

  • SQL执行(两个主要方法)
    数据查询处理(INSERT、UPDATE、DELETE): public int executeUpdate(String sql) throws SQLException
    数据更新处理(SLECT、COUNT…): public ResultSet executeQuery(String sql) throws SQLException
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-msZu8A2E-1594535297632)(en-resource://database/2825:1)]

测试表:

CREATE TABLE `news` (
  `nid` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(30) CHARACTER SET utf8 NOT NULL,
  `read_count` int(11) DEFAULT NULL,
  `price` double DEFAULT NULL,
  `content` text CHARACTER SET utf8,
  `pubdate` date DEFAULT NULL,
  PRIMARY KEY (`nid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 数据更新操作
String sql = "INSERT INTO news(title, read_count, price, content, pubdate) VALUES 
('哈喽', 1, 20.0, '内容1', curdate())";
String sql2 = "UPDATE news SET title='UPDATE标题1',read_count=9999 where nid=6;";
int count = stmt.executeUpdate(sql2);
System.out.println("受影响的行数" + count);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 数据库查询操作(注意查询数据量不要过大)
    在这里插入图片描述
String sql3 = "SELECT nid,title,read_count,price,content,pubdate FROM news;";
ResultSet rs = stmt.executeQuery(sql3);
        while (rs.next()) {
            int nid = rs.getInt(1);
            String title = rs.getString(2);
            int read = rs.getInt(3);
            double price = rs.getDouble(4);
            String content = rs.getString(5);
            Date pubdate = rs.getDate(6);
            System.out.println(nid + "\t" + title + "\t" + read + "\t" +  price + "\t" +  content + "\t" +  pubdate);
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
PreparedStatement

PreparedStatement提供了SQL语句的预处理
在这里插入图片描述
在这里插入图片描述

public interface PreparedStatement extends Statement
  • 1
  • 获取PreparedStatement接口对象
public PreparedStatement prepareStatement(String sql)  throws SQLException
  • 1

获取对象的时候,就需要提供sql语句

  • 查询和更新接口
    executeUpdate
    executeQuery
--本次使用Oracle
DROP TABLE news PURGE;
DROP SEQUENCE news_seq;
CREATE SEQUENCE news_seq;
CREATE TABLE news(
    nid      NUMBER,
    title    VARCHAR2(30),
    read_count     INT,
    price    NUMBER,
    content_news CLOB,
    pubdate DATE,
    CONSTRAINT pk_nid PRIMARY KEY(nid)
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
String title = "新闻标题";
int read = 99;
double price = 99.8;
String content = "这次测试的是Oracle";
java.util.Date pubdate = new java.util.Date();

String sql = "INSERT INTO news(nid, title, read_count, price, content_news, pubdate) VALUES " +
        " (news_seq.nextval, ?, ?, ?, ?, ?)"; //问号作为占位符
PreparedStatement perstmt = conn.prepareStatement(sql);
//为占位符按照顺序设置内容
perstmt.setString(1, title);
perstmt.setInt(2, read);
perstmt.setDouble(3,price);
perstmt.setString(4,content);
System.out.println(pubdate.getTime());
perstmt.setDate(5,new java.sql.Date(pubdate.getTime()));
int count = perstmt.executeUpdate();
System.out.println(count);
conn.close();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
String sql3 = "SELECT nid,title,read_count,price,content_news,pubdate FROM news 
where nid=?";PreparedStatement perstmt = conn.prepareStatement(sql3);perstmt.setInt(1, 2);
ResultSet rs = perstmt.executeQuery();while (rs.next()) {    
int nid = rs.getInt(1);    
String title = rs.getString(2);    
int read = rs.getInt(3);    
double price = rs.getDouble(4);    
String content = rs.getString(5);    
Date pubdate = rs.getDate(6);    
System.out.println(nid + "\t" + title + "\t" + read + "\t" +  price + "\t" +  
content + "\t" +  pubdate);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

如果对您有帮助,请点赞转发收藏,您的支持是我创作的最大动力

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/512935
推荐阅读
相关标签
  

闽ICP备14008679号