JDBC
JDBC概述
什么事JDBC
JDBC(JavaDataBaseConnectivity)就是 Java 数据库连接,说白了就是用 Java 语言来操作数 据库。之前操作数据库是在控制台使用 SQL 语句来操作数据库的,JDBC 是用 Java 语言向数 据库发送 SQL 语句,来达到操作数据库的效果。
JDBC 原理
JDBC 由 SUN 提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准, 然后各个数据库厂商会遵循 SUN 的规范,提供一套访问自己公司的数据库服务器的 API。 SUN 提供的规范命名为 JDBC,而各个厂商提供的,遵循了 JDBC 规范的,可以访问自己数据库的 API 被称之为驱动
- JDBC 实现细节:JDBC 主要分为三部分
- JDBC 驱动管理器:负责注册特定的 JDBC 驱动器,主要通过 java.sql.Drivermanager实现。
- JDBC 驱动器 API:由 Sun 公司负责制定,其中最主要的接口是 java.sql.Driver
- JDBC 驱动器:是一种数据库驱动,由数据库厂商创建和维护,也称为 JDBC 驱动, 是实现了 JDBC 驱动器 API,负责与特定的数据库连接,以及处理通信细节。
JDBC 入门
JDBC 开发步骤
- 注册驱动
- 获取连接对象 Connection
- 通过 Connection 对象获取 Statement 对象
- 使用 Statement 执行 SQL 语句
- 遍历返回的结果集
- 关闭资源
准备数据
创建数据库
CREATE DATABASE FIRSTJDBC;
USE FIRSTJDBC;
CREATE TABLE USER(
uid INT PRIMARY KEY AUTO_INCREMENT,
uname VARCHAR(20) UNICODE,
uage INT ,
udes VARCHAR(50)
);
INSERT INTO USER VALUES(1,'张三',34,'什么玩意');
INSERT INTO USER VALUES(2,'李四',12,'真的不知道');
导入 MySQLJDBC 驱动,并注册
- 在项目根目录创建 lib 目录,用于存放当前项目所需的 jar 包,并将驱动 jar 复制到该目 录下
- 选择 jar 包,右键执行 buildpath-AddtoBuildPath(添加到编译目录
加载并注册数据库驱动
DriverManager.registerDriver(new Driver());
获取连接对象 Connection
String url = “jdbc:mysql://localhost:3306/mydb1”;
Connection conn = DriverManager.getConnection(url, “root”, “root”);
通过 Connection 对象获取 Statement 对象
Statement st = conn.createStatement();
使用 Statement 执行 SQL 语句
String sql = “SELECT * FROM user”;
ResultSet rs = st.executeQuery(sql);
遍历返回的结果集
//获取一个值
boolean flag = rs.next();//向下移动,true 代表有下一个记录
System.out.println(flag);
//循环获取所有的数据
while(rs.next()){
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
System.out.println("id" + id + " " + username +" " + password);
}
关闭资源
//释放资源 后打开的先关闭
rs.close();
st.close();
conn.close();
完整代码
public void t1() throws SQLException{
//注册驱动
DriverManager.registerDriver(new Driver());
//获取连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/firstjdbc","root","root");
//通过connection对象获取Statement对象,其作用是操作SQL
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select * from user");//SELECT * FROM USER
while(rs.next()){
int i = rs.getInt("uid");
String j = rs.getString(2);
System.out.println(i+" "+j);
}
rs.close();
st.close();
con.close();
}
JDBC类介绍
Driver接口
该接口是所有 JDBC 程序必须实现的接口,该接口专门提供给数据库产商使用。
DriverManger 类
该类用于加载 JDBC 驱动并创建数据库的连接
- registerDriver(java.sql.Driverdriver):注册 JDBC
- getConnection(Stringurl,Stringuser,Stringpassword):用于建立和数据库的连接,并返回 表示连接的 Connection 对象
Connection 接口
Connection 接口代表 Java 程序和数据库的连接
- getMetaData():返回表示数据库源数据的 DatabaseMetaData 对象
- createStatement():创建一个 Statement 对象来将 SQL 语句发送到数据库
- prepareStatement(Stringsql):创建 PreparedStatement 对象来将参数化的 SQL 语句发送 到数据库
Statement 接口
用于向数据库发送 SQL 语句
- insertupdatedelete()
- intexecuteUpdate(Stringsql):利用返回值判断非 0 来确定 sql 语句是否执行成功。
- ResultSetexecuteQuery(Stringsql):可以通过 execute 方法来执行任何 sql 语句.
- execute(Stringsql):用于向数据库发送任意 sq
ResultSet
java.sql.ResultSet 它是用于封装 select 语句执行后查询的结果。
- next()方法:用于判断是否有下一条记录。如果有返回 true,并且让游标向下移动一行。如果没有返回 false.
- 可以通过 ResultSet 提供的 getXxx()方法来获取当前游标指向的这条记录中的列数据。
getInt()
getString()
getDate()
getDouble()
参数有两种
getInt(intcolumnIndex);
getInt(StringcolumnName);
如果列的类型不知道,可以通过下面的方法来操作
getObject(intcolumnIndex);
getObject(StringcolumnName);
JDBC 增删改查操作
- 查询
查询类型
查询全部
条件查询—根据 id
查询全部
public void t1() throws SQLException{
//注册驱动
DriverManager.registerDriver(new Driver());
//获取连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/firstjdbc","root","root");
//通过connection对象获取Statement对象,其作用是操作SQL
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select * from user");//SELECT * FROM USER
while(rs.next()){
int i = rs.getInt("uid");
String j = rs.getString(2);
System.out.println(i+" "+j);
}
rs.close();
st.close();
con.close();
}
根据ID查询
public void t5() throws Exception{
String url = "jdbc:mysql://localhost:3306/firstjdbc";
String user = "root";
String pass = "root";
DriverManager.registerDriver(new Driver());
Connection con = DriverManager.getConnection(url, user, pass);
Statement st = con.createStatement();
st.executeQuery("select * from user where uid = 1");
ResultSet rs = st.getResultSet();
while(rs.next()){
System.out.println(rs.getString("uname"));
}
rs.close();
st.close();
con.close();
}
添加数据
public void t2() throws SQLException{
DriverManager.registerDriver(new Driver());
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/firstjdbc", "root", "root");
Statement st = con.createStatement();
st.executeUpdate("insert into user values(3,'王五',18,'就这玩意')");
ResultSet rs = st.executeQuery("select * from user");
while(rs.next()){
System.out.println(rs.getString("udes"));
}
rs.close();
st.close();
con.close();
}
修改数据
public void t3() throws Exception{
DriverManager.registerDriver(new Driver());
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/firstjdbc","root","root");
Statement st = con.createStatement();
st.executeUpdate("update user set uage = 20 where uid = 1");
st.close();
con.close();
}
删除数据
public void t4() throws SQLException{
DriverManager.registerDriver(new Driver());
String url = "jdbc:mysql://localhost:3306/firstjdbc";
String username = "root";
String userpass = "root";
Connection con = DriverManager.getConnection(url,username,userpass);
Statement st = con.createStatement();
String sql = "delete from user where uid = 2";
st.executeUpdate(sql);
st.close();
con.close();
}
编写 JDBC 工具类
基于上面的增删改查示例,每次进行操作都需要【获取连接】【释放资源】,这两部分代码 重复了,那么可以考虑对其进行优化,将【获取连接】和【释放资源】的代码抽取到单独的
示例代码
public class JDBCutils {
private static String classname;
private static String url;
private static String user;
private static String pass;
static {
FileReader fr = null;
Properties p = new Properties();
try {
fr = new FileReader("JDBC.properties");
p.load(fr);
classname = p.getProperty("classname");
url = p.getProperty("url");
user = p.getProperty("user");
pass = p.getProperty("pass");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(fr!=null){
try {
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static Connection getConnection(){
Connection con = null;
try {
Class.forName(classname);
con = DriverManager.getConnection(url, user, pass);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
public static void relase(Connection con,Statement st,ResultSet rs){
try {
con.close();
st.close();
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Demo {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Connection con = JDBCutils.getConnection();
Statement st = con.createStatement();
String sql = "select * from user";
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("uname"));
}
JDBCutils.relase(con, st, rs);
}
}
该代码使用了Properties 配置文件
Properties 介绍
Properties 继承自 Hashtable,说明其是以键与值的方式存在的,只是 Properties 的 键与值都是必须是字符串类型的数据。 Properties 常被用于配置文件的写入与读取, 配置文件中记录着程序的各项参数信息,使用程序的用户可以自定义某些参数,以 达到软件的个性化。
配置文件 jdbc.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb1
username=root
password=root