JDBC(Java DataBase Connectivity)就是 Java 数据库连接,说白了就是用 Java 语言来操作数据库。原来我们操作数据库是在控制台使用 SQL 语句来操作数据库,JDBC 是用 Java 语言向数据库发送 SQL 语句。JDBC(Java Data Base Connectivity,Java 数据库连接)是一种用于执行 SQL 语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用 Java 语言编写的类和接口组成。JDBC 提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。同时,JDBC也是个商标名。 JDBC 屏蔽了底层不同数据库的操作差异,从而使开发者可以通过统一的 Java API 来进行操作不同的数据库,而不必考虑底层具体数据库实现的差异。 所以尽管底层数据库及其驱动有很多种,但 JDBC 是不变的
由 sun 公司提供,内容为供程序员调用的接口与类,集成在 java.sql 和 javax.sql 包中。JDBC API 可做三件事:与数据库建立连接、执行 SQL 语句、处理结果。
DriverManager 类
JDBC 驱动程序管理器 ,是一工厂实现类,用了工厂方法模式。是JDBC的管理层,作用于用户和驱动程序之间。DriverMangerm可以注册和删除加载的驱动程序,可以根据给定的 url 获取符合 url 协议的驱动 Driver 或者是建立 Conenction 连接,进行数据库交互。有两个作用:1)注册驱动:让 JDBC 知道要使用的是哪个驱动所有的驱动程序类必须包含一个静态部分。这个静态部分在加载该实例时由 DriverManager 类进行注册。用户在正常情况下将不会直接调用 DriverManager.regiserDriver 方法,而是在加载驱动程序时由驱动程序自动调用。注册驱动程序:
Class.forName(“com.mysql.jdbc.Driver”);DriverManager.registerDriver(new com.mysql.jdbc.Driver())System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);2)获取 Connection:它跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。
Dirver 接口
是驱动程序对象的接口,指向具体数据库驱动程序对象
connection接口
Statement 接口
ResultSet接口(结果集)
ResultSetMetaData对象
可用于获取关于 ResultSet 对象中列的类型和属性信息的对象
获得ResultSetMetaData对象:
ResultSet对象的getMetaData()方法;
ResultSetMetaData对象的常用方法:
int getColumnCount() : 获得本次查询中的列数
String getColumnName(int column) :获得本次查询中指定列的列名。
String getColumnTypeName(int column) :检索指定列的数据库特定的类型名称。
int getColumnDisplaySize(int column) :指示指定列的最大标准宽度,以字符为单位。
String getTableName(int column) :获取指定列的表名称
存储结果集的结构的:表头列名 数据类型 列数量,没有数据。
// 4获取Statment对象,并执行sql Statement stm=conn.createStatement(); ResultSet rs=stm.executeQuery(sql);//ResultSetMetaData:存储结果ResultSetMetaData metaData=rs.getMetaData();// 5.处理结果: while(rs.next()){//判断有没有下一行,有就指向——便利行 for(int i=1;i<=metaData.getColumnCount();i++){//遍历 System.out.print(metaData.getColumnName(i)+":"+rs.getObject(i)+"\t"); } System.out.println(); }
Java DataBase Connection:使用java使用连接数据库。 由JDBC驱动直接访问数据库 优点:100% Java,快又可跨平台 缺点:访问不同的数据库需要下载专用的JDBC驱动不同的数据库都得下载不懂jar包,相同的数据库也需要不同的jar(版本不同) 版本不兼容
(1)加载数据库的驱动:DriverManager.registerDriver(Driver)_Jar DriveManager里面的registerDriver(Driver driver)Class.forName(包名.类名)_驱动类中书写一个静态代码,只要加载这个 (2)创建与数据库的连接 DriverManager里面getConnection(String url, String user, String password) (3)获取Statemnt对象:stm=conn
(4)编写sql语句:Navicat写好
(5)执行sql语句 Statement里面executeQuery(String sql)
(6)处理结果
(7)释放资源(关闭连接):数据库的连接个数是有限。
public static void main(String[] args){ try { Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/casemanage? useUnicode=true&characterEncoding=utf-8&useSSL=false","root","数据库密码"); Statement statement = connection.createStatement(); int i = statement.executeUpdate("insert sc value(2008,2,3)"); System.out.println(i); statement.close(); connection.close(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } }
执行查询:
public static void main(String[] args){ try { Class.forName("com.mysql.jdbc.Driver"); //2连接数据库 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/casemanage?useUnicode=true&characterEncoding=utf-8&UseSSL=false", "root", "数据库密码"); //3statement Statement statement = conn.createStatement(); //4sql String sql = "select * from sc"; //5执行sql ResultSet resultSet = statement.executeQuery(sql); //返回受影响的行数 //6返回结果 //获取查询的总列数 ResultSetMetaData metaData = resultSet.getMetaData(); //获取对象 int columnCount = metaData.getColumnCount();//总列数 System.out.println(metaData.getCatalogName(1)+"\n"); // 获取数据库名 while(resultSet.next()){ // int anInt = resultSet.getInt(1); //第一列数据 for (int i = 1; i <= columnCount; i++) { System.out.print(metaData.getColumnName(i)+ ":"); // 查询这列的列名 System.out.print("\t" + resultSet.getObject(i)+ "\t\t\t"); } System.out.println(""); } //7释放连接 statement.close(); conn.close(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } }
public static void main(String[] args) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/casemanage? useUnicode=true&characterEncoding=utf-8&UseSSL=false", "root", "数据库密码"); PreparedStatement prepared = conn.prepareStatement("select * from sc where s_no = ?"); prepared.setInt(1,2002); ResultSet resultSet = prepared.executeQuery(); ResultSetMetaData metaData = resultSet.getMetaData();//创建对象 int columnCount = metaData.getColumnCount(); while (resultSet.next()){ for (int i = 1; i <= columnCount ; i++) { System.out.print(resultSet.getObject(i)+"\t"); } System.out.println(""); } }
返回主键
public static void main(String[] args){ try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/casemanage?useUnicode=true&characterEncoding=utf-8&useSSL=false", "root", "1214521"); PreparedStatement prepared = connection.prepareStatement("insert stu(name) value (?)",Statement.RETURN_GENERATED_KEYS); prepared.setString(1,"张飞"); int i1 = prepared.executeUpdate(); System.out.println("受影响的行数"+i1); //返回受影响的行数 ResultSet resultSet = prepared.getGeneratedKeys(); while (resultSet.next()){ System.out.print("新增主键"+resultSet.getObject(1)+"\t"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } }