JDBC使用步骤:
create database jdbctest;
use jdbctest;
create table user(
id int unsigned auto_increment key,
username varchar(20),
password varchar(20),
name varchar(20)
);
insert into user values(null, 'aaa', '111', '张三'),
(null, 'bbb', '222', '李四'),
(null, 'ccc', '333', '王五');
DriverManager.registerDriver(new Driver());
2、 获得连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "wxhxx520");
3、 创建执行SQL语句的对象,并执行SQL
a) 创建sql语句,获得statement对象
String sql = “select * from user”;
Statement stmt = conn.createStatement();
b) 执行sql语句
ResultSet resultSet = stmt.executeQuery(sql);
while(resultSet.next()){
// int id = resultSet.getInt(1);
// String username = resultSet.getString(2);
// String password = resultSet.getString(3);
// String name = resultSet.getString(4);
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
String name = resultSet.getString("name");
System.out.println(id + " " + username + ":" + password + " " + name);
}
4、 释放资源
resultSet.close();
statement.close();
conn.close();
完整程序:
package com.luyue.jdbc;
import com.mysql.jdbc.Driver;
import org.junit.jupiter.api.Test;
import java.sql.*;
public class JDBC_Demo {
@Test
public void demo(){
try {
//1、加载驱动
DriverManager.registerDriver(new Driver());
//2、获得连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "wxhxx520");
//3、创建执行SQL语句的对象,并且执行SQL
//3.1创建sql语句,获得Statement对象
String sql = "select * from user";
Statement statement = conn.createStatement();
//3.2执行sql语句
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
// int id = resultSet.getInt(1);
// String username = resultSet.getString(2);
// String password = resultSet.getString(3);
// String name = resultSet.getString(4);
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
String name = resultSet.getString("name");
System.out.println(id + " " + username + ":" + password + " " + name);
}
//4、释放资源
resultSet.close();
statement.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBC 的API介绍:
DriverManager:驱动管理类
a) 注册驱动
DriverManager.registerDriver(new Driver());//这种方法注册的驱动实质上注册了两次
源码分析:
静态代码块中调用了DriverManager已经注册了,而静态代码块在类加载时执行,而我们的代码中又手动的调用了一次,实质上注册两次。
另一种调用方法(实际开发中的注册方法):
Class.forName(“com.mysql.jdbc.Driver”);//加载Driver类,则静态代码块执行,则驱动注册。
b) 获得连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "wxhxx520");
url写法:jdbc:mysql://localhost:3306/jdbctest
其中jdbc:协议
mysql:子协议
localhost:主机名
3306:端口号
连接本机数据库的另一种写法:
“jdbc:mysql:// /jdbctest”//中间部分省略掉
Connection:连接对象
a) 创建用来执行sql语句的对象
Statement statement = conn.createStatement(); //可以用来执行sql语句,但是有sql注入漏洞存在
prepareStatement ps= conn .prepareStatement(String sql)//预编译sql语句,解决sql注入漏洞
CallableStatement cs = conn.prepareCall(String sql)//执行sql中存储过程
b) 进行事务的管理
setAutoCommit(boolean autoCommit) //设置事务是否自动提交
commit()//事务提交
rollback()//事务回滚
Statement:执行sql语句
a) 执行sql语句boolean execute(String sql)//执行sql,执行select返回true,否则false
ResultSet executeQuery(String sql)//执行sql中的select语句
int executeUpdate(String sql) //执行sql中的insert/update/delete语句
b) 执行批处理操作:
addBatch(String sql)//将sql语句添加到批处理
int[] executeBatch()//执行批处理
clearBatch()//清除批处理
ResultSet:结果集,对select查询结果的一个封装
a) 常用方法:
boolean next() //移动光标,一开始的光标在真正数据之前,用来判断下一行是否有数据,如果有则指向下一行
针对不同类型数据使用getxxx()方法获取数据
Object getObject(String columnLabel) //通用方法
Eg:
CREATE TABLE goods(
id int unsigned auto_increment key comment '商品编号',
name varchar(20) unique not null comment '商品名称',
price float(7,1) not null default 0.0 comment '商品价格',
desp varchar(100) not null comment '商品描述'
);
insert goods() values(null, '手机', 2000.0, '黑色,存储32G'),
(null, '冰箱', 1500.0, '银色,对开门'),
(null, '洗衣机', 3000.0, '滚动'),
(null, '空调', 4000, '变频空调');
public class JDBC_Demo2_11 {
//查询价格在3500以下的商品信息,并在控制台打印输出。
@Test
public void demo(){
//1、注册驱动
try {
//1、注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获得连接
Connection conn = DriverManager.getConnection("jdbc:mysql:///jdbctest", "root", "wxhxx520");
//3、获得statement对象,并执行sql语句
String sql = "select * from goods where price<=3500";
Statement statement = conn.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
float price = resultSet.getFloat("price");
String desp = resultSet.getString("desp");
System.out.println(id + " " + name + " " + price + " " + desp);
}
//4、释放连接
resultSet.close();
statement.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBC资源释放:
Jdbc程序运行完后,要释放程序在运行过程中创建的那些与数据库交互的对象,通常是:
ResultSet, Statement, Connection
特别是Connection,它是非常稀有的资源,用完后要马上释放,若不及时释放,极易导致系统宕机。使用原则:晚创建,早释放
其中为确保释放的代码能够正常运行,资源释放代码要放在finally语句中
Eg:依旧是上述代码,改变之后的标准释放过程:
public class JDBC_Demo2_11 {
//查询价格在3500以下的商品信息,并在控制台打印输出。
@Test
public void demo(){
Connection conn = null;
Statement statement = null;
ResultSet resultSet = null;
//1、注册驱动
try {
//1、注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获得连接
conn = DriverManager.getConnection("jdbc:mysql:///jdbctest", "root", "wxhxx520");
//3、获得statement对象,并执行sql语句
String sql = "select * from goods where price<=3500";
statement = conn.createStatement();
resultSet = statement.executeQuery(sql);
while(resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
float price = resultSet.getFloat("price");
String desp = resultSet.getString("desp");
System.out.println(id + " " + name + " " + price + " " + desp);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//4、释放连接
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
resultSet = null;
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
statement = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null//多手动设置一次null的原因是为了垃圾回收机制能够更早的回收;
}
}
}
}