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][¶m2=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;
}
JDBC基本知识的更多相关文章
- JDBC理论知识
JDBC理论知识 JDBC基础 JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统.通用的SQL数据库存取和操作的公共接口(一组API), 定义了用来访问数 ...
- MyBatis、JDBC相关知识
引言 在mybatis的基础知识中我们已经可以对mybatis的工作方式窥斑见豹.但是,为什么还要要学习mybatis的工作原理?因为,随着mybatis框架的不断发展,如今已经越来越趋于自动化,从代 ...
- Java数据库连接——JDBC基础知识(操作数据库:增删改查)
一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivit ...
- JDBC 基础知识总结
1. 何谓JDBC --- Java Database Connectivity. 由Sun 公司提供的访问数据库的一组java类和接口,用来对数据库进行链接.发送SQL语句.处理返回结果,为开发 ...
- Java数据库连接--JDBC基础知识(操作数据库:增删改查)
一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivit ...
- JDBC相关知识
一.连接数据库 1. 步骤 //1.创建一个Driver实现类的对象 Driver driver = new com.mysql.jdbc.Driver();//注意抛异常 //2.准备 url 和 ...
- Java JDBC 基础知识
一.JDBC常用接口.类介绍 JDBC提供对独立于数据库统一的API,用以执行SQL命令.API常用的类.接口如下: DriverManager 管理JDBC驱动的服务类,主要通过它获取Connect ...
- JDBC——入门知识【转】
1. 什么是JDBC:Java数据库连接性(JavaDatabase Connectivity) API,允许用户从Java应用程序中访问任何表格化数据源. 2. JDBC除了提供到更宽范围的SQ ...
- MySQL JDBC常用知识,封装工具类,时区问题配置,SQL注入问题
JDBC JDBC介绍 Sun公司为了简化开发人员的(对数据库的统一)操作,提供了(Java操作数据库的)规范,俗称JDBC,这些规范的由具体由具体的厂商去做 对于开发人员来说,我们只需要掌握JDBC ...
随机推荐
- Problem 1010 - 素数环问题
#include<iostream> #include<string> #include<algorithm> #include<vector> #in ...
- 使用APPLICATION制作缓存,转存一下,有一段写的还可以。
public sealed class CacheManager { private HttpApplicationState appPool = null; /// <summar ...
- webapp框架—学习AngularUI1(demo折腾)
angularUI下载地址:https://github.com/Clouda-team/BlendUI 下载解压后,demo在根目录 现在测试官网demo的使用 用浏览器打开mobile-angul ...
- 移动端Web开发如何处理横竖屏
<!Doctype html> <html> <head> <meta charset="utf-8"> <meta id=& ...
- js事件冒泡原理及处理
事件从根节点开始,逐级派送到子节点,若节点绑定了事件动作,则执行动作,然后继续走,这个阶段称为“捕获阶段(Capture)”:执行完捕获阶段后,事件由子节点往根节点派送,若节点绑定了事件动作,则执行动 ...
- 趣味C程序100.9 绘制杨辉三角
说明:1.本问题来源于<C语言经典.趣味.实用程序设计编程百例精解>,所有程序为本人自己编写.与原程序不同之处作有标记. 2.本系列所有程序均使用codeblocks编译,操作系统为Win ...
- Java基础——异常机制
[捕获异常] 硬件的错误.输入错误.物理限制等问题,都可能导致程序运行时的异常出现. 1.异常的分类层次 在java中,异常对象都是由Throwable类继承而来的,主要分为两大类: Error和Ex ...
- The Derivation About CNN and Antoencoder
The Derivation About CNN and Antoencoder 公式推导 本人用latex写的关于CNN和autoencoder的推导,前向和反向传播的推导都有证明.pdf下载地址T ...
- Microsoft HoloLens 技术解谜(上)
HoloLens 是什么? HoloLens 是微软发布的可穿戴式增强现实计算设备,它拥有这么几个关键要素: 它是增强现实产品,即 Augmented Reality(AR),AR 技术将计算机生成的 ...
- 升级 Java 编程规范的6个约定
作为 Java 开发人员,我们会遵循一系列的编码风格和开发习惯.习惯使然是一方面,另一方面,我们也从不停下脚步质疑这些习惯.一段时间以后,笔者养成了一些不同于常人的编码风格和开发习惯.当第一次了解到这 ...