`
tzq668766
  • 浏览: 79135 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

JDBC课程笔记

阅读更多

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);


}


 

分享到:
评论

相关推荐

    jdbc课程笔记教案.docx

    jdbc课程笔记教案.docx

    JDBC课程笔记 适合初学者 很详细

    我觉得有了这个笔记就不用看其它的教材了,最多看看定义JDBC需要注意的情况全部写在这个笔记里了 绝对值分的

    Java4相关课程系列笔记之四JDBC学习笔记.doc

    Java4相关课程系列笔记之四JDBC学习笔记

    Java相关课程系列笔记之九Servlet学习笔记

    Java相关课程系列笔记之四JDBC学习笔记 Java相关课程系列笔记之六HTML学习笔记 Java相关课程系列笔记之七CSS学习笔记 Java相关课程系列笔记之八JavaScript学习笔记 Java相关课程系列笔记之九Servlet学习笔记 Java...

    配套学习资料:Java开发 - 尚硅谷JDBC学习笔记

    学习笔记请看我写的文章: Java开发 - 尚硅谷JDBC学习笔记 https://blog.csdn.net/qq_63317769/article/details/136693437

    Java相关课程系列笔记

    Java相关课程系列笔记之八JavaScript学习...Java相关课程系列笔记之四JDBC学习笔记(建议用WPS打开) Java相关课程系列笔记之五XML学习笔记(建议用WPS打开) Java相关课程系列笔记之一Java学习笔记(建议用WPS打开)

    传智播客JDBC技术全程笔记

    传智播客JDBC技术全面课程学习复习笔记,很经典,提供多种连接和优化数据库的技术!值得学习!

    狂神笔记,b站狂神说课程笔记大全(最新)

    b站狂神说课程笔记大全,每个部分都有 狂神说java系列笔记(java基础+javaweb+ssm+微服务)全套 狂神说上课笔记未删减 Java基础到技术升级 1、JavaSE:Java入门 2、JavaSE:基础语法 3、JavaSE:流程控制 4、JavaSE...

    jdbc入门笔记

    jdbc 黑马课程2014的 1.常见的数据库介绍 2.Mysql数据库的安装配置以及简介 3.SQL之数据库创建语句 4.SQL之数据表结构操作语句 5.SQL之数据表记录操作语句 6.Mysql数据库的备份以及恢复。 7.多表设计(外键...

    JAVAWeb全课程笔记( html版)

    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测试以及黑盒测试等东西

    超强MySQL课程笔记_V4.0.ctb

    安装部署 备份恢复 主备复制 读写分离 HA架构 监控审计 压力测试 性能优化 自动化运维 ==数据的存储方式 ... JDBC JAVA 数据库管理系统软件:DBMS Oracle SQL Server DB2 MySQL 开源 MariaDB

    【狂神】JAVA学习全套笔记(完整版)

    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课上笔记

    Java笔记,数学题编码。幸运抽奖、字符查找、集合框架、JDBC

    JavaWeb入门学习笔记.chm

    此文档为传智播客老师JavaWeb入门视频的笔记,其中包含视频中的讲解过程笔记记录以及课程中的案例源代码实现,笔记已转成CHM文档格式,方便阅读 1.此笔记为JavaWeb非常全面的教程,适合JavaWeb爱好者自学。循序渐进...

    JSP网络编程学习笔记源代码 part2

    第四篇为“数据库访问技术”,主要讲述JDBC技术及JSP和Servlet如何通过JDBC访问数据库,以及如何改进数据库的访问和目前流行的Hibernate、iBATIS及Spring集成访问的支持;第五篇为“标签语言和表达式语言”,主要...

    应用源码分析专题之mybatis第一节课快速开始课笔记_11

    1、jdbc 底层没有用连接池、操作数据库需要频繁的创建和关联链接 2、写原生的 jdbc 代码在 java 中,一旦我们要修改 sql 的话,java 需要整

    达内java软件工程师培训笔记(17门课全)

    包含达内java软件工程师培训课程的unix,Oracle,Core java,XML,OOAD&UML,JDBC,HTMLJSP,Sprint,Hibernate等等17门课程的详细笔记

    Mybatis学习笔记整合架构

    1.课程计划 第一天: 1、Mybatis的介绍 2、Mybatis的入门 a)使用jdbc操作数据库存在的问题 b)Mybatis的架构 c)Mybatis的入门程序 3、Dao的开发方法 a)原始dao的开发方法 b)接口的动态代理方式 SqlMapConfig.xml文件...

    Java/JavaEE 学习笔记

    JDBC学习笔记...............165 第一章 JDBC Overview(JDBC综述).........166 第二章 Using JDBC(JDBC的使用)167 第四章 JDBC Advanced Topics(JDBC高级特性)................170 第五章 JDBC2.0 Core Features...

Global site tag (gtag.js) - Google Analytics