JDBC基本知识

JDBC的作用

JDBC为java访问数据库提供通用的API,可以为多种关系数据库提供统一访问。因为SQL是关系式数据库管理系统的标准语言,只要我们遵循SQL规范,那么我们写的代码既可以访问MySQL又可以访问SQL Server.

简单的说,JDBC可以做三件事:

  • 与数据库建立连接
  • 发送SQL语句
  • 处理结果

JDBC中重要的类

java.sql.DriverManager:用来加载不同的JDBC驱动程序并且为创建的新的数据库连接提供支持;

java.sql.Connection:完成对某一指定数据库的连接功能;java.sql.Statement:在一个已经创建的连接(java.sql.Connection)中作为执行SQL语句的容器;它包含了两个重要的子类:

java.sql.PreparedStatement:用于执行预编译的SQL语句;

java.sql.CallableStatement:用于执行数据库中已经创建好的存储过程(Stored Procedure)。

java.sql.ResultSet:代表特定SQL语句执行后的数据库结果集。

这些类我们可以参考JDK API,里面有非常详细的说明。并且是中文的^_^

与数据库建立连接(mysql)

1.URL

JDBC URL的标准语法如下下所示。他们之间由冒号分隔:

<协议jdbc>:<子协议>:<子名称>

<协议>:JDBC URL中的协议总是jdbc。

<子协议>:驱动程序名或数据库连接机制的名称。例如:mysql

<数据源>:包含要连接数据库的主机、端口、名称、用户名、密码等信息。

例如mysql连接的URL格式为:

jdbc:mysql//[hostname][:port]/[dbname][?param1=value1][&param2=value2]….

有一点说明,mysql端口号(port)可以通过如下方式查询

mysql>show global variables like 'port';

2.使用DriverManager管理驱动类

Class.forName("com.mysql.jdbc.Driver");

3.连接管理

设置不自动提交:conn.setAutoCommit(false);

提交数据:conn.commit();

回滚数据:conn.rollback();

设置自动提交:conn.setAutoCommit(true)。

关闭连接:conn.close();

下面是一个测试连接SQL的例子:

发送SQL"show databases",并显示结果。

    public static void testConn() throws SQLException {
        Connection conn = getConn("root", "", "");
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("show databases");
        while (rs.next()) {
            System.out.println(rs.getString(""));
        }
        stmt.close();//显示关闭Statement对象,释放资源
        conn.close();
        //关闭数据库连接,这是个好习惯。尽管在程序运行结束会自动关闭。但web应用是不会结束运行的。
    }

