荐 最详细的JDBC教程
程序员文章站
2022-05-01 20:24:11
JDBC (Java Database Connectivity)JDBC本质上属于一种服务,服务的特征,必须按照指定的规范进行操作相关概念核心包java.sqlDriverManagerConnectionStatementPreparedStatementResultSetJDBC对数据库的访问方式JDBC-ODBC桥连接[Java支持的默认技术,不需要额外的配置]利用微软的ODBC技术进行数据库的连接,然后在利用JDBC技术访问ODBC技术进行数据库开发,中间走了两个连接技...
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);
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";
工厂设计模式:
Statement接口
获取了java.sql.Connection接口对象之后,那么接下来就是执行SQL语句了,Statement接口就是SQL的执行器
public interface Statement extends Wrapper, AutoCloseable`
一条Sql的执行就是一个Statement对象
- 获取Statement接口对象
public Statement createStatement() throws SQLException
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
- 数据更新操作
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);
-
数据库查询操作(注意查询数据量不要过大)
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);
}
PreparedStatement
PreparedStatement提供了SQL语句的预处理
public interface PreparedStatement extends Statement
- 获取PreparedStatement接口对象
public PreparedStatement prepareStatement(String sql) throws SQLException
获取对象的时候,就需要提供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)
)
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();
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);
}
如果对您有帮助,请点赞转发收藏,您的支持是我创作的最大动力
本文地址:https://blog.csdn.net/weixin_48568292/article/details/107299093
上一篇: 基于微信个人收款码的支付接口的实现与源码