- 浏览: 79193 次
- 性别:
- 来自: 沈阳
文章分类
最新评论
-
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 2025给类加注释: 方法一 ... -
Cookie与Session专题
2010-09-30 21:52 923Cookie与Session专题一、coo ... -
内部类的分类
2010-09-29 18:04 12457.11. 内部类(注:所有使用内部类的地方都可以不用内 ... -
Java与中文的问题:char变量可以存中文;中文类名,变量名,方法名
2010-09-29 17:06 1237char容量为16bit,可以存中文 public ... -
如何使用Java解析XML
2010-09-23 00:09 1727XML_day01_pm 1.XML可宽展编辑语言 指令: ... -
JDBC中Statement和PreparedStatement的区别
2010-09-22 23:59 963Statement:创建时不传递sql语句;每传入数据库一条s ... -
CoreJava学习心得17
2010-05-01 20:40 852JAVA5.0 的注释 (Annotation) ... -
CoreJava学习心得16
2010-05-01 20:35 933Java5.0的新特性 自动装 ... -
CoreJava学习心得15
2010-05-01 20:30 721反射 反射,在运行时 ... -
CoreJava学习心得14
2010-05-01 20:28 930ObjectInputStream和ObjectOutputS ... -
CoreJava学习心得13
2010-05-01 20:24 8601Java中的I/O 使用I/O流访问file中的内容。 J ... -
CoreJava学习笔记12
2010-05-01 20:23 927死锁问题 多线程不释 ... -
CoreJava学习笔记11
2010-05-01 20:20 719Java多线程编程 进程,即运行中的程序,多任务操作系统中并 ... -
CoreJava学习笔记10
2010-05-01 20:16 705awt事件模型(观察者模式)(重点) 事件模型中,包括事件源 ... -
CoreJava学习笔记9
2010-04-27 22:19 891java中的图形界面 GUI,图形化的用户接口,为了人机交互 ... -
CoreJava学习笔记8
2010-04-27 22:18 909[size=medium] ... -
CoreJava学习笔记7
2010-04-27 22:07 856很重要的一章哦 Java封 ... -
CoreJava学习笔记6
2010-04-26 22:27 971java中的接口 接口是一种程序结构,是特殊的抽象类。接口中 ... -
CoreJava学习笔记5
2010-04-26 22:21 974java中的修饰符 static 表示静态,它可以修饰属性, ... -
CoreJava学习笔记4
2010-04-25 18:43 1088面向对象的三大特征:封装、继承、多态 Java中的封装 封 ...
相关推荐
jdbc课程笔记教案.docx
我觉得有了这个笔记就不用看其它的教材了,最多看看定义JDBC需要注意的情况全部写在这个笔记里了 绝对值分的
Java4相关课程系列笔记之四JDBC学习笔记
Java相关课程系列笔记之四JDBC学习笔记 Java相关课程系列笔记之六HTML学习笔记 Java相关课程系列笔记之七CSS学习笔记 Java相关课程系列笔记之八JavaScript学习笔记 Java相关课程系列笔记之九Servlet学习笔记 Java...
学习笔记请看我写的文章: Java开发 - 尚硅谷JDBC学习笔记 https://blog.csdn.net/qq_63317769/article/details/136693437
Java相关课程系列笔记之八JavaScript学习...Java相关课程系列笔记之四JDBC学习笔记(建议用WPS打开) Java相关课程系列笔记之五XML学习笔记(建议用WPS打开) Java相关课程系列笔记之一Java学习笔记(建议用WPS打开)
传智播客JDBC技术全面课程学习复习笔记,很经典,提供多种连接和优化数据库的技术!值得学习!
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...
非常辛苦收集的~基本上包括计算机所有的方面 ...J2EE中spring,structs,hibernate,EJB,JDBC等 J2ME开发以及笔记 Linux包括Ubuntu和solaris10 oracle,python,XML,UML,php,asp,js Junit测试以及黑盒测试等东西
安装部署 备份恢复 主备复制 读写分离 HA架构 监控审计 压力测试 性能优化 自动化运维 ==数据的存储方式 ... JDBC JAVA 数据库管理系统软件:DBMS Oracle SQL Server DB2 MySQL 开源 MariaDB
2、MySQL + JDBC 3、JAVA WEB 4、Mybatis 5、SSM 6、大前端 7、Vue 8、SpringBoot 9、Spring Security 10、Shiro 11、Spring Cloud 12、JVM 13、JUC 14、Git 15、Linux 16、Redis 17、ElasticSearch 18、Docker
Java笔记,数学题编码。幸运抽奖、字符查找、集合框架、JDBC
此文档为传智播客老师JavaWeb入门视频的笔记,其中包含视频中的讲解过程笔记记录以及课程中的案例源代码实现,笔记已转成CHM文档格式,方便阅读 1.此笔记为JavaWeb非常全面的教程,适合JavaWeb爱好者自学。循序渐进...
第四篇为“数据库访问技术”,主要讲述JDBC技术及JSP和Servlet如何通过JDBC访问数据库,以及如何改进数据库的访问和目前流行的Hibernate、iBATIS及Spring集成访问的支持;第五篇为“标签语言和表达式语言”,主要...
1、jdbc 底层没有用连接池、操作数据库需要频繁的创建和关联链接 2、写原生的 jdbc 代码在 java 中,一旦我们要修改 sql 的话,java 需要整
包含达内java软件工程师培训课程的unix,Oracle,Core java,XML,OOAD&UML,JDBC,HTMLJSP,Sprint,Hibernate等等17门课程的详细笔记
1.课程计划 第一天: 1、Mybatis的介绍 2、Mybatis的入门 a)使用jdbc操作数据库存在的问题 b)Mybatis的架构 c)Mybatis的入门程序 3、Dao的开发方法 a)原始dao的开发方法 b)接口的动态代理方式 SqlMapConfig.xml文件...
JDBC学习笔记...............165 第一章 JDBC Overview(JDBC综述).........166 第二章 Using JDBC(JDBC的使用)167 第四章 JDBC Advanced Topics(JDBC高级特性)................170 第五章 JDBC2.0 Core Features...