与数据库建立连接

    public static Connection getConn(String username, String password,
            String DBname) {
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/" + DBname;
        Connection conn = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

DatabaseMetaData-数据库的信息

创建一个DatabaseMetaData对象

DatabaseMetaData datameta=conn.getMetaData();

1.获取数据库中各个表的情况

ResultSet getTables(String catalog, String schemaPattern, String 
tableNamePattern, String types[]);

catalog指的是数据库

schemaPattern是数据库的用户

tableNamePattern是表名

types指的是table、view等

getTables方法返回一个ResultSet对象,每一条记录是对一个表的描述。只有那些符合参数要求的表才被返回。结果集的每一行有8个字段,其中第三个为表名称。

获取数据库中的表名字

 public static String[] getTableNames(String DBname, Connection conn) {
        String[] tables = null;
        try {
            DatabaseMetaData DBmeta = conn.getMetaData();
            String types[] = { "TABLE" };
            ResultSet rs = DBmeta.getTables(DBname, null, null, types);
            List<String> ls = new ArrayList<String>();
            int i = 0;
            while (rs.next()) {
                ls.add(rs.getString(3));
                i++;
            }
            tables = new String[i];
            ls.toArray(tables);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return tables;
    }

2. 获取表中各列的信息

ResultSet getColumns(String catalog, String schemaPattern, String 
tableNamePattern, String types[]);

getColumns返回一个ResultSet类的对象,其中每一行是对一个字段的描述,只有符合参数要求的列才被返回。

每一行的字段信息为:数据库名、数据库扩展名、表名、字段名

获取表的所有字段名字

    public static String[] getFieldsNames(String tableName, Connection conn) {
        String[] fields = null;
        try {
            DatabaseMetaData DBmeta = conn.getMetaData();
            ResultSet rs = DBmeta.getColumns(null, null, tableName, null);
            List<String> ls = new ArrayList<String>();
            int i = 0;
            while (rs.next()) {
                ls.add(rs.getString(4));
                i++;
            }
            fields = new String[i];
            ls.toArray(fields);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return fields;
    }

3. 获取关于索引的信息

ResultSet getIndexInfo(String catalog, String schema, Boolean unique, boolean approximate);

getIndexInfo方法返回一个ResultSet类的对象,其中每一行是对一个索引的描述,只有符合参数要求的索引才被返回。

Statement提交SQL

Statement对象发送SQL语句

Statement stmt = conn.createStatement(); 
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");

Statement接口提供了三种执行SQL的语句的方法:

  • 方法executeQuery:用于产生单个结果集的语句,例如 SELECT 语句。
  • 方法executeUpdate:用于执行 INSERT、UPDATE 或 DELETE 语句以及SQL DL(数据定义语言)语句,例如CREATE TABLE和DROP TABLE。INSERT、UPDATE或DELETE语句的效果是修改表中零行或多行中的一列或多列。executeUpdate的返回值是一个整数,指示受影响的行数(即更新计数)。对于CREATE TABLE或DROP TABLE等不操作行的语句,executeUpdate的返回值总为零。
  • 方法execute:用于执行返回多个结果集、多个更新计数或两者组合的语句。 当生成 ResultSet 对象的 Statement 对象关闭、重新执行或用来从多个结果的序列获取下一个结果时,该 Statement 对象将自动关闭 ResultSet 对象。这意味着在重新执行Statement对象之前,需要完成对当前ResultSet对象的处理。 stmt.close();显式关闭Statement对象,释放DBMS资源。 结果集Resultset对象 1.ResultSet遍历 一个ResultSet对象对应着一个由查询语句返回的一个表,这个表中包含所有的查询结果。实际上,我们就可以将一个ResultSet对象看成一个二维表。对ResultSet对象的处理必须逐行进行,而对每一行中的各个列,可以按任何顺序进行处理。
  • 行与光标:ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next 方法将光标移动到下一行;因为该方法在 ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。
  • 取得列:在对每一行进行处理时,可以对各个列按任意顺序进行处理。不过,按从左到右的顺序对各列进行处理可以获得较高的执行效率。ResultSet类的getXXX()方法可以从某一列中获得检索结果。其中XXX是JDBC中的Java数据类型,如int、String、Date等。 ResultSet提供两种方法来指定列进行检索: 一种是以一个int值作为列的索引,另一种是以一个String对象作为列名来索引。第一种效率更高。 下面是变量结果集的例子: Statement statement=conn.createStatement(); //在Connection对象的基础上创建Statemetn对象 String sql="SELECT int_colmn, string_colmn,date_colmn," +" byte_colmn FROM table_name"; ResultSet result=statement.executeQuery(sql); //用Statement对象执行SQL语句,返回结果集 while(result.next()) { int int_value=result.getInt(1); String string_value=result.getString("colmn2"); Date date_value=result.getInt(3); Byte byte_value[]=result.getString("colmn4"); //从数据库中以两种不同的方式取得数据 out.println(int_value+" "+string_value+" "+date_value+" "); //将检索结果在用户浏览器上输出 } 2.获取结果集的信息 ResultsetMetaData rsdata=resultset.getMetaData(); GetMetaData()方法返回一个ResultSetMetaData类的对象,使用该类的方法,得到许多关于结果集的信息,下面给出几个常用的方法: (1) getColumnCount():返回一个int值,指出结果集中的列数; (2) getColumnLabel(int column):返回column所指的列的显示标题,field的SQL AS的值; (3) getColumnName(int column):返回的是field的原始名字。可以把此方法返回的String对象作为Resultset类的getXXX()方法的参数。不过,并没有太大的实际意义; (4) getColumnType(int comlumn):返回指定列的SQL数据类型。它的返回值是一个int值。在java.sql.Types类中有关于各种SQL数据类型的定义; (5) getColumnTypeName(int comlumn):返回指定列的数据类型在数据源中的名称。它的返回值是一个String对象;这个比较常用。 (6) isNullable(int column):返回一个boolean值,指出该列是否允许存入一个NULL 值。 获取表各个字段的信息 // LinkedHashMap保留插入顺序 public static LinkedHashMap<String, String> getFields(String tableName, Connection conn) { LinkedHashMap<String, String> fields = new LinkedHashMap<>(); String sql = "select * from " + tableName; Statement stmt; try { stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); ResultSetMetaData rsmeta = (ResultSetMetaData) rs.getMetaData(); int count = rsmeta.getColumnCount(); for (int i = 1; i <= count; i++) { fields.put(rsmeta.getColumnLabel(i),rsmeta.getColumnTypeName(i)); } } catch (SQLException e) { e.printStackTrace(); } return fields; }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一“技”之长

AppleWatch开发入门四——Table视图的应用

        WatchOS中的TableView和iOS中的TableView还是有很大的区别,在开发之前,首先我们应该明白WatchOS中的Table有哪...

11720
来自专栏Jerry的SAP技术分享

ABAP和Java单例模式的攻防

然而我只需要将这个单例类JerrySingleton的构造函数通过反射设置成可以访问Accessible,然后就能通过反射调用该构造函数,进而生成新的对象实例。...

18540
来自专栏DT乱“码”

数据库连接(直接用)

package com.sanqing.util; import java.sql.Connection; import java.sql.DriverMa...

19460
来自专栏一枝花算不算浪漫

[数据库操作]Java中的JDBC的使用方法.

30880
来自专栏程序员的SOD蜜

调用PostgreSQL存储过程,找不到函数名的问题

PostgreSQL的表,函数名称都是严格区分大小写的,所以在使用的时候没有注意大小写问题容易导致找不到函数名的错误,但最近两天我们发现,如果函数参数使用了自定...

31250
来自专栏weixuqin 的专栏

JDBC技术

任何一种数据库驱动程序都提供一个 java.sql.Driver 接口的驱动类,在加载某个数据库驱动程序的驱动类时,都创建自己的实例对象并向 java.sql....

11520
来自专栏Java开发

读取数据库时报java.sql.SQLException: 流已被关闭

使用Connection、Statement/PreparedStatement、ResultSet来取数据库信息:

15620
来自专栏Java编程技术

Mysql中使用流式查询避免数据量过大导致OOM

java 中MySQL JDBC 封装了流式查询操作,通过设置几个参数,就可以避免一次返回数据过大导致 OOM。

20620
来自专栏我是攻城师

ElasticSearch+Solr几个case笔记

32840
来自专栏跟着阿笨一起玩NET

EF Code First 学习笔记:关系

项目中最常用到的就是一对多关系了。Code First对一对多关系也有着很好的支持。很多情况下我们都不需要特意的去配置,Code First就能通过一些引用属性...

18610

扫码关注云+社区

领取腾讯云代金券