JDBC对象详解DriverManager&Connection&Statement
1.DriverManager
驱动管理对象
功能:
(1)注册驱动,告诉程序该使用哪个数据库驱动jar
static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager
写代码使用:Class.forName("com.mysql.jdbc.Driver");
将Driver类加载进内存,就有一些代码会被自动执行(Driver类中有一些静态代码块的存在)
通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块

注意:MySQL5之后的驱动jar包可以省略注册驱动的步骤,因为在这个java.sql.Driver中已经写好了。

(2)获取数据库连接
- 方法: static Connection getConnection(String url, String user, String password)
- 参数:
- url:指定连接的路径,语法:jdbc:mysql://ip地址(域名):端口号/数据库名称,即:JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…
- 例子:jdbc:mysql://localhost:3306/db3
- 如果连接的是本机的mysql服务器,并且mysql服务默认的端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
- user:用户名
- password:密码
- url:指定连接的路径,语法:jdbc:mysql://ip地址(域名):端口号/数据库名称,即:JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…
String url = "jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=false"; // mysql端口默认3306 // 协议://主机地址:端口号/数据库名?参数1&参数2&参数3 // oracle默认端口1521 // jdbc:oracle:thin:@localhost:1521:sid
2.Connection
数据库连接对象
代表了当前的代码与数据库之间的桥梁
功能:
(1)获取执行sql的对象,创建一个Statement对象,用于将SQL语句发送到数据库。
- Statement createStatement()
- PreparedStatement prepardStatement(String sql)
(2)管理事务
- 开启事务:void setAutoCommit(boolean autoCommit) 调用该方法设置参数为false,即开启事务
- 提交事务:void commit()
- 回滚事务:void rollback()
3.Statement
执行Sql的对象
jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
- Statement对象的executeUpdate方法,用于向数据库发送增删改查的sql语句。
- executeUpdate执行完后,将会返回一个整数(即增删改查语句导致了数据库几行数据发生了变化)。
- Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。
statement.executeQuery(); // 查询操作返回ResultSet statement.execute(); // 执行任何sql statement.executeUpdate(); // 更新,插入,删除,都是用这个,返回一个受影响的行数 statement.executeBatch(); // 批量执行多个sql
CRUD操作-create
使用executeUpdate(String sql)方法完成数据添加操作,示例如下:
Statement st = conn.createStatement();
String sql = "insert into user(...) values(...)";
int num = st.executeUpdate(sql);
if(num>0){
System.out.println("插入成功!!!");
}
CRUD操作-delete
使用executeUpdate(String sql)方法完成数据删除操作,示例操作:
Statement st = conn.createStatement();
String sql = "delete from user where id=1";
int num = st.executeUpdate(sql);
if(num>0){
System.out.println("删除成功!!!");
}
CRUD操作-update
使用executeUpdate(String sql)方法完成数据更新操作,示例操作:
Statement st = conn.createStatement();
String sql = "update user set name='' where name=''";
int num = st.executeUpdate(sql);
if(num>0){
System.out.println("修改成功!!!");
}
CRUD操作-read
使用executeQuery(String sql)方法完成数据查询操作,示例操作:
Statement st = conn.createStatement();
String sql = "select * from user where id=1";
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
// 根据获取列的数据类型,分别调用rs的相应方法映射到java对象中
}
代码实现
(1)提取工具类
db.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false username=root password=123456
注意:这里有个坑,一定要把db.properties放在src目录下,不然classload的范围有局限,导致一直加载不到

JdbcUtils.java
package cn.company.jdbc.utils;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JdbcUtils {
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
static {
try {
InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
System.out.println(inputStream);
Properties properties = new Properties();
properties.load(inputStream);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
System.out.println(url);
// 驱动只用加载一次
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,username,password);
}
// 释放连接
public static void releaseConnection(Connection connection, Statement statement, ResultSet resultSet)
throws SQLException {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
}
}
(2)编写增删改的方法,executeUpdate
增:
package cn.company.jdbc;
import cn.company.jdbc.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestInsert {
public static void main(String[] args) throws SQLException {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection(); // 获取数据库连接
statement = connection.createStatement();
String sql = "INSERT INTO users VALUES(4,'kuanghen','123456','2435579944@qq.com','2020-02-01')";
int i = statement.executeUpdate(sql);
if (i > 0) {
System.out.println("插入成功!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.releaseConnection(connection, statement, resultSet);
}
}
}
数据库jdbcStudy的users表中增加了一条信息

删:
package cn.company.jdbc;
import cn.company.jdbc.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestDelete {
public static void main(String[] args) throws SQLException {
Connection connection = null;
Statement statement = null;
ResultSet rs = null;
try {
connection = JdbcUtils.getConnection();
statement = connection.createStatement();
String sql = "DELETE FROM users WHERE id='4'";
int i = statement.executeUpdate(sql);
if (i > 0) {
System.out.println("删除成功!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.releaseConnection(connection, statement, rs);
}
}
}
改:
package cn.company.jdbc;
import cn.company.jdbc.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestUpdate {
public static void main(String[] args) throws SQLException {
Connection conn = null;
Statement statement = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
statement = conn.createStatement();
String sql = "update users set name='kuangshen',email='123@163.com' WHERE id='1'";
int i = statement.executeUpdate(sql);
if (i > 0) {
System.out.println("修改成功!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.releaseConnection(conn, statement, rs);
}
}
}
修改结果:

查:
package cn.company.jdbc;
import cn.company.jdbc.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestSelect {
public static void main(String[] args) throws SQLException {
Connection conn = null;
Statement statement = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
statement = conn.createStatement();
String sql = "select * from users";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
System.out.println("id="+resultSet.getObject("id") +
",name="+resultSet.getObject("name"));
System.out.println("---------");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.releaseConnection(conn,statement, rs);
}
}
}

4.Resultset
结果集对象
封装查询结果
(1)next():游标向下移动一行
(2)getXxx(参数):获取数据
Xxx:代表数据类型,如getInt() 会返回int型值,getString() 会返回String类型
参数有两种情况:
可以接受int:代表列的编号,从1开始。如,getString(1)
可以接受String:代表列的名称。如:getDouble("name")
5.PreparedStatement
执行sql的对象(功能比Statement强)

浙公网安备 33010602011771号