JDBC学习
1.JDBC入门
1.1什么是JDBC
JDBC 规范定义接口,具体的实现由各大数据库厂商来实现。
JDBC是Java访问数据库的标准规范,真正操作数据库还需要具体实现类,也就是数据库驱动。每个数据库厂商根据自家数据库通信格式编写自家的数据库驱动。所以我们只需调用JDBC接口中的方法即可,数据库驱动有数据库厂商提供。
1.2使用JDBC好处
1)程序员如果要开发访问数据库的程序,只需要会调用JDBC接口中的方法即可,不用关注类是如何实现的。
2)使用同一套java代码,进行少量的修改就以访问其他JDBC支持的数据库。
1.3使用JDBC开发用到的包
会使用到的包 | 说明 |
---|---|
java.sql | 所有与JDBC访问数据库相关的接口和类 |
javax.sql | 数据库扩展包,提供数据库额外功能。如:连接池 |
数据库驱动 | 有各大数据库厂商提供,需要额外去下载,是对JDBC接口实现的类 |
1.4JDBC的核心API
接口或类 | 作用 |
---|---|
DriverManager 类 | 1)管理和注册数据库驱动 2)得到数据库连接对象 |
Connection 接口 | 一个连接,可用于创建Statement和PreparedStatement对像 |
Statement 接口 | 一个SQL语句对象,用于发送给数据库服务器 |
PreparedStatement 接口 | 一个SQL语句对象,是Statement的子接口 |
ResultSet 接口 | 封装数据库查询的结果集,对结果集进行遍历,取出每一条记录 |
1.5注册驱动
加载驱动或注册驱动的方法 | 描述 |
---|---|
Class.forName(数据库驱动实现类) | 要求JVM查找并加载指定的类,数据库驱动由mysql厂商"com.mysql.jdbc.Driver" |
- 注:从JDBC3开始,目前已经普遍使用的版本。可以不用注册驱动而直接使用。Class.forName这句话可以省略。
2.DriverManager类
2.1 DriverManager 作用:
1)管理和注册驱动
2)创建数据库的连接
2.2类中的方法:
DriverManage 类中的静态方法 | 描述 |
---|---|
Connection getConnection(String url,String user,String password) | 通过连接字符串,用户名,密码来得到数据库连接对象 |
Connection getConnection (String url,Properties info) | 通过连接字符串,属性对象来得到连接对象 |
2.3使用JDBC连接数据库的四个参数
JDBC连接数据库的四个参数 | 说明 |
---|---|
用户名 | 登录的用户名 |
密码 | 登录的密码 |
连接字符串URL | 不同的数据库URL是不同,mysql的写法jdbc:mysql://localhost:3306/数据库[?参数名=参数值] |
驱动类的字符串名 | com.mysql.jdbc.Driver |
2.4 连接数据库的URL地址格式
协议名:子协议://服务器名或IP地址:端口号/数据库名?参数=参数名
2.4.1MySQL写法
2.4.2 MySQL中可以简写
前提:必须是本地服务器,端口号是3306
jdbc:mysql:///数据库名
2.4.3乱码的处理
如果数据库出现乱码,可以指定参数: ?characterEncoding=utf8,表示让数据库以 UTF-8 编码来处理数据
jdbc:mysql://localhost:3306/数据库?characterEncoding=utf8
2.5案例:得到MySQL的数据库连接对象
1)使用用户名、密码、URL得到连接对象
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @description
* @author: yyq
*/
public class JDBC {
public static void main(String[] args) throws SQLException {
String url = "jdbc:mysql://localhost:3306/jdbc";
Connection connection = DriverManager.getConnection(url, "root", "123456");
//com.mysql.jdbc.JDBC4Connection@31221be2
System.out.println(connection);
}
}
2)使用属性文件和url得到连接对象
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
/**
* @description
* @author: yyq
*/
public class JDBC {
public static void main(String[] args) throws SQLException {
String url = "jdbc:mysql://localhost:3306/jdbc";
Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password","123456");
Connection connection = DriverManager.getConnection(url, info);
//com.mysql.jdbc.JDBC4Connection@31221be2
System.out.println(connection);
}
}
3.Connection接口
3.1 connection作用
connection 接口,具体的实现类由数据库厂商实现,代表一个连接对象。
3.2Connection 方法
connection接口中的方法 | 描述 |
---|---|
Statement createStatement() | 创建一条SQL语句对象 |
4. Statement接口
4.1 JDBC访问数据库步骤
1)注册和加载驱动(可以省略)
2)获取连接
3)Connection获取Statement
4)使用Statement对象执行对象
5)返回结果集
6)释放资源
4.2 Statement作用
代表一条语句对象,用于发送SQL语句给服务器,要用于执行静态SQL语句并返回它所生成结果集的对象
4.3 Statement中的对象方法
Statement接口中的方法 | 描述 |
---|---|
int executeUpdate(String sql) | 用于发送DML语句,增删改的操作,insert、update、delete 参数:SQL语句 返回值:返回对数据库影响的行数 |
ResultSet executeQuery(String sql) | 用于发送DQL语句,执行查询的操作。select 参数:SQL语句 返回值:查询的结果集 |
4.4 释放资源
1)需要释放的对象:ResultSet结果集,Statement语句,Connection 连接
2)释放原则:先开的后关,后开的先关。 ResultSet ->Statement ->Connection
- 放在哪个代码中:finally 块
4.5 执行DDL操作
4.5.1需求:使用JDBC在MySQL的数据库中创建一张学生表
4.5.2代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* @description
* @author: yyq
*/
public class JDBC {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf8";
Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password","123456");
Connection connection=null;
Statement statement=null;
try {
//1.创建连接
connection = DriverManager.getConnection(url, info);
//2.通过连接对象获取语句对象
statement=connection.createStatement();
//3.通过语句对象发送SQL语句给服务器
//4.执行SQL
String sql="create table student(id int PRIMARY KEY auto_increment,"+
"name varchar(20) not null,gender ENUM('男','女') NOT NULL)ENGINE = INNODB DEFAULT CHARSET = utf8 ";
System.out.println(sql);
statement.executeUpdate(sql);
//5.返回影响行数(DDL没有返回值)
System.out.println("创建表成功");
} catch (SQLException e) {
e.printStackTrace();
//6.释放资源
}finally {
//关闭之前要先判断
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
4.6执行DML操作
- 需求像学生表中添加4条记录,主键是自动增长
- 步骤
1)创建连接对象
2)创建Stamement语句对象
3)执行SQL语句:executeUpdate(sql)
4)返回影响的行数
5)释放资源
- 代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* @description
* @author: yyq
*/
public class JDBC {
public static void main(String[] args) throws SQLException {
String url = "jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf8";
Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password","123456");
Connection connection=null;
Statement statement=null;
//1.创建连接
connection = DriverManager.getConnection(url, info);
//2.通过连接对象获取语句对象
statement=connection.createStatement();
//3.通过语句对象发送SQL语句给服务器
//4.执行SQL
int count=0;
String sql="INSERT INTO student(name,gender)" +
"VALUES" +
"('yyq','男')," +
"('mm','男')," +
"('yzh','男')" ;
count=statement.executeUpdate(sql);
System.out.println("插入了" + count + "条记录");
//5.返回影响行数
System.out.println("创建表成功");
}
}
4.7执行DQL操作
4.7.1 ResultSet接口
-
作用:封装数据库查询的结果集,对结果集进行遍历,取出每一条记录
-
接口中方法:
ResultSet接口中的方法 描述 bool next() 1)游标向下移动1行
2)返回boolean类型,如果还有下一条记录,返回true,反之false数据类型 getXxx() 1)通过字段名,参数是String类型,返回不同的类型
2)通过列号,参数是整数,从1开始。返回不同的
4.7.2 常用数据类型转型表
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 | getData() | java.sql.Date 只代表日期 |
TIME | getTime() | java.sql.Time 只表示时间 |
TIMESAMP | getTimestamp() | java.sql.Timestamp同时有时间和日期 |
java.sql.Date、Time、Timestamp(时间戳),三个共同父类是:java.util.Date
4.7.3 需求:确保数据库中有3条以上的记录,查询所有的学员信息
- 步骤
1)得到连接对象
2)得到语句对象
3)执行SQL语句得到结果集ResultSet对象
4)循环遍历取出每一条记录
5)输出在控制台上
6)释放资源
import java.sql.*;
import java.util.Properties;
/**
* @description
* @author: yyq
*/
public class JDBC {
public static void main(String[] args) throws SQLException {
String url = "jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf8";
Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password","123456");
Connection connection=null;
Statement statement=null;
//1.创建连接
connection = DriverManager.getConnection(url, info);
//2.通过连接对象获取语句对象
statement=connection.createStatement();
//3.通过语句对象发送SQL语句给服务器
//4.执行SQL
ResultSet resultSet = statement.executeQuery("select * from student");
while(resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String gender = resultSet.getString("gender");
System.out.println("编号:"+id+",姓名:"+name+"性别:"+gender);
}
resultSet.close();
statement.close();
connection.close();
}
}
4.7.4 关于ResultSet 接口中的注意事项
-
如果光标在第一行之前,使用 rs.getXX()获取列值,报错:Before start of result set
-
如果光标在最后一行之后,使用 rs.getXX()获取列值,报错:After end of result set
-
使用完毕以后要关闭结果集 ResultSet,再关闭 Statement,再关闭 Connection
5. PreparedStatement
5.1继承结构与作用
PreparedStatement 是Statement 接口的子接口,继承与父接口中所有的方法。它是一个预编译的SQL语句。
5.2 PreparedStatement 的执行原理
1)因为有预先预编译功能,提高SQL的执行效率。
2)可以有效防止SQL注入问题,安全性高。
5.3 Connection 创建 PreparedStatement 对象
Connection 接口中的方法 | 描述 |
---|---|
PreparedStatement preparedStatement(String sql) | 指定预编译的SQL语句,SQL语句中使用占位符?创建一个语句对象 |
5.4 PreparedStatement 接口中的方法
PreaparedStatement接口中的方法 | 描述 |
---|---|
int executeUpdate() | 执行DML,增删改的操作,返回影响的行数 |
ResultSet executeQuery() | 执行DQL,查询的操作,返回结果集 |
5.5 PreparedStatement 的好处
- reparedStatement()会将SQL语句发送给数据库预编译。PreparedStatement会引用着预编译的结果。
可以多次传入不同的参数给PreparedStatement对象并执行。减少SQL编译次数,提高效率。 - 安全性更高,没有SQL注入的隐患。
- 提高程序的可读性
5.6使用PreparedStatement 的步骤
1)编写SQL语句,未知内容使用?占位"SELECT * FROM user WHERE name=? AND password=?";
2)获得PreparedStatement 对象
3)设置实际参数:setXxx(占位符的位置,真实的值)
4)执行SQL语句
5)关闭资源
PreparedStatement中设置参数的方法 | 描述 |
---|---|
void setDouble(int parameterIndex, double x) | 将指定参数设置为给定 Java double 值 |
void setFloat(int parameterIndex, float x) | 将指定参数设置为给定 Java REAL 值 |
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 值 |
void setDouble(int parameterIndex, double x) | 将指定参数设置为给定 Java double 值 |
void setFloat(int parameterIndex, float x) | 将指定参数设置为给定 Java REAL 值 |
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 值 |