DriverManager 类中的静态方法
|
描述
|
Connection getConnection (String url, String user, String password)
|
通过连接字符串,用户名,密码来得到数据
库的连接对象
|
Connection getConnection (String url, Properties info)
|
通过连接字符串,属性对象来得到连接对象
|
JDBC 连接数据库的四个参数
|
说明
|
用户名
|
登录的用户名
|
密码
|
登录的密码
|
连接字符串 URL
|
不同的数据库 URL 是不同的,mysql 的写法
jdbc:mysql://localhost:3306/数据库[?参数名=参数值]
|
驱动类的字符串名
|
com.mysql.jdbc.Driver
|
Connection 接口中的方法
|
描述
|
Statement createStatement()
|
创建一条 SQL 语句对象
|
Statement 接口中的方法
|
描述
|
int executeUpdate(String sql)
|
用于发送 DML 语句,增删改的操作,insert、update、delete
参数:SQL 语句
返回值:返回对数据库影响的行数
|
ResultSet executeQuery(String sql)
|
用于发送 DQL 语句,执行查询的操作。select
参数:SQL 语句
返回值:查询的结果集
|
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 创建一张学生表
*/
public class Demo4DDL {
public static void main(String[] args) {
//1. 创建连接
Connection conn = null;
Statement statement = null;
try {
conn = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root");
//2. 通过连接对象得到语句对象
statement = conn.createStatement();
//3. 通过语句对象发送 SQL 语句给服务器
//4. 执行 SQL
statement.executeUpdate("create table student (id int PRIMARY key auto_increment, " +
"name varchar(20) not null, gender boolean, birthday date)");
//5. 返回影响行数(DDL 没有返回值)
System.out.println("创建表成功");
} catch (SQLException e) {
e.printStackTrace();
}
//6. 释放资源
finally {
//关闭之前要先判断
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
} }
ResultSet 接口中的方法
|
描述
|
boolean next()
|
1) 游标向下移动 1 行
2) 返回 boolean 类型,如果还有下一条记录,返回 true,否则返回 false
|
数据类型 getXxx()
|
1) 通过字段名,参数是 String 类型。返回不同的类型
2) 通过列号,参数是整数,从 1 开始。返回不同的类型
|
7.3、常用数据类型转换表
SQL 类型
|
Jdbc 对应方法
|
返回类型
|
BIT(1) bit(n)
|
getBoolean()
|
boolean
|
TINYINT
|
getByte()
|
byte
|
SMALLINT
|
getShort()
|
short
|
INT
|
getInt()
|
int
|
BIGINT
|
getLong()
|
long
|
CHAR,VARCHAR
|
getString()
|
String
|
Text(Clob) Blob
|
getClob getBlob()
|
Clob Blob
|
DATE
|
getDate()
|
java.sql.Date 只代表日期
|
TIME
|
getTime()
|
java.sql.Time 只表示时间
|
TIMESTAMP
|
getTimestamp()
|
java.sql.Timestamp 同时有日期和时间
|
import java.sql.*;
/**
* 查询所有的学生信息
*/
public class Demo6DQL {
public static void main(String[] args) throws SQLException {
//1. 创建连接
Connection conn = null;
Statement statement = null;
try {
String url = "jdbc:mysql://localhost:3306/test02";
conn =DriverManager.getConnection(url,"root","123456");
//2. 通过连接对象得到语句对象
statement=conn.createStatement();
//3. 通过语句对象发送 SQL 语句给服务器
//4. 执行 SQL
ResultSet rs= statement.executeQuery("select * FROM app08_publisher");
while (rs.next()){
int i= rs.getInt("id");
String publish=rs.getString("name");
System.out.println("编号:"+i+",出版社名称:"+publish);
}
} catch (SQLException e)
{
e.printStackTrace();
}
finally {
//关闭之前要先判断
if(statement != null){
try
{
statement.close();
}
catch (SQLException e){
e.printStackTrace();
}
}
if(conn != null){
try{
conn.close();
}
catch (SQLException e){
e.printStackTrace();
}
}
}
}
}
}
8、PreparedStatement 接口
1) 因为有预先编译的功能,提高 SQL 的执行效率。
Connection 接口中的方法
|
描述
|
PreparedStatement prepareStatement(String sql)
|
指定预编译的 SQL 语句,SQL 语句中使用占位符?
创建一个语句对象
|
8.3、PreparedStatement 接口中的方法:
PreparedStatement 接口中的方法
|
描述
|
int executeUpdate()
|
执行 DML,增删改的操作,返回影响的行数。
|
ResultSet executeQuery()
|
执行 DQL,查询的操作,返回结果集
|
8.4、PreparedSatement 的好处
PreparedStatement 中设置参数的方法
|
描述
|
void setDouble(int parameterIndex, double x)
|
将指定参数设置为给定 Java double 值。
|
void setFloat(int parameterIndex, float x)
|
将指定参数设置为给定 Java int 值。
|
void setInt(int parameterIndex, int x)
|
将指定参数设置为给定 Java int 值。
|
void setLong(int parameterIndex, long x)
|
将指定参数设置为给定 Java long 值。
|
void setObject(int parameterIndex, Object x)
|
使用给定对象设置指定参数的值。
|
void setString(int parameterIndex, String x)
|
将指定参数设置为给定 Java String 值。
|
import com.itheima.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
/**
* 使用 PreparedStatement
*/
public class test {
//从控制台上输入的用户名和密码
public static void main(String[] args) throws SQLException {
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
login(name, password);
}
private static void login(String name, String password) throws SQLException {
Connection connection = JdbcUtils.getConnection();
//写成登录 SQL 语句,没有单引号
String sql = "select * from user where name=? and password=?";
//得到语句对象
PreparedStatement ps = connection.prepareStatement(sql);
//设置参数
ps.setString(1, name);
ps.setString(2,password);
ResultSet resultSet = ps.executeQuery();
if (resultSet.next()) {
System.out.println("登录成功:" + name);
}
else {
System.out.println("登录失败");
}
//释放资源,子接口直接给父接口
JdbcUtils.close(connection,ps,resultSet);
}
}
9、JDBC 事务的处理
Connection 接口中与事务有关的方法
|
说明
|
void setAutoCommit(boolean autoCommit)
|
参数是 true 或 false
如果设置为 false,表示关闭自动提交,相当于开启事务
|
void commit()
|
提交事务
|
void rollback()
|
回滚事务
|
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class test {
//没有异常,提交事务,出现异常回滚事务
public static void main(String[] args) {
//1) 注册驱动
Connection connection = null;
PreparedStatement ps = null;
try {
//2) 获取连接
connection = JdbcUtils.getConnection();
//3) 开启事务
connection.setAutoCommit(false);
//4) 获取到 PreparedStatement
//从 jack 扣钱
ps = connection.prepareStatement("update account set balance = balance = ? where name=?");
ps.setInt(1, 500);
ps.setString(2,"Jack");
ps.executeUpdate();
//出现异常
System.out.println(100 / 0);
//给 rose 加钱
ps = connection.prepareStatement("update account set balance = balance + ? where name=?");
ps.setInt(1, 500);
ps.setString(2,"Rose");
ps.executeUpdate();
//提交事务
connection.commit();
System.out.println("转账成功");
} catch (Exception e) {
e.printStackTrace();
try {
//事务的回滚
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
System.out.println("转账失败");
}
finally {
//7) 关闭资源
JdbcUtils.close(connection,ps);
}
}
}
DriverManager 类中的静态方法
|
描述
|
Connection getConnection (String url, String user, String password)
|
通过连接字符串,用户名,密码来得到数据
库的连接对象
|
Connection getConnection (String url, Properties info)
|
通过连接字符串,属性对象来得到连接对象
|
JDBC 连接数据库的四个参数
|
说明
|
用户名
|
登录的用户名
|
密码
|
登录的密码
|
连接字符串 URL
|
不同的数据库 URL 是不同的,mysql 的写法
jdbc:mysql://localhost:3306/数据库[?参数名=参数值]
|
驱动类的字符串名
|
com.mysql.jdbc.Driver
|
Connection 接口中的方法
|
描述
|
Statement createStatement()
|
创建一条 SQL 语句对象
|
Statement 接口中的方法
|
描述
|
int executeUpdate(String sql)
|
用于发送 DML 语句,增删改的操作,insert、update、delete
参数:SQL 语句
返回值:返回对数据库影响的行数
|
ResultSet executeQuery(String sql)
|
用于发送 DQL 语句,执行查询的操作。select
参数:SQL 语句
返回值:查询的结果集
|
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 创建一张学生表
*/
public class Demo4DDL {
public static void main(String[] args) {
//1. 创建连接
Connection conn = null;
Statement statement = null;
try {
conn = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root");
//2. 通过连接对象得到语句对象
statement = conn.createStatement();
//3. 通过语句对象发送 SQL 语句给服务器
//4. 执行 SQL
statement.executeUpdate("create table student (id int PRIMARY key auto_increment, " +
"name varchar(20) not null, gender boolean, birthday date)");
//5. 返回影响行数(DDL 没有返回值)
System.out.println("创建表成功");
} catch (SQLException e) {
e.printStackTrace();
}
//6. 释放资源
finally {
//关闭之前要先判断
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
} }
ResultSet 接口中的方法
|
描述
|
boolean next()
|
1) 游标向下移动 1 行
2) 返回 boolean 类型,如果还有下一条记录,返回 true,否则返回 false
|
数据类型 getXxx()
|
1) 通过字段名,参数是 String 类型。返回不同的类型
2) 通过列号,参数是整数,从 1 开始。返回不同的类型
|
7.3、常用数据类型转换表
SQL 类型
|
Jdbc 对应方法
|
返回类型
|
BIT(1) bit(n)
|
getBoolean()
|
boolean
|
TINYINT
|
getByte()
|
byte
|
SMALLINT
|
getShort()
|
short
|
INT
|
getInt()
|
int
|
BIGINT
|
getLong()
|
long
|
CHAR,VARCHAR
|
getString()
|
String
|
Text(Clob) Blob
|
getClob getBlob()
|
Clob Blob
|
DATE
|
getDate()
|
java.sql.Date 只代表日期
|
TIME
|
getTime()
|
java.sql.Time 只表示时间
|
TIMESTAMP
|
getTimestamp()
|
java.sql.Timestamp 同时有日期和时间
|
import java.sql.*;
/**
* 查询所有的学生信息
*/
public class Demo6DQL {
public static void main(String[] args) throws SQLException {
//1. 创建连接
Connection conn = null;
Statement statement = null;
try {
String url = "jdbc:mysql://localhost:3306/test02";
conn =DriverManager.getConnection(url,"root","123456");
//2. 通过连接对象得到语句对象
statement=conn.createStatement();
//3. 通过语句对象发送 SQL 语句给服务器
//4. 执行 SQL
ResultSet rs= statement.executeQuery("select * FROM app08_publisher");
while (rs.next()){
int i= rs.getInt("id");
String publish=rs.getString("name");
System.out.println("编号:"+i+",出版社名称:"+publish);
}
} catch (SQLException e)
{
e.printStackTrace();
}
finally {
//关闭之前要先判断
if(statement != null){
try
{
statement.close();
}
catch (SQLException e){
e.printStackTrace();
}
}
if(conn != null){
try{
conn.close();
}
catch (SQLException e){
e.printStackTrace();
}
}
}
}
}
}
8、PreparedStatement 接口
1) 因为有预先编译的功能,提高 SQL 的执行效率。
Connection 接口中的方法
|
描述
|
PreparedStatement prepareStatement(String sql)
|
指定预编译的 SQL 语句,SQL 语句中使用占位符?
创建一个语句对象
|
8.3、PreparedStatement 接口中的方法:
PreparedStatement 接口中的方法
|
描述
|
int executeUpdate()
|
执行 DML,增删改的操作,返回影响的行数。
|
ResultSet executeQuery()
|
执行 DQL,查询的操作,返回结果集
|
8.4、PreparedSatement 的好处
PreparedStatement 中设置参数的方法
|
描述
|
void setDouble(int parameterIndex, double x)
|
将指定参数设置为给定 Java double 值。
|
void setFloat(int parameterIndex, float x)
|
将指定参数设置为给定 Java int 值。
|
void setInt(int parameterIndex, int x)
|
将指定参数设置为给定 Java int 值。
|
void setLong(int parameterIndex, long x)
|
将指定参数设置为给定 Java long 值。
|
void setObject(int parameterIndex, Object x)
|
使用给定对象设置指定参数的值。
|
void setString(int parameterIndex, String x)
|
将指定参数设置为给定 Java String 值。
|
import com.itheima.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
/**
* 使用 PreparedStatement
*/
public class test {
//从控制台上输入的用户名和密码
public static void main(String[] args) throws SQLException {
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
login(name, password);
}
private static void login(String name, String password) throws SQLException {
Connection connection = JdbcUtils.getConnection();
//写成登录 SQL 语句,没有单引号
String sql = "select * from user where name=? and password=?";
//得到语句对象
PreparedStatement ps = connection.prepareStatement(sql);
//设置参数
ps.setString(1, name);
ps.setString(2,password);
ResultSet resultSet = ps.executeQuery();
if (resultSet.next()) {
System.out.println("登录成功:" + name);
}
else {
System.out.println("登录失败");
}
//释放资源,子接口直接给父接口
JdbcUtils.close(connection,ps,resultSet);
}
}
9、JDBC 事务的处理
Connection 接口中与事务有关的方法
|
说明
|
void setAutoCommit(boolean autoCommit)
|
参数是 true 或 false
如果设置为 false,表示关闭自动提交,相当于开启事务
|
void commit()
|
提交事务
|
void rollback()
|
回滚事务
|
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class test {
//没有异常,提交事务,出现异常回滚事务
public static void main(String[] args) {
//1) 注册驱动
Connection connection = null;
PreparedStatement ps = null;
try {
//2) 获取连接
connection = JdbcUtils.getConnection();
//3) 开启事务
connection.setAutoCommit(false);
//4) 获取到 PreparedStatement
//从 jack 扣钱
ps = connection.prepareStatement("update account set balance = balance = ? where name=?");
ps.setInt(1, 500);
ps.setString(2,"Jack");
ps.executeUpdate();
//出现异常
System.out.println(100 / 0);
//给 rose 加钱
ps = connection.prepareStatement("update account set balance = balance + ? where name=?");
ps.setInt(1, 500);
ps.setString(2,"Rose");
ps.executeUpdate();
//提交事务
connection.commit();
System.out.println("转账成功");
} catch (Exception e) {
e.printStackTrace();
try {
//事务的回滚
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
System.out.println("转账失败");
}
finally {
//7) 关闭资源
JdbcUtils.close(connection,ps);
}
}
}