JDBC全称是java数据库连接,它是一套用于执行SQL语句的JAVA API。应用程序可以通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库中数据的查询、新增、更新和删除等操作。
应用程序使用JDBC访问特定的数据库时,需要与不同的数据库驱动进行连接。由于不同数据库厂商提供的数据库驱动不同,因此,为了使应用程序与数据库真正建立连接,JDBC不仅需要提供烦那个文数据库的API,还需要封装与各种数据库服务器通信的细节。
Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。需要注意的是,在编写JDBC程序时,必须要把所使用的数据库驱动程序或类库加载到哦项目的classpath中(这里是指MySQL驱动JAR包)。
过程:1、首先在java项目中创建一个lib文件夹,然后将该包放入。2、右击,选择Bulid Path的Configer Build Path然后在Libaries栏点击Add External JARs。3、将包导入即可创建。
DirverManger类用于加载JDBC驱动并且创建与数据库的连接。在DriverManager类中,定义了两个比较重要的静态方法,如下所示:
方法名称 | 功能描述 |
---|---|
static void regiserDriver(Driver driver) | 该方法用于向DriverManager中注册给定的JDBC驱动程序 |
static Connection getConnection(String url,String user,String pwd) | 该方法用于建立和数据库的连接,并返回连接的Connection对象 |
Connection接口代表Java程序和数据库的连接,只有获得该连接对象后,才能访问数据库,并操作数据表。在Connection接口后,定义了一系列方法,其常用的方法如下所示。
方法名称 | 功能描述 |
---|---|
DatabaseMetaData getMetaData() | 该方法用于返回表示数据库的元数据的DatabaseMetaData对象 |
Statement createStatement() | 用于创建一个Statement对象来将SQL语句发送到数据库 |
PreparedStatement prepareStatement(String sql) | 用于创建一个PrepaerStatement对象来将参数化的SQL语句发送到数据库 |
CallbaleStatement prepareCall(String sql) | 用于创建一个CallableStatement对象来调用数据库存储过程 |
Statement接口用于执行静态的SQL语句,并返回一个结果对象。Statement接口对象可以通过Connection实例的createStatement()方法获得,该方法会把静态的SQL语句发送到数据库中编译执行,然后返回数据库的处理结果。
在Statement接口中,提供了3种常用的SQL语句的方法,具体如下:
方法名称 | 功能描述 |
---|---|
boolean execute(String sql) | 用于执行各种SQL语句,该方法返回一个boolean类型的值,如果为TURE,表示所执行的SQL语句有查询结果,可以通过Statament的getResultSet()方法获得查询结果。 |
int executeUpdate(String sql) | 哟用于执行SQL中的inser、update和delete语句,该方法返回一个int,类型的值表示数据库中受该语句影响的记录条数 |
ResyltSet executeQuery(Stirng sql) | 用于执行sql中的select语句,该方法返回一个表示一个查询结果的RseultSet对象 |
PrepareStatament是Statement的子接口,用于执行预编译的SQL语句。改接口扩展了带有参数SQL语句的执行操作,应用改接口中的SQL语句可以使用占位符“?”来代替其参数,然后通过setXxx()方法为SQL语句的参数赋值。在PreparedStatement接口中,提供了一些常用的方法:
方法名称 | 功能描述 |
---|---|
int executeUpdate() | |
ResultSet executeQuery() | |
void setInt(int paraneterIndex,int x) | |
void setFloat(int parameterIndex,float x) | |
void setDate(int parameterIndex,Data x) | |
void setString(int parameterIndex,String x) |
在通过setXxx()方法为SQL语句中的参数赋值时,可以通过输入参数的已定义SQL类型兼容的方法。例如,如果参数就有SQL类型为Integer,那么应该使用setInt()方法,也可以通过setObject()方法设置多种类型的输入参数。
String sql = "INSERT INTO users(id,name,email) Values(?,?,?)";
PreparedStatement preStmt = conn.prepareStatement(sql);
preStmt.setInt(1,1);
preStmt.setString(2,"summer");
preStmt.setObject(3,"[email protected]");
preStmt.executeUpdate();
需要注意的是,表中的setDate()方法可以设置日期内容,但参数Date的类型是java.sql.Date而不是java.util.Date。
ResultSet接口用于保存JDBC执行查询时返回的结果级,该结果集封装在一个逻辑表个中。在ResultSet接口内部有一个指向表格数据行的游标(或指针),RseultSer对象初始化时,游标在表格的第一行之前,调用next()方法可将游标移动到下一行。如果下一行没有数据,则返货false。在应用程序中经常使用next()方法作为while循环的条件来迭代RseultSet结果集。
通常,JDBC的使用可以按照以下几个步骤进行:
package Example01;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/*
* JDBC使用步骤
* 1. 加载并注册数据库驱动
* 2. 通过DriverManager获取数据库连接
* 3. 通过Connection对象获取Statement对象
* 4. 使用Statement执行SQL语句
* 5. 操作ResultSet结果集
* 6. 关闭连接,释放资源
*/
public class Example01 {
public static void main(String[] args) throws SQLException {
Connection coon = null;
Statement stmt = null;
ResultSet re = null;
try {
// 1. 加载并注册数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//这里一般是com.mysql.jdbc.Driver,由于我使用的是8.0.20版本的驱动程序,因此如果版本低的需要改成没有cj的
// 2. 通过DriverManager获取数据库连接
//这里的?后面的是设置时间。
String url = "jdbc:mysql://localhost/jdbc?serverTimezone=UTC&useSSL=false";
String user = "root";
String password = "root";
coon = DriverManager.getConnection(url, user, password);
// 3.通过Connection对象获取Statement对象
stmt = coon.createStatement();
//4. 使用Statement执行SQL语句
String sql = "select * from users";
re = stmt.executeQuery(sql);
// 操作ResultSet结果集
System.out.println("id | name | password | email | birthday");
while(re.next()) {
//通过列名获取指定字段的值
int id = re.getInt("id");
String name = re.getString("name");
String psd = re.getString("password");
String email = re.getString("email");
Date birthday = re.getDate("birthday");
System.out.println(id + " | " + name + " | " + psd + " | " + email + " | " + birthday);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
// 6. 关闭连接,释放资源
if(coon != null) {
coon.close();
coon = null;
}
if(stmt != null) {
stmt.close();
stmt = null;
}
if(re != null) {
re.close();
re = null;
}
}
}
}
注:要完成jdbc的连接必须要查看mysql版本与驱动版本是否适配,过高和过低都会引起不能正确连接。
PreparedStatement对象可以对SQL语句进行预编译,预编译的信息会存储在该对象中。当相同的SQL语句再次执行时,程序会使用PreparedStatement对象中的数据,而不需要SQL语句再次编译去查询数据库,这样就大大提高了数据的访问效率。
package Example02;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/*
* JDBC使用步骤
* 1. 加载并注册数据库驱动
* 2. 通过DriverManager获取数据库连接
* 3. 通过Connection对象获取Statement对象。指定要执行的SQL语句
* 4. 使用PreparedStatement执行SQL语句
* 5. 操作ResultSet结果集
* 6. 关闭连接,释放资源
*/
public class Example02 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. 加载并注册数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 通过DriverManager获取数据库连接
String url = "jdbc:mysql://localhost/jdbc?serverTimezone=UTC&useSSL=false";
String user = "root";
String password = "root";
Connection coon = DriverManager.getConnection(url, user, password);
// 3. 通过Connection对象获取Statement对象。指定要执行的SQL语句
String sql = "INSERT INTO users(id,name,password,email,birthday) VALUE(?,?,?,?,?)";
PreparedStatement preStmt = coon.prepareStatement(sql);
//为sql语句中的参数进行赋值
preStmt.setInt(1, 4);
preStmt.setString(2, "zhangsan");
preStmt.setString(3,"123456");
preStmt.setString(4, "[email protected]");
preStmt.setString(5, "2000-01-20");
// 4. 使用PreparedStatement执行SQL语句
int count = preStmt.executeUpdate();
System.out.println("数据改变了"+count+"条。");
// 6.关闭连接,释放资源
coon.close();
preStmt.close();
}
}
package Example03;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/*
* ResultSet的使用
*/
public class Example03 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//得到与数据库连接的对象
String url = "jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTC&useSSL=false";
String user = "root";
String password = "root";
Connection coon = DriverManager.getConnection(url, user, password);
//得到用来执行SQL语句的对象
String sql = "select * from users";
PreparedStatement ppStmt = coon.prepareStatement(sql);
//执行SQL语句
ResultSet rs = ppStmt.executeQuery();
//查询结果集ResultSet
//将指针定位到结果集第二行数据
rs.absolute(2);
System.out.println("第二条数据的name值:"+rs.getString("name"));
//将指针定位到结果集中的第一行数据的前面
rs.beforeFirst();
rs.next();//将指针向后移动
System.out.println("第一条数据的name值:"+rs.getString("name"));
//将指针定位到结果集中的最后一条数据之后
rs.afterLast();
rs.previous();//将指针向前移动一条
System.out.println("最后一条数据的name的值:"+rs.getString("name"));
}
}