数据库编程
一、JDBC的设计
在意识到Java在数据库应用方面上拥有巨大的潜力后,技术人员从1995年开始就致力于拓展Java标准类库,企图用纯“Java”语言来与任何数据库进行交互,但很快就发现这是一项不可能完成的任务。因此Java提供了一套“纯”JavaAPI,以及提供了一个驱动管理器,以允许第三方的数据库驱动程序可以连接到特定的数据库。
JDBC的思想:根据API编写的程序都可以与驱动管理器进行通信,而驱动管理器则通过驱动程序与实际的数据库进行通信
1.1 JDBC驱动程序类型
- 第一类 将JDBC翻译成ODBC[1] ,然后使用一个ODBC驱动程序与数据库进行通信。
- 第二类 又部分Java程序和部分本地代码组成,用于与数据库的客户端API通信
- 第三类 纯Java客户端类库,它使用一种与具体数据库无关的协议将数据库请求发送给服务器构件,然后该构件再将请求返程数据库相关的协议
- 第四类 纯Java类库,他直接将JDBC请求翻译成数据库相关协议
JDBC的目标:使用标准的SQL语句,利用Java语言开发数据库应用,依旧遵循Java语言的约定。数据库供应商和数据库工具开发生提供底层的驱动程序。
1.2 典型用法
使用三层模型,将可视化的表现(位于客户端)从业务逻辑(业务层)和原始数据(位于数据库)中分离出来。
二、SQL结构化查询语言
SQL是结构化查询语言(Structured Query Language)的缩写,包括数据查询、数据定义、数据操纵和数据控制的功能。是关系数据库的标准语言
2.1 SQL的基本概念
1、基本表
一个关系对应一个基本表。基本表是独立存在的表,不是由其他表导出的。
2、视图
视图是从一个或几个基本表导出的表,是一个虚表。
2.2 SQL的动词
SQL功能 | 动词 |
---|---|
数据定义(DDL) | CREATE、DROP、ALTER |
数据查询(DQL) | SELECT |
数据操纵(DML) | INSERT、UPDATE、DELETE |
数据控制(DCL) | GRANT、REVOKE |
其他相关知识暂不概述。
三、JDBC操作
3.1 注册驱动类
通过DriverManager,可以用两种方法来注册驱动器。一种实在Java程序中加载驱动类,如:
Class.forName("com.mysql.jdbc.Driver");
另一种是设置jdbc.drivers
属性,可以再程序中应用下面这样的调用来设置
System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
若想注册多个驱动,需要在第二个参数用冒号:
将他们分开来
3.2 获取数据库连接对象
String url = "jdbc:mysql://localhost:3306/test" //数据库的地址
String username = "root"; //数据库账户
String password = "root"; //数据库密码
Connection con = DriverManager.getConnection(url, username, password)
3.3 创建SQL命令对象
要想执行SQL语句还得再创建一个Statement对象,要想创建Statement对象还得通过之前创建的数据库连接对象
Statement st = con.createStatement();
3.3.1 执行SQL命令
接着我们就可以调用Statement接口中的 executeUpdate() 方法来执行SQL命令。executeUpdate()可以返回受SQL命令影响的行数。
int updateCount = st.executeUpdate(sql);
3.3.2 executeUpate、executeQuerey和execute的区别
Statement接口还有其他主要的方法,下面将会详细介绍它们的功能以及区别
方法 | 功能 |
---|---|
int executeUpate(String sql) | 执行SQL命令中的insert 、update 和delete 语句,还可以执行DDL语句,如create table ,返回受SQL命令影响的行数。特别需要注意,不能用来执行select 命令,否则会抛出java.sql.SQLException 异常 |
ResultSet executeQuerey(String sql) | 执行SQL命令中的select 命令,用来查询结果集的。同样不能执行DML语句也就是上面的三个命令,否则会抛出java.sql.SQLException 异常 |
ResultSet execute(String sql) | 泛化的命令,可以执行前面4个命令的任意一个,可以产生多个结果集和更新计数。如果执行的结果是一个结果集,则返回true ,反之返回false 。 |
long executeLargeUpate(String sql) | 同executeUpate 命令 |
ResultSet getResultSet() | 获取前一条查询命令的结果集。如果前一条命令未产生结果集,则返回null |
int getUpdateCount() | 返回前一条更新语句影响的行数。如果前一条命令未更新数据库,则返回null |
long getLargeUpdateCount() | 同getUpdateCount 命令 |
脚注
ODBC为C语言访问数据库提供了一套编程接口 ↩︎