【JDBC】JDBC核心基础

news/2024/5/18 22:22:44 标签: jdbc, 数据库, java

 

▊ JDBC初识

Java DataBase Connectivity,Java数据库连接, 即用Java语言操作数据库

JDBC的本质:其实是Sun公司定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商(Oracle,MySql)去实现这套接口,各自提供数据库驱动jar包)。我们使用这套接口(JDBC)去编程,真正执行的是数据库驱动(jar包)中的实现类———面相接口,通过多态,实现了一套代码操作操作多种数据库

 
 

▊ 使用到的对象

  1. DriverManager:驱动管理
  2. Connection数据库连接
  3. Statement:执行静态sql对象
  4. ResultSet:结果集
  5. PreparedStatement:执行动态sql对象(Statement的子接口)

tip
cmd窗口mysql -u root -p,如果闪退或出错说明你的mysql服务还没打开
services.msc进入控制面板的服务项手动打开;net start mysql命令也可以

 
DriverManager

java">1. 注册驱动:告诉程序该使用哪一个数据库驱动jar包

该类有一个registerDriver静态方法用于注册驱动,它被使用在com.mysql.cj.jdbc.Driver类的静态代码块中。
当执行`Class.forName("com.mysql.cj.jdbc.Driver")` 语句,类被加载,驱动也就被注册。
注: mysql5之后的驱动jar包可以省略注册驱动的步骤

2.  获取数据库连接

getConnection(String url, String user, String password) ,静态方法,返回Connection对象
三个参数:url,用户名,密码
其中url的组成是:"jdbc:mysql://ip地址(域名):端口号/数据库名称",如"jdbc:mysql://localhost:3306/myDB";
解决时区问题还要加上"?serverTimezone=GMT%2B8"

 
Connection

java">功能:
1. 获取执行sql 的对象
			> createStatement() 			 返回Statement 
			> preparedStatement(String sql)  返回PreparedStatement 
2. 管理事务:
			> 开启事务:setAutoCommit(false) 
			> 提交事务:commit() 
			> 回滚事务:rollback() 

 

Statement

java">功能: 执行静态sql语句

execute(String sql) 		 执行任意的sql(很少使用)
executeUpdate(String sql) 	 执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句。DML返回int:影响的行数,DDL返回0
executeQuery(String sql)   	 执行DQL(select)语句。查询语句当然是返回ResultSet

 

ResultSet

java">next()					游标向下移动一行。返回boolean,代表是否已经到达末尾

getXxx(列编号/列名)		Xxx是指定返回的数据类型;参数可以是 从1开始的列编号(int)或列名(String)


// Demo:
while(result.next()) {
	System.out.println(result.getString(姓名));
}

 
PreparedStatement

java">如果利用字符串拼接生成静态sql,使用Statement对象,会出现"sql注入"的危险
解决方案是使用动态sql(预编译sql),使用PreparedStatement对象

获取静态的sql执行对象createStatement(不传参) -> 执行sql(传参)
获取动态的sql执行对象prepareStatement(传参) -> setXxx(index, content)设置参数 -> 执行sql(不传参)

// 静态sql
Statement statement = conn.createStatement();
String sql = "select * from accountTable where account = 'Loli' and age = 12"
ResultSet result = statement.executeQuery(sql);

// 动态sql
String sql = "select * from accountTable where account = ? and password = ?";
PreparedStatement preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, "Alice");
preparedStatement.setInt(2, 12);
ResultSet result = preparedStatement.executeQuery();

 
 

▊ Demo

经典代码——向表中插入数据 (静态DML语句)

java">>>> 基本步骤()
>>> 注册驱动	-> 获取连接 -> 获取sql执行对象 -> 执行sql -> 释放资源
java">Connection conn = null;                 // 提升作用域(否则在finally的作用域无法使用conn和statement)
Statement statement = null;  

