相关概念
Jdbc是一种用执行SQL语句的Java API,可以为多种关系型数据库提供一个统一的访问入口,它是由一组用Java语言编写的类和接口组成。jdbc提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。意思就是不管是连接Qracle数据库还是MySql数据库或者是Informix数据库,都不用单独再为每个数据库写一个专门的程序,只需用jdbc API即可,它可以向相应的数据库发送SQL调用,将Java和jdbc结合起来就不必为不同的平台编写不同的应用程序,只需写一遍程序就可以让它在任何平台上运行,这也是Java语言的优势,一次编译,到处运行。
JDBC连接步骤
①、加载(注册)数据库驱动(到JVM)--->②、建立(获取)数据库连接--->③、创建(获取)数据库操作对象--->④、定义操作的SQL语句--->
⑤、执行数据库操作---⑥、获取并操作结果集--->⑦、关闭对象,回收数据库资源(关闭结果集--->关闭数据库操作对象--->关闭链接)
创建创建jdbc连接数据库所需四个参数
1)、用户名(数据库的用户名)
2)、用户密码(数据库的密码)
3)、URL定义了连接数据库时的协议、子协议、数据源标识。
•书写形式:协议:子协议:数据源标识
协议:在JDBC中总是以jdbc开始
子协议:是桥连接的驱动程序或是数据库管理系统名称。
数据源标识:标记找到数据库来源的地址与连接端口。
例如:(MySql的连接URL)
jdbc:mysql:
//localhost:3306/test?useUnicode=true&characterEncoding=gbk ;
useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为
gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。
•书写形式:协议:子协议:数据源标识
协议:在JDBC中总是以jdbc开始
子协议:是桥连接的驱动程序或是数据库管理系统名称。
数据源标识:标记找到数据库来源的地址与连接端口。
例如:(MySql的连接URL)
jdbc:mysql:
//localhost:3306/test?useUnicode=true&characterEncoding=gbk ;
useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为
gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。
4)、driverClass连接数据库所需的驱动
1、加载jdbc驱动程序
在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String className)实现。
如↓:
try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(ClassNotFoundException e){ System.out.println("找不到驱动程序类 ,加载驱动失败!"); e.printStackTrace() ; }
成功加载后,会将Driver类的实例注册到DriverManager类中
2、创建数据库连接
•要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象, 该对象就代表一个数据库的连接。
•使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。
如↓:
•使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。
如↓:
//连接MySql数据库,用户名和密码都是root String url = "jdbc:mysql://localhost:3306/test" ; String username = "root" ; String password = "root" ; try{ Connection con = DriverManager.getConnection(url , username , password ) ; }catch(SQLException se){ System.out.println("数据库连接失败!"); se.printStackTrace() ; }
3、创建数据库操作对象
•要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3种类型:
1、执行静态SQL语句。通常通过Statement实例实现。
2、执行动态SQL语句。通常通过PreparedStatement实例实现。
3、执行数据库存储过程。通常通过CallableStatement实例实现。
实现方式:
1、执行静态SQL语句。通常通过Statement实例实现。
2、执行动态SQL语句。通常通过PreparedStatement实例实现。
3、执行数据库存储过程。通常通过CallableStatement实例实现。
实现方式:
Statement stmt = con.createStatement() ; PreparedStatement pstmt = con.prepareStatement(sql) ; CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ;4、定义要执行的SQL语句
这个步骤简单说就是写业务需求的SQL语句
如↓:
String sql = "select * from user where id = 100";
5、
执行数据库操作(执行SQL语句)
Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate和execute
1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。
2、int executeUpdate(String sqlString):用于执行insert、update、select或delete语句以及SQL DDL语句,如:create table和drop table等
3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。
具体实现↓:
1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。
2、int executeUpdate(String sqlString):用于执行insert、update、select或delete语句以及SQL DDL语句,如:create table和drop table等
3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。
具体实现↓:
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; int rows = stmt.executeUpdate("INSERT INTO ...") ; boolean flag = stmt.execute(String sql) ;6、 获取并操作结果集
1).ResultSet中行的第一列索引为1,而非0,访问ResultSet中的数据时要使用列名,而非索引但要注意使用列名作为查询条件是大小写敏感的。
2).JDBC1.0中,我们只能在ResultSet中向前移动;在JDBC2.0中,我们可以在ResultSet中向下(next)或向上(previous)移动,同样也可以移到特定的行(relative,absolute)
3).默认情况下ResultSet是不可更新的,且只能向前移动。下面的代码显示了如何创建一个可滚动的、对更新敏感的ResultSet
7、 关闭对象,回收数据库资源(关闭结果集--->关闭数据库操作对象--->关闭链接)
2).JDBC1.0中,我们只能在ResultSet中向前移动;在JDBC2.0中,我们可以在ResultSet中向下(next)或向上(previous)移动,同样也可以移到特定的行(relative,absolute)
3).默认情况下ResultSet是不可更新的,且只能向前移动。下面的代码显示了如何创建一个可滚动的、对更新敏感的ResultSet
Statement stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");4).ResultSet和ResultSetMetaData没有直接提供方法返回查询所返回的行数。然而,在JDBC2.0中,可以通过调用last()方法将游标定位到ResultSet的最后一行,然后调用getRow()方法获取当前的行号。在JDBC1.0中,确定行数的惟一方式是重复调用ResultSet的next()方法,直到它返回false为至;
7、 关闭对象,回收数据库资源(关闭结果集--->关闭数据库操作对象--->关闭链接)
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:
//1、先关闭requestSet //2、再关闭preparedStatement //3、最后关闭连接对象connection if(rs != null){ // 关闭记录集 try{ rs.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() ; } }
JDBC连接数据库具体代码
package com.yangshengjie.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCTest { /** * 使用JDBC连接并操作mysql数据库 */ public static void main(String[] args) { // 数据库驱动类名的字符串 String driver = "com.mysql.jdbc.Driver"; // 数据库连接串 String url = "jdbc:mysql://127.0.0.1:3306/jdbctest"; // 用户名 String username = "root"; // 密码 String password = "mysqladmin"; Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // 1、加载数据库驱动( 成功加载后,会将Driver类的实例注册到DriverManager类中) Class.forName(driver ); // 2、获取数据库连接 conn = DriverManager.getConnection(url, username, password); // 3、获取数据库操作对象 stmt = conn.createStatement(); // 4、定义操作的SQL语句 String sql = "select * from user where id = 100"; // 5、执行数据库操作 rs = stmt.executeQuery(sql); // 6、获取并操作结果集 while (rs.next()) { System.out.println(rs.getInt("id")); System.out.println(rs.getString("name")); } } catch (Exception e) { e.printStackTrace(); } finally { // 7、关闭对象,回收数据库资源 if (rs != null) { //关闭结果集对象 try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null) { // 关闭数据库操作对象 try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { // 关闭数据库连接对象 try { if (!conn.isClosed()) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } }