- 浏览: 81181 次
- 性别:
- 来自: 沈阳
文章分类
最新评论
-
zzw118:
楼主讲解得很好,学习了!
hibernate延迟加载 -
fengwei199181:
不错。
hibernate延迟加载 -
teacher1998:
写得挺全的,格式也蛮好,thanks
Cookie与Session专题 -
wfl888_2007:
谢谢!~ 又回顾了下基础! 看来要经常逛逛! 不然都忘了! ...
CoreJava学习笔记5 -
whaosoft:
基础挺重要的 没事就该看下呢
CoreJava学习笔记5
JDBC_day01_am
1.
2.解耦合
3.驱动分类
a.JDBC-ODBC桥驱动
application-->jdbc-->桥-->odbc-->数据库
1.效率低;
2.安全性低;
b.部分Java、部分本地代码驱动;
application-->jdbc-->java|native(调用操作系统功能的代码)---->数据库
速度相对较快,但安全性不好;
c.纯Java网络服务器驱动(pure java,net Server Driver)
app-->JDBC--pure Java--中间协议-->netServer--本地协议-->数据库
效率底;
d.纯Java本地协议驱动(pure java,native protocol)
app-->jdbc-->pure Java—本地协议-->数据库
虽然工作量大,但是效率高,更安全;
4.JDBC协议
java.sql.*;(主要\核心特性包)
javax.sql.*;(宽展功能包)
5.java.sql.*中的接口和类
Driver 代表驱动程序
DriverManager 辅助工具类-管理驱动程序
Connection 代表DB连接(某种意义上代表DB)
Statement
PreparedStatement 代表DB操作对象(SQL)
CallableStatement
ResultSet 代表查询结果
DatabaseMetadata
ResultSetMetadata 元数据对象
Types 定义用于标识一般 SQL 类型(称为 JDBC 类型)的常量的类。
JDBC_day01_pm
1.JDBC操作步骤
a.注册/加载驱动 首先导包:classpath环境变量中配置或eclipse中构建工程path
b.建立连接;写URL(包括:网络协议;主机地址(ip:port);资源名称)
c.创建执行对象
d.执行SQL语句
e.处理结果集
f.关闭资源
数据库中URL的格式:
jdbc:mysql://127.0.0.1:3306/test
其他的数据库与上面的格式类似
而oracle的url比较特殊:
jdbc:oracle:thin:@172.18.9.6:1521:tarena
2.OracleDriver内部实现机制,使用静态块加载Driver给DriverManager
package tang.jdbc;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
public class OracleDriver {
static {
Driver driver=new oracle.jdbc.driver.OracleDriver();
try {
DriverManager.registerDriver(driver);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3.数据库连接实例
package tang.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Lab1 {
/**
* @param args
*/
public static void main(String[] args) {
String driver="oracle.jdbc.driver.OracleDriver";
String url="jdbc:oracle:thin:@172.18.9.6:1521:tarena";
String user="scott";
String password="tiger";
try {
Class.forName(driver);
Connection conn=DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("select * from userinfo");
while(rs.next()){
System.out.println(rs.getString(1)+"\t"+rs.getString(2));
}
System.out.println("successfully!");
if(null!=rs){
rs.close();
}
if(null!=stmt){
stmt.close();
}
if(null!=conn){
conn.close();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
}
}
结果:
tang 123456
zhi 123456
qiang 123456
tangzhiqiang tangzhiqiang
yangyi 123456
successfully!
一个可以执行创建数据库的实例(注意执行时的输入信息)
package tang.jdbc;
import java.sql.*;
public class CreateTable {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@172.18.9.6:1521:tarena";
String user = "scott";
String pwd = "tiger";
Driver driver = new oracle.jdbc.driver.OracleDriver();
Connection conn = null;
Statement stmt = null;
String sql=null;
if (null == args[0]) {
System.out
.println("执行格式为:java CreateTable 表名 执行命令(如,create\\drop)");
return;
}
if (null == args[1]) {
System.out
.println("执行格式为:java CreateTable 表名 执行命令(如,create\\drop)");
return;
}
String tablename =args[0];
String command=args[1];
if("create".equals(command)){
sql = "create table " + tablename + "("
+ " ID number(12) primary key,"
+ " PWD varchar(10) not null)";
}else if("drop".equals(command)){
sql="drop table "+tablename;
}
try {
DriverManager.registerDriver(driver);
conn = DriverManager.getConnection(url, user, pwd);
stmt = conn.createStatement();
int result = stmt.executeUpdate(sql);
System.out.println(result);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBC_day02_am
1.结果集遍历
a.游标指向的记录叫当前记录,只有当前记录值可读;
数据库中的行和列的索引都是从“1”开始
b.游标可移动(rs.next())
c.默认的 ResultSet 对象不可更新,仅有一个向前移动的光标,游标的最终位置是最后一条记录后面(单向)afterlast,若要使游标可来回移动可使用下面方法(以下代码片段(其中 con 为有效的 Connection 对象)演示了如何生成可滚动且不受其他更新影响的可更新结果集):
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
d.游标的最初位置beforefirst
2.将具有相同或重复性的代码进行封装
package tang.jdbc;
import java.sql.*;
public class JdbcUtil {
// 静态加载驱动,只需要加载一次就可以
static {
/* 直接使用此段代码也可加载驱动,oracle.jdbc.driver.OracleDriver类中的static自动加载
Driver driver = new oracle.jdbc.driver.OracleDriver();*/
try {
// load Driver
String driver = "oracle.jdbc.driver.OracleDriver";
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
/*
* 直接在命令行中使用java -D jdbc.drivers=oracle.jdbc.driver.OracleDriver
* 直接加载环境变量中的驱动
*/
}
public static Connection getConnection() {
Connection conn = null;
try {
String url = "jdbc:oracle:thin:@172.18.9.6:1521:tarena";
String user = "scott";
String password = "tiger";
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//注意"有连接"的关闭顺序
public static void close(ResultSet rs, Statement stmt, Connection con) {
if (null != rs) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (null != stmt) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (null != con) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static int toInt(String str){
return Integer.parseInt(str);
}
}
3.DriverManager的工作原理(若内存中有多个驱动,它如何进行选择)
JDBC_day02_pm
1.PreparedStatement(预编译后的SQL执行类型)
批量处理SQL
sql=”insert into sd091202 values(?,?)”;
sp=con.prepareStatement(sql);
sp.setInt(1,10);
sp.setString(2,”xiaohegn”);
sp.executeUpdate();
老师建议:面试笔试时使用PreparedStatement,显得有经验
PreparedStatement的小实例:
package tang.jdbc;
import java.sql.*;
public class PreparedStatementTest {
public static void main(String[] args) {
Connection conn=null;
PreparedStatement ps=null;
conn=JdbcUtil.getConnection();//此处的JdbcUtil是上面的封装类
try {
conn.setAutoCommit(false);
ps=conn.prepareStatement("insert into sd091202 values(?,?)");
ps.setInt(1, 2);
ps.setString(2, "bbbb");
conn.commit();
int result= ps.executeUpdate();
System.out.println(result);
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
JdbcUtil.close(null, ps, conn);
}
}
JDBC_day03_am
1.DatabaseMetaData通过Connection获取对象,从而获取数据库的相关信息;
ResultSetMetaData通过ResultSet获取对象,从而获取表的有关信息(如列名,列数目等)
2.事务处理(Transaction)
原子操作:一组相关操作,要么全成功,要么全失败!
JDBC_day03_pm
1.事务处理
a.在执行操作之前调用Connection的setAutoCommit(false)方法;
b.在事务处理成功且完成后再手动提交事务,此时调用Connection的commit()方法;
c.若事务处理失败(如出现异常)则调用Connection的rollback()方法,执行会滚操作,撤销上一次commit()的状态;数据库将保存在其他地方的原数据进行恢复(rollback 操作是将 rollback segment/undo segment 的数据返回)
2.对所读数据正确度的影响因素
a.事务中的dirty read(脏读。何为脏数据:未保存或未提交的数据):一个事务处理到了未保存或未提交的数据;
b.事务中unrepactable read(不可重复读):第一更新丢失
c.事务中的phantom read(幻读):读到的数据量不一致;
如何处理上诉的影响因素:
设置事务隔离: getTrasactionIsolation
Connection.setTransactionIsolation(Connection的静态变量)
3.增强的结果集
设置结果集游标是否可滚动和可更新等,默认的游标只能单向移动且不可更新;
单向只读(默认);双向只读;双向可更新(在生成结果集之前声明,即在创建Statement时设置)如,
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
4.JNDI使用的类javax.naming.*;
获取数据源:Context ctx=new InitialContext();
ctx.lookup(name);
JDBC_day04_am
1.使用PreparedStatement进行批处理过程,如出路1万条,用循环控制:
for(int i=1;i<=10000;i++){
ps.set(1,x);
ps.set(2,y);
.....................
ps.set(n,z);
ps.addBatch();
if(i%100==0){
ps.executeBatch();
}
}
下面为一个具体的实例:
package tang.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class PreparedStatementTest {
/**
* @param args
*/
public static void main(String[] args) {
Connection conn=null;
PreparedStatement ps=null;
conn=JdbcUtil.getConnection();
try {
ps=conn.prepareStatement("insert into aaa values (?,?)");
long start=System.currentTimeMillis();
//位置1
for(int i=1;i<=10000;i++){
ps.setInt(1, i);
ps.setString(2, "tang");
ps.executeUpdate();
//System.out.println(i);
}
//位置2
// for(int i=1;i<=10000;i++){
// System.out.println(i);
// ps.setInt(1, i);
// ps.setString(2, "zhi");
// ps.addBatch();
// if(i%100==0){
// ps.executeBatch();
// }
// }
long end=System.currentTimeMillis();
System.out.println("执行的时间为: "+(end-start)+" 毫秒");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
结果:
位置1:执行的时间为: 85555 毫秒
位置2:执行的时间为: 2210 毫秒
2.连接池(提高连接的效率):池--》可重复使用的资源(资源的特点:有用且稀缺)
特点:用完收回(重复);实现建好;
3.Blob-->Binary Large Object(常用的类型,二进制文件的使用稍多,如:mp3,jpg,zip,exe等)
Clob-->Character Large Object(纯文本[字符串],如text,而pdf等不可存)
主要讲解java.sql.Blob接口:
使用PreparedStatement的setBinaryStream可以将二进制存入数据库;
从数据库中取:使用ResultSet可以获得Blob类性的对象;
Blob数据存入数据库:
package tang.jdbc;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Blob_Save_to_DB_Test {
/**
* 将文件保存进数据库
*/
public static void main(String[] args) {
Connection conn=null;
PreparedStatement ps=null;
conn=JdbcUtil.getConnection();
try {
ps=conn.prepareStatement("insert into table_blob values(?,?)");
File file=new File("/home/soft01/oracle.jar");
InputStream is;
is = new FileInputStream(file);
ps.setInt(1, 2);
ps.setBinaryStream(2, is,is.available());
ps.executeUpdate();
System.out.println("success!");
} catch (SQLException e) {
e.printStackTrace();
}catch (FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
JdbcUtil.close(null, ps, conn);
}
}
将blob类型取出数据库并保存
package tang.jdbc;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Blob_Get_from_DB_Test {
/**
* 将文件取出数据库
*/
public static void main(String[] args) {
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
Blob blob=null;
FileOutputStream fos=null;
conn=JdbcUtil.getConnection();
try {
ps=conn.prepareStatement("select file_content from table_blob where id=?");
ps.setInt(1, 1);
rs=ps.executeQuery();
if(rs.next()){
blob=rs.getBlob(1);
}
InputStream is=blob.getBinaryStream();
try {
fos=new FileOutputStream("/home/soft01/jdbcproject/day03/src/tang/jdbc/desk.gif");
byte b[]=new byte[1024];
try {
while(is.read(b)!=-1){
fos.write(b);
}
fos.close();
is.close();
System.out.println("success");
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
JdbcUtil.close(rs, ps, conn);
}
}
发表评论
-
在myeclipse下给代码加注释
2010-10-26 14:16 2064给类加注释: 方法一 ... -
Cookie与Session专题
2010-09-30 21:52 963Cookie与Session专题一、coo ... -
内部类的分类
2010-09-29 18:04 13007.11. 内部类(注:所有使用内部类的地方都可以不用内 ... -
Java与中文的问题:char变量可以存中文;中文类名,变量名,方法名
2010-09-29 17:06 1273char容量为16bit,可以存中文 public ... -
如何使用Java解析XML
2010-09-23 00:09 1788XML_day01_pm 1.XML可宽展编辑语言 指令: ... -
JDBC中Statement和PreparedStatement的区别
2010-09-22 23:59 991Statement:创建时不传递sql语句;每传入数据库一条s ... -
CoreJava学习心得17
2010-05-01 20:40 882JAVA5.0 的注释 (Annotation) ... -
CoreJava学习心得16
2010-05-01 20:35 963Java5.0的新特性 自动装 ... -
CoreJava学习心得15
2010-05-01 20:30 766反射 反射,在运行时 ... -
CoreJava学习心得14
2010-05-01 20:28 965ObjectInputStream和ObjectOutputS ... -
CoreJava学习心得13
2010-05-01 20:24 8951Java中的I/O 使用I/O流访问file中的内容。 J ... -
CoreJava学习笔记12
2010-05-01 20:23 970死锁问题 多线程不释 ... -
CoreJava学习笔记11
2010-05-01 20:20 772Java多线程编程 进程,即运行中的程序,多任务操作系统中并 ... -
CoreJava学习笔记10
2010-05-01 20:16 741awt事件模型(观察者模式)(重点) 事件模型中,包括事件源 ... -
CoreJava学习笔记9
2010-04-27 22:19 923java中的图形界面 GUI,图形化的用户接口,为了人机交互 ... -
CoreJava学习笔记8
2010-04-27 22:18 935[size=medium] ... -
CoreJava学习笔记7
2010-04-27 22:07 907很重要的一章哦 Java封 ... -
CoreJava学习笔记6
2010-04-26 22:27 1016java中的接口 接口是一种程序结构,是特殊的抽象类。接口中 ... -
CoreJava学习笔记5
2010-04-26 22:21 1028java中的修饰符 static 表示静态,它可以修饰属性, ... -
CoreJava学习笔记4
2010-04-25 18:43 1138面向对象的三大特征:封装、继承、多态 Java中的封装 封 ...
相关推荐
【JDBC 简介】 JDBC(Java Database Connectivity)是Java编程语言中用于与关系数据库交互的一种标准接口。它的出现使得开发人员可以使用Java语言来处理各种数据库,无需关心不同数据库之间的具体差异。JDBC提供了...
**JDBC(Java Database Connectivity)课程笔记** JDBC是Java编程语言中用于访问数据库的标准Java API,它允许Java开发者在程序中执行SQL语句,从而实现对数据库的增删查改操作。本笔记旨在为初学者提供详尽的JDBC...
**Java4相关课程系列笔记之四JDBC学习笔记** JDBC(Java Database Connectivity)是Java语言中用于与各种数据库进行交互的一种标准接口,由Sun Microsystems公司开发并作为Java平台的一部分。JDBC提供了一套API,...
Java相关课程系列笔记之四JDBC学习笔记 Java相关课程系列笔记之六HTML学习笔记 Java相关课程系列笔记之七CSS学习笔记 Java相关课程系列笔记之八JavaScript学习笔记 Java相关课程系列笔记之九Servlet学习笔记 Java...
Java开发 - 尚硅谷JDBC学习笔记是一套深入解析Java数据库连接(JDBC)技术的教程,涵盖了从基础到进阶的各种知识点。JDBC是Java编程语言中用于访问数据库的标准应用编程接口,它允许程序员使用Java来执行SQL语句,...
Java相关课程系列笔记之八JavaScript学习...Java相关课程系列笔记之四JDBC学习笔记(建议用WPS打开) Java相关课程系列笔记之五XML学习笔记(建议用WPS打开) Java相关课程系列笔记之一Java学习笔记(建议用WPS打开)
b站狂神说课程笔记大全,每个部分都有 狂神说java系列笔记(java基础+javaweb+ssm+微服务)全套 狂神说上课笔记未删减 Java基础到技术升级 1、JavaSE:Java入门 2、JavaSE:基础语法 3、JavaSE:流程控制 4、JavaSE...
jdbc 黑马课程2014的 1.常见的数据库介绍 2.Mysql数据库的安装配置以及简介 3.SQL之数据库创建语句 4.SQL之数据表结构操作语句 5.SQL之数据表记录操作语句 6.Mysql数据库的备份以及恢复。 7.多表设计(外键...
Jdbc事务控制管理 常用数据库连接池 编写JDBC框架 客户信息管理系统 Servlet Filter 过滤器 HTTP 协议 文件上传和下载 Servlet事件监听器 JavaMail开发 (案例)Estore电子商城 软件国际化 Java基础加强 JQuery Ajax...
张龙老师的Java SE课程笔记是学习这一关键领域的宝贵资源,旨在帮助学员深入理解Java编程语言的基本概念和技术。 笔记内容可能涵盖了以下几个核心知识点: 1. **Java语言基础**:包括基本数据类型、变量、运算符、...
8. **JDBC**:Java数据库连接(JDBC)是与数据库交互的标准API,Java SE 6对JDBC进行了优化,提高了数据库操作的效率和便捷性。 9. **网络编程**:Java SE 6提供了Socket和ServerSocket等类,用于创建客户端和...
JDBC note.txt** - JDBC(Java Database Connectivity)是Java与数据库交互的标准API。这部分笔记可能包含连接数据库、执行SQL查询、事务处理和结果集操作等内容。 4. **09. Hibernate note.txt** - Hibernate是一...
非常辛苦收集的~基本上包括计算机所有的方面 ...J2EE中spring,structs,hibernate,EJB,JDBC等 J2ME开发以及笔记 Linux包括Ubuntu和solaris10 oracle,python,XML,UML,php,asp,js Junit测试以及黑盒测试等东西
根据【压缩包子文件的文件名称列表】"常彦博系列笔记1-15",我们可以推测笔记是按照章节或者时间顺序组织的,可能分为15个部分,每个部分都对应一个主题或课程单元,例如: 1. Java基础:涵盖变量、数据类型、...
【小滴课堂面试专题课程完整笔记1】 在Java编程领域,面试是检验开发者技能和知识的重要环节。本课程笔记主要涵盖了以下几个关键知识点: 1. 数据结构与算法 - "������������������"(可能是指...
【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。本笔记将详细阐述Hibernate的核心概念、使用方法和特性。 一、...
安装部署 备份恢复 主备复制 读写分离 HA架构 监控审计 压力测试 性能优化 自动化运维 ==数据的存储方式 ... JDBC JAVA 数据库管理系统软件:DBMS Oracle SQL Server DB2 MySQL 开源 MariaDB
### Java课程笔记知识点详解 #### 一、Java简介 **1. Java的发展历程:** - **诞生背景:** Java由Sun Microsystems公司在1995年推出,最初名为OAK,后改名为Java并正式发布。这标志着一种全新的编程语言诞生,它...
- `Jdbc`:这个文件名可能是目录或文件,可能包含JDBC相关的代码示例、教程或笔记。 学习这个课程,初学者将了解到如何配置数据库连接,编写SQL语句,处理结果集,以及如何正确管理和关闭数据库资源。同时,了解...