try{
    Class.forName("com.mysql.cj.jdbc.Driver");
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myLoli?serverTimezone=GMT%2B8", "root", "2062120d");
    statement = conn.createStatement();
    int count = statement.executeUpdate("insert into student values('201810223016','萝莉控')");
    System.out.println("影响行数:" + count);
} catch (ClassNotFoundException e){	   // 抓com.mysql.cj.jdbc.Driver类不存在异常
    e.printStackTrace();
} catch (SQLException e){			   // 抓SQL异常
    e.printStackTrace();
} finally {							   // 释放资源写在finally块里,保证一定执行(如果有ResultSet,也需要释放)
    if(statement != null){             // 避免空指针异常(statement不一定被赋值)
        try {
            statement.close();
        }catch (SQLException e){
            e.printStackTrace();
        }
    }
    if(conn != null){                   // 避免空指针异常(conn不一定被赋值)
        try {
            conn.close();
        }catch (SQLException e){
            e.printStackTrace();
        }
    }
}

 

 

▊ JDBC控制事务

事务(Transaction)是并发控制的单位。要么全部完成,要么全部失败

java">我们使用Connection对象管理事务 :

setAutoCommit(false)		开启事务
commit()					提交事务
rollback()					回滚事务


>>> 调用者是Connection对象: conn.commit()
>>> 用法:setAutoCommit(false)commit()包裹代码块;rollback()写在catch块中

 

 

 

 

 

 

 

 

 

 

 

 
End


http://www.niftyadmin.cn/n/1330482.html

相关文章

hiho #1014 : Trie树 (字典树模版题)

1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。 这一天,他们遇到了一本词…

【JDBC】连接池 + Spring JDBC

○●○ 数据库连接池 本质: 存放数据库连接的容器(集合)。 原理: 容器中会申请一些连接对象。当用户来访问数据库时,从容器中获取连接对象;访问结束,归还连接对象给容器。 优点 不言而喻: 降低资源消耗&…

实现用户密码登录(MySQL数据库+自行封装的JDBC工具类)

★ JDBC的核心就是: 注册驱动 → 获取连接 → 获取sql执行对象 → 执行sql → 释放资源 -------------------------------------- jdbc.properties 配置文件 ------------------------------------------------driverClassNamecom.mysql.cj.jdbc.Driver urlj…

hiho#1107 : Shortest Proper Prefix (统计非指定前缀在字符串集中出现次数)

1107 : Shortest Proper Prefix 时间限制:10000ms 单点时限:1000ms 内存限制:512MB 描述 Query auto-completion(QAC) is widely used in many search applications. The basic idea is that when you type some string s in the search box several high-frequency que…

【图解算法】染上龙血的勇者——彻底理清【递归】【记忆化搜索】【动态规划】的关系

很久以前,有一个王国。 突然有一天,国王的女儿失踪了。 一名勇者去寻找她。他年轻、强大、无畏,只是有着致命的软肋。 他提剑找寻到了森林深处的山顶,山洞里是公主和一头恶龙。 为了打败恶龙,勇者饮下了龙血。…

【LeetCode】Sama的个人记录_27

【Q95】(md) 不同的二叉搜索树Ⅱ 给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。 示例: 输入:3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] >>> 这道题…

区间异或最大

首先我们看这样一个问题:给定一个包含N个整数的集合S{A1, A2, A3, … AN}。然后有M个询问,每次询问给定一个整数X,让你找一个Ai使得Ai xor X的值最大。 这道题也是可以用Trie解决的。首先我们知道一个整数可以用二进制表示成一个01串。比如3…

【Tomcat】配置Web项目+理解Tomcat文件夹

web相关概念回顾 ▶ 软件架构 C/S:客户端/服务器端B/S:浏览器/服务器端 ▶ 资源分类 ▶ 网络通信三要素:IP 端口 传输协议 web服务器软件 服务器:通俗的说,就是安装了服务器软件的计算机 服务器软件&#xff…