- DriverManager : 驱动管理对象
- Connection : 数据库连接对象
- Statement : 执行sql的对象
- ResultSet : 结果集对象
- Preparedstatement : 执行sql的对象
DriverManager
驱动管理对象
功能
注册驱动
注册驱动:告诉程序该使用哪一个数据库驱动jar
DriverManager类中注册驱动的静态方法:
-
static void registerDriver(Driver driver, DriverAction da)
注册与给定的驱动程序DriverManager
。
写代码时使用的:Class.forName("com.mysql.jdbc.Driver");
查看com.mysql.jdbc.Driver
类中存在静态代码块(静态代码块会在类被加载时就自动执行了)
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
注意:mysql5版本及之后的jar包可以省略注册驱动的步骤。
获取数据库连接
DriverManager类中的方法:
-
static Connection
getConnection(String url, String user, String password)
尝试建立与给定数据库URL的连接。- 参数:
-
url:指定连接的路径(这里的语法是MySQL的)
-
语法:
jdbc:mysql//ip地址(域名):端口号//数据库名称 如果是连接本地的mysql服务器,且端口号是3306,则可以简写为jdbc:mysql:///数据库名称
-
-
user:用户名(例如:root)
-
password:密码
Connection
这是一个interface
数据库连接对象
功能
获取执行SQL的对象
Connection的两个方法来获取Statement和PrepareStatement:
-
Statement createStatement()
创建一个Statement
对象,用于将SQL语句发送到数据库。 -
PreparedStatement prepareStatement(String sql)
创建一个PreparedStatement
对象,用于将参数化的SQL语句发送到数据库。
管理事务
- 开启事务:
void setAutoCommit(boolean autoCommit)
将此连接的自动提交模式设置为给定状态。(false为开启事务) - 提交事务:
void commit()
使自上次提交/回滚以来所做的所有更改都将永久性,并释放此Connection
对象当前持有的任何数据 库锁。 - 回滚事务:
void rollback()
撤消在当前事务中所做的所有更改,并释放此Connection
对象当前持有的任何数据库锁。
Statement
用于执行静态SQL语句并返回其生成的结果的对象。
执行SQL语句
boolean execute(String sql)
: 可以执行任意的sql (了解)int elxecuteUpdate(String sql)
: 执行DML (insert、 update、 delete) 语句、DDL(create, alter、drop) 语句
- 返回值 : 影响的行数,可以通过这个影响的行数判断DML语句是否执行成功返回值>0的则执行成功,反之,则失败。
ResultSet executeQuery(String sql)
: 执行DQL (select)语句
import java.sql.*;
public class JDBCDemo02 {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
try {
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// SQL语句
String sql = "insert into account values(null,'余尚烨',100000);";
// 获取Connection对象
connection = DriverManager.getConnection("jdbc:mysql:///test1", "root", "maj6226543");
// 获取Statement对象
statement = connection.createStatement();
// 执行SQL语句
int count = statement.executeUpdate(sql); // 返回的是改的行数
System.out.println(count);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
ResultSet
结果集对象
ResultSet接口的方法:
-
boolean next()
: 游标向下移动一行。 -
boolean previous()
: 游标向上移动一行。注意:
ResultSet
光标最初位于第一行之前;第一次调用方法next
使第一行成为当前行;第二个调用使第二行成为当前行,依此类推。- 当调用
next
方法返回false
时,光标位于最后一行之后。
-
xxx getxxx (参数)
: 获取数据 (这泛指getxxx系列de方法)- xxx∶ 代表数据类型如 :
int getInt()
,string getstring()
- 参数∶
- int : 代表列的编号, 从1开始 如 :
getstring(1)
- string : 代表列名称。如 :
getDouble( "balance")
- int : 代表列的编号, 从1开始 如 :
- xxx∶ 代表数据类型如 :
import java.sql.*;
public class JDBCDemo04 {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql:///test1", "root", "maj6226543");
statement = connection.createStatement();
String sql = "select * from account;";
resultSet = statement.executeQuery(sql);
while (resultSet.next()) { // 判断下一行是否有数据
int id = resultSet.getInt(1); // 获取第一列数据
String name = resultSet.getString("name"); // 获取字段为name的数据
double money = resultSet.getDouble(3); // 获取第三列的数据
System.out.println(id + "---" + name + "---" + money);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
JDBC工具类
自己做的JDBC工具类
/* jdbc.properties文件 */
url=jdbc:mysql:///test1
user=root
password=maj6226543
driver=com.mysql.jdbc.Driver
/* JDBCUtils.java */
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
static {
try {
Properties properties = new Properties();
// 获取当前路径---->ClassLoader
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL resource = classLoader.getResource("jdbc.properties");
String path = resource.getPath();
// properties.load(new FileReader("src\\com\\jdbc.properties"));
properties.load(new FileReader(path));
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
driver = properties.getProperty("driver");
Class.forName(driver);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
/*
* 获取连接
* @return 连接对象
* */
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
public static void close(Statement stmt, Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet res, Statement stmt, Connection conn) {
if (res != null) {
try {
res.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
PreparedStatement
- 表示预编译的SQL语句的对象。
-
执行SQL的对象
-
用来解决SQL注入的问题
-
参数使用 ? 作为占位符
步骤:
-
导入驱动jar包
-
注册驱动
-
获取数据库连接对象 Connection
-
定义sql
- 这里要使用 ? 占位符。如:
select * from users where user = ? and password = ?;
- 这里要使用 ? 占位符。如:
-
获取执行sql语句的对象 PreparedStatement
-
这里用Connection的一个方法:
PreparedStatement prepareStatement(String sql)
-
将SQL语句的String传入
-
-
给 ?赋值
- PreparedStatement的
void setxxx(参数1, 参数2)
系列的方法- xxx:是数据类型
- 参数1:?的索引位置(从1开始)
- 参数2:需要的值
- PreparedStatement的
-
执行sql , 接受返回结果
-
处理结果
-
释放资源
import java.sql.*;
public class JDBCDemo05 {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取数据库连接对象,Connection
connection = DriverManager.getConnection("jdbc:mysql:///test1", "root", "maj6226543");
// SQL语句
String sql = "select * from account where id = ?";
// 获取执行SQL语句对象(PreparedStatement),并预执行SQL语句
preparedStatement = connection.prepareStatement(sql);
// 给?赋值
preparedStatement.setString(1,"1"); // 设置?的值
// 执行SQL语句(查询select语句,返回ResultSet类型的对象)
resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
System.out.println(resultSet.getString("name"));
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}