JDBC数据库连接技术
**原理:**JDBC在应用程序与数据库之间起到了一个桥梁作用,当应用程序使用JDBC访问特定的数据库时,需要通过不同数据库驱动与不同的数据库进行连接,连接后即可对数据库进行相应的操作。
一.Jdbc API
1.Driver接口
**作用:**Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。
2.DriverManager类
**作用:**DriverManager类用于加载JDBC驱动并且创建与数据库的连接。
- 注册驱动
方法一:
方法名称 | 功能描述 |
---|---|
registerDriver(Driver driver) | 该方法用于向DriverManager中注册给定的JDBC驱动程序 |
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
此方式会使数据库驱动被注册两次。这是因为Driver类的源码,已经在静态代码块中完成了数据库驱动的注册。所以,为了避免数据库驱动被重复注册,需要在程序中使用Class.forName()方法加载驱动
方法二:
Class.forName("com.mysql.jdbc.Driver")
//注意:MySQL 5.6以及之后的版本需要更新到新版驱动,使用Class.forName("com.mysql.cj.jdbc.Driver")方式加载驱动类
- 获取数据库连接对象
方法名称 | 功能描述 |
---|---|
getConnection(String url,String user,String pwd) | 该方法用于建立和数据库的连接,并返回表示连接的Connection对象 |
//注意:
url:表示要连接的数据库的url
连接本地mysql的url:
jdbc:mysql://localhost:3306/数据库名
jdbc:mysql://127.0.0.1:3306/数据库名
jdbc:mysql://127.0.0.1:3306/数据库名?serverTimezone=GMT%2B8
user:是数据库的用户名
pwd:是数据库的密码
3.Connection接口
- 事务管理(Connection接口定义了三个对应的方法)
开启事务:setAutoCommit(boolen) ture:自动提交 false:手动
提交事务:commit()
回滚事务:rollback()
Connection conn=DriverManager.getConnection(String url,String user,String password)
try{
conn.setAutoCommit(false);
操作mysql;
conn.commit();
}catch(exception e){
conn.rollback();
}
- 获取Statement对象
方法名称 | 功能描述 |
---|---|
createStatement() | 创建一个Statement对象,并将此SQL语句发送到数据库 |
prepareStatement(String sql) | 创建一个PreparedStatement对象,并将带参数的SQL语句发送到数据库 |
prepareCall(String sql) | 创建一个CallableStatement对象调用数据库存储过程 |
4.Statement接口
**作用:**Statement接口用于执行静态的SQL语句,并返回一个结果对象。利用Statement接口把静态的SQL语句发送到数据库编译执行,然后返回数据库的处理结果。
方法名称 | 功能描述 |
---|---|
execute(String sql) | 用于执行各种SQL语句,该方法返回一个boolean类型的值,如果为true,表示所执行的SQL语句有查询结果,可通过Statement的getResultSet()方法获得查询结果 |
executeUpdate(String sql) | 用于执行SQL中的insert、update和delete语句。该方法返回一个int类型的值,表示数据库中受该SQL语句影响的记录条数 。执行DDL或DML语句,DML语句影响的行数0表示执行成功;DDL返回0 |
executeQuery(String sql) | 用于执行SQL中的select语句,该方法返回一个表示查询结果的ResultSet对象 |
5.PreparedStatement接口
**作用:**PreparedStatement是Statement的子接口,用于执行预编译的SQL语句。PreparedStatement接口扩展了带有参数的SQL语句的执行操作,应用该接口中的SQL语句可以使用占位符“?”代替参数,然后通过setter()方法为SQL语句的参数赋值
- 执行带参数的Sql语句
方法名称 | 功能描述 |
---|---|
executeUpdate() | 在此PreparedStatement对象中执行SQL语句,该语句必须是一个DML语句或者DDL |
executeQuery() | 在此PreparedStatement对象中执行SQL查询,该方法返回的是ResultSet对象 |
- 给参数赋值
方法名称 | 功能描述 |
---|---|
setInt(int parameterIndex, int x) | 将指定参数设置为给定的int值 |
setFloat(int parameterIndex, float x) | 将指定参数设置为给定的float值 |
setString(int parameterIndex, String x) | 将指定参数设置为给定的String值 |
setDate(int parameterIndex, java.sql.Date x) | 将指定参数设置为给定的Date值 |
addBatch() | 将一组参数添加到此PreparedStatement对象的批处理命令中 |
setCharacterStream(int parameterIndex, java.io.Reader reader,int length) | 将指定的输入流写入数据库的文本字段 |
setBinaryStream(int parameterIndex, java.io.InputStream x, int length) | 将二进制的输入流数据写入到二进制字段中 |
//preparedStatement预编译的功能
PreparedStatement对象可以对SQL语句进行预编译,预编译的信息会存储在PreparedStatement对象中。当相同的SQL语句再次执行时,程序会使用PreparedStatement对象中的数据,而不需要对SQL语句再次编译去查询数据库,这样就大大提高了数据的访问效率。
//对于自增属性id无需插入
String sql1 = "INSERT INTO dept(name) VALUES(?)";
preparedStatement = conn.prepareStatement(sql1);
preparedStatement.setString(1, "软件工程");
int i = preparedStatement.executeUpdate();
if (i > 0) System.out.println("插入成功");
else System.out.println("插入失败");
6.ResultSet接口
**作用:**ResultSet接口用于保存JDBC执行查询时返回的结果集,该结果集封装在一个逻辑表格中。在ResultSet接口内部有一个指向表格数据行的游标(指针),ResultSet对象初始化时,游标在表格的第一行之前,调用next()方法可将游标移动到下一行。如果下一行没有数据,则返回false。
- 通过索引或字段获取参数
方法名称 | 功能描述 |
---|---|
getString(int columnIndex) | 用于获取指定字段的String类型的值,参数columnIndex代表字段的索引 |
getString(String columnName) | 用于获取指定字段的String类型的值,参数columnName代表字段的名称 |
getInt(int columnIndex) | 用于获取指定字段的int类型的值,参数columnIndex代表字段的索引 |
getInt(String columnName) | 用于获取指定字段的int类型的值,参数columnName代表字段的名称 |
getDate(int columnIndex) | 用于获取指定字段的Date类型的值,参数columnIndex代表字段的索引 |
getDate(String columnName) | 用于获取指定字段的Date类型的值,参数columnName代表字段的名称 |
//注意:
通过索引获取值时,索引从1开始
- 通过指针指向表格位置
方法名称 | 功能描述 |
---|---|
next() | 将游标从当前位置向下移一行 |
absolute(int row) | 将游标移动到此 ResultSet 对象的指定行 |
afterLast() | 将游标移动到此 ResultSet 对象的末尾,即最后一行之后 |
beforeFirst() | 将游标移动到此 ResultSet 对象的开头,即第一行之前 |
previous() | 将游标移动到此 ResultSet 对象的上一行 |
last() | 将游标移动到此 ResultSet 对象的最后一行 |
//注意:
ResultSet主要用于存储结果集,可以通过next()方法由前向后逐个获取结果集中的数据,如果想获取结果集中任意位置的数据,则需要在创建Statement对象时,设置两个ResultSet定义的常量
Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = st.executeQuery(sql);
rs.absolute(2);
//在上述方式中,常量“Result.TYPE_SCROLL_INSENITIVE”表示结果集可滚动,常量“ResultSet.CONCUR_READ_ONLY”表示以只读形式打开结果集。
二.Jdbc快速入门案例
-
导入mysql-connector-java-8.0.31.jar包(要保持与mysql相同的版本)
-
通过反射注册驱动,使得JDK可以识别相应的jar包
-
获取JDBC对数据库的连接(DriverManager.getConnection(String url, String username, String password))
-
定义SQL语句
-
获取执行SQL对象(connection.createStatement())
-
执行SQL语句(statement.execute())
-
处理返回结果
-
释放资源(close)
0.创建工程导入驱动jar包
1.注册驱动#识别jar包
Calss.forName("com.mysql.cj.jdbc.Driver");
2.获取连接
Connection conn=DriverManager.getConnection
(String url,String user,String password);
3.定义SQL语句
String sql=" ";
4.获取执行SQL对象
Statement stmt=conn.createStatement();
5.执行SQL
int count=stmt.executeUpdate(sql);//返回受影响行数
6.处理返回结果
7.释放资源
stmt.close();
conn.close();