ava与数据库交互的主要API是jdbc。jdbc的主要目的是:
1.通过使用SQL或者专有的SQL扩展,程序员可以利用java语言开发访问数据的应用。
2.数据库开发商或者数据库工具开发商改进数据库驱动程序
jdbc通用的使用方式如下:
Class.forName(jdbcDriverName); Connection conn= DriverManager.getConnection(url,user,password);
根据数据库和驱动不同,下面是一些常用数据库的jdbc:
1.mysql:
Class.forName("com.mysql.jdbc.Driver");
Connection conn=
DriverManager.getConnection("jdbc:mysql://localhost:3306/database","user","password");
2.oracle(thin):
Class.forName("Oracle.jdbc.driver.OracleDriver");
Connection conn=
DriverManager.getConnection("jdbc:oracle:thin@localhost:1521/database","user","password");
3.DB2:
Class.forName("com.ibm.db2.jdbc.app.DB2Driver");
Connection conn=
DriverManager.getConnection("jdbc:db2://localhost:50000/sample","user","password");
其他类型数据库与java一起使用的频率就比上面这些出现的频率小多了。
在配置jdbc驱动的时候,oracle与mysql的配置是一样,但是DB2有些不同,因为DB2的jdbc有三个jar包,在配置的时候要如下操作:
1. 将 db2jcc.jar 和 db2jcc_license_cu.jar 配置在环境变量classpath下。
2. 将 db2jcc.jar 和 db2jcc_license_cu.jar复制在你所用的应用服务器中工程下的WEB-INF/lib包下
3.jdbc中数据库地址URL为:jdbc:db2://localhost:50000/sample
4.数据库驱动类为:com.ibm.db2.jdbc.jcc.DB2Driver
5.使用正确的user和password进行连接测试
执行SQL的操作
要执行SQL,首先要创建一个Statement对象来进行SQL操作。创建方法如下:
Statement st=conn.createStatement();
Statement执行操作SQL的方法有三个,分别是:
st.execute(String sql):执行任意的SQL语句,它通常用于用户提供的交互式查询,服务于技术人员
st.executeUpdate(String sql):执行插入,更新,删除语句,以及表的创建删除语句,返回sql语句影响的数据的行数
st.executeQuery(String sql):只执行查询操作,返回结果集ResultSet。
为什么不能只提供execute(String sql)方法?
因为在正常的情况下,查询操作比其他的操作更频繁。单独提供方法可以更好地优化它。
当查询操作时,可以使用如下的方式进行取出查询到的数据:
ResultSet rs=st.executeQuery(sql);
while(rs.next()){
//rs.getString(1);类似的操作
}
注意:由于每一次查询都会产生这样的结果集,所以在使用完之后要立即关闭这个ResultSet,产生它的Statement,或者进一步关闭Connection。以免大量查询操作导致内存不足。如果这个连接conn使用的时间很短,可以直接关闭conn就可以了。
预处理方式的查询(prepared statement)
在sql参数中使用“?”来代替从现实情况中取到的实际参数值,再用它生成prepareStatement对象,然后通过prepare statement的方法来进行替换占位符“?”,所有的占位符替换完成后,才进行执行。下面是代码示例:
String sql="select * from person where name=? and age=?";
PreparedStatement pst=conn.createPreparedStatement(sql);
pst.setString(1,"wangxiao");
pst.setInt(2,25);
ResultSet rs=pst.executeQuery();
读写LOB问题
在SQL中,二进制大对象称为BLOB,字符型大对象称为CLOB。要读取LOB,需要执行select语句,然后在ResultSet上调用getBlob和getClob方法,这样可以获取BLOB或者CLOB类型的对象。要从BLOB中获取二进制数据可以调用getBytes或者getInputStream。类似的获取CLOB对象,,就可以调用getSubString或者getCharacterStream来获取其中的字符数据。下面是一段BLOB从数据库读出和写入的代码片段:
从数据库读取:
PreparedStatement pst = conn.prepareStatement("select cover from book where isbn=?");
pst.setString(1, "isbn");
ResultSet res = pst.executeQuery();
if (res.next()) {
Blob blob = res.getBlob(1);
Image image = ImageIO.read(blob.getBinaryStream());
}
向数据库写入:
Blob blob=conn.createBlob();
int offset=0;
OutputStream out=blob.setBinaryStream(offset);
RenderedImage image=null;// set the source of store
ImageIO.write(image, "PNG", out);
PreparedStatement pst=conn.prepareStatement("insert into cover values (?,?)");
pst.setString(1,"isbn");
pst.setBlob(2, blob);
pst.executeUpdate();
SQL转义问题
这个问题涉及到日期和时间的字面量,调用标量函数,调用存储过程,外连接,like中用到的转义字符。最普遍的情况就是时间字符串,时间戳的问题。
多结果集的处理
在执行存储过程或者在试用允许在单个查询中提交多个select语句的数据库时,查询可能返回多个结果集。下面是获取所有结果集的步骤:
1.试用execute方法来执行SQL语句
2.获取第一个结果集或者更新计数
3.重复调用getMoreResults方法移动到下一个结果集
4.当不存在更多的结果集或更新计数时完成操作。
boolean done=false;
boolean isResult=statement.execute(command);
while(!done){
if(isResult){
ResultSet result=statement.getResultSet();
//do something with result
}else{
int updateCount=statement.getUpdateCount();
if(updateCount>=0){
//do something with update
}else{
done=false;
}
}
isResult=statement.getMoreResults();
}
获取新建数据行的自动生成键
statement.executeUpdate(insertSql,Statement.RETURN_GENERATED_KEYS);
ResultSet rs=statement.getGeneratedKeys();
int key;
if(rs.next()){
key=rs.getInt(1);
}
可滚动和可更新的结果集
我们非常疑惑,有了上面的固定的结果集ResultSet之后,这一部分真的需要吗?
我经过仔细的查阅资料文档后发现,这个可滚动的结果集是用于不断同步数据库表单中数据的时候使用的。但是有限定条件用于一张表的可视化显示,用户会用到在结果集上前后移动。
使用可滚动结果集的语法:
Statement st=conn.createStatement(type,concurrency);
PreparedStatement pst=conn.preparedStatement(command,type,concurrency);
ResultSet rs=st.executeQuery(sql);
这样的rs里面会带有一个光标,可以前后移动。
如果是可更新的结果集,要要求更严格一些,有些数据库不一定能够支持这种形式。这种操作会始终连接着数据库,效率是个问题。
行集
行集的出现就是为了解决可更新结果集长时间连接数据库的问题。行集有很多种实现类型,有CachedRowSet,WebRowSet,jdbcRowSet,FilterdRowSet,JoinRowSet.下面是CachedRowSet的启用语法:
ResultSet rs=st.executeQuery(sql);
CachedRowSet crs=new com.sun.rowset.CachedRowSetImpl();
crs.populate(rs);
conn.close();
//使用crs操作
元数据
元数据在SQL中是用来描述数据库或其组成部分的数据。我们可以获得三类元数据:关于数据库的元数据,关于结果集的元数据,关于预备语句参数的元数据。这个元数据在百度上百度一下,可以看到它的标准定义,它是描述基本数据信息的数据。操作元数据的语法如下:
DatabaseMetaData meta=conn.getMetaData();
ResultSet mrs=meta.getTables(null,null,null,new String[]{"TABLE"});
元数据结果集中第一列代表了表目录,第二列代表了表结构模式,第三列表名,第四列表类型,第五列关于表的注释。
事物
这个是数据库操作中常用到的数据操作保障,一般情况下要在jdbc操作失败的时候进行回滚操作,前提是jdbc操作不是自动提交事物的。
取消事物自动提交的语法是:
conn.setAutoCommit(false);
提交语法:conn.commit();
回滚语法:conn.rollback();
当一个处理过程中涉及到很多步骤的非查询操作的时候,可以设立保存点,以更好地控制回滚操作。
使用语法说明:
//step1 jdbc operations
Savepoint svpt=conn.setSavepoint();
//step2 jdbc operations
if(...)conn.rollback(svpt);//如果step2操作失败的话
//other operations
conn.commit();
批量更新
当一起执行多个非查询操作的时候,可以考虑是用批量更新的方式来提高效率。这种效率随着操作语句数量的增多而提高的更多。批量操作在处理异常时可以作为单个事物操作。具体使用,查询batch update.
-
java面向对象下:Java数据库编程
19.Java数据库编程: JDBC概述: JDBC(Java Database Connection)是java中提供的一套数据库编程API,它定义了一套用来访问数据库的标准Java类 ...
-
java数据库编程——读写LOB、可滚动和可更新的结果集、元数据
java 数据库编程 1. 读写LOB 除了数字.字符串和日期之外,许多数据库还可以存储大对象,例如图片或其它数据.在SQL中,二进制大对象称为BLOB,字符型大对象称为CLOB. 要读取LOB,需要 ...
-
菜鸡的Java笔记 java数据库编程(JDBC)
java数据库编程(JDBC) 介绍 JDBC 的基本功能 content (内容) 现在几乎所有的项目开发过程之中都不可能离开数据库,所以在java ...
-
Java数据库编程、XML解析技术
数据库编程 JDBC概述 是Java Database Connecive,即数据库连接技术的简称,它提供了连接各种常用数据库的能力. 是一种用于执行SQL语句的Java API,可以为多种关系数据库 ...
-
java 数据库编程 学习笔记 不断更新
最近开始学习java,感觉java的数据库编程需要发个随笔记录一下,话不多说 切入正题. 一.数据库访问技术的简介 应用程序 → 执行SQL语句 →数据库 → 检索数据结果 → 应用程序 ( ...
-
JAVA数据库编程、JAVA XML解析技术
JDBC概述 JDBC是JAVA中提供的数据库编程API curd :数据库增删改 链接字符串:String url = "mysql :/localhost :3306/jdbc/&quo ...
-
JDBC与JAVA数据库编程
一.JDBC的概念 1. JDBC (Java DataBase Connectivity) Java数据库连接 a) 主要提供java数据库应用程序的API支持 2. JDBC的主要功能 a) 创建 ...
-
JAVA数据库编程(JDBC技术)-入门笔记
本菜鸟才介入Java,我现在不急着去看那些基本的语法或者一些Java里面的版本的特征或者是一些晋级的知识,因为有一点.Net的OOP编程思想,所以对于Java的这些语法以及什么的在用到的时候在去发现学 ...
-
JDBC与Java数据库编程基础
一.JDBC 概述 1.什么是JDBC 称为Java数据库连接,它是一种用于数据库访问的应用程序API,由一组用Java语言编写的类和接口组成,有了JDBC就可以用同一的语法对多种关系数据库进行访问, ...
-
Java数据库编程及Java XML解析技术
1.JDBC概述 A. 什么是JDBC? Java DataBase Connectivity:是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成.通过这些类和接口 ...
随机推荐
-
swift开发新项目总结
新项目用swift3.0开发,现在基本一个月,来总结一下遇到的问题及解决方案 1,在确定新项目用swift后,第一个考虑的问题是用纯swift呢?还是用swift跟OC混编 考虑到新项目 ...
-
ASP.NET MVC 4 的JS/CSS打包压缩功能-------过滤文件
今天在使用MVC4打包压缩功能@Scripts.Render("~/bundles/jquery") 的时候产生了一些疑惑,问什么在App_Start文件夹下BundleConfi ...
-
jquery trigger伪造a标签的click事件取代window.open方法
$(function() { $('#btnyes').click(function () { $('#ssss').attr("href", "http://www.b ...
-
WCF异步
WCF异步与否由客户端来决定 服务端接口: // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”. [ServiceContract] ...
-
Junit使用教程(一)
几乎所有程序员都听说过Junit的大名,但不知真正懂得运用它的人有多少,我便是其中的一个小白. 知道Junit是用来测试的,但却把“宝刀”当成了“菜刀”用.为了从此不再菜鸟,特此总结整理了下Junit ...
-
Effective C++_笔记_条款09_绝不在构造和析构过程中调用virtual函数
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 为方便采用书上的例子,先提出问题,在说解决方案. 1 问题 1: ...
-
[大数据]-Elasticsearch5.3.1+Kibana5.3.1从单机到分布式的安装与使用<;1>;
一.Elasticsearch,Kibana简介: Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域, Lucene可以被认为是迄今为止最先 ...
-
python中从文件中读取数据2
#average7.py 文件中有多行,且每行有多个数字用逗号隔开 def main(): fileName = input("What file are numbers in?" ...
-
Zabbix实战-简易教程(4)--Server端安装
在数据库安装完成后,接着开始安装server端了.我们这里采用yum安装. 3.2.0 安装需求 ● PHP 5.6.18 ● curl 7.47.1 ● zabbix_server (Zabbix) ...
-
Intellij IDEA 安装配置Gradle
1.安装 到官网链接下载最新的bin版本,解压到 D:\Program Files (x86)\JetBrains\IDEA Configuration And Cache\gradle 配置环境变量 ...