JDBC

.JDBC原理概述

1JDBC是一套协议,是JAVA开发人员和数据库厂商达成的协议,也就是由Sun定义一组接口,由数据库厂商来实现,并规定了JAVA开发人员访问数据库所使用的方法的调用规范。

2JDBC的实现是由数据库厂商提供,以驱动程序形式提供。

3JDBC在使用前要先加载驱动。

JDBC对于使用者要有一致性,对不同的数据库其使用方法都是相同的。

.JDBCAPI

java.sql包和javax.sql

Driver接口(驱动),在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。这意味着用户可以通过调用以下程序加载和注册一个驱动程序

Class.forName("oracle.jdbc.driver.OracleDriver")

DriverManager类(驱动管理器),它可以创建连接,它本身就是一个创建Connection的工厂(Factory)

Connection接口,会根据不同的驱动产生不同的连接

Statement接口,发送sql语句

ResultSet接口(结果集),是用来接收select语句返回的查询结果的。其实质类似于集合。

 

 

.JDBC应用步骤

1,注册加载一个driver驱动

2,创建数据库连接(Connection

3,创建一个Statement(发送sql

4,执行sql语句

5,处理sql结果(select语句)

6,关闭Statement

7,关闭连接Connection

 

注意:67两个步骤是必须要做的,因为这些资源是不会自动释放的,必须要自己关闭

访问Oracle的数据库的驱动名字叫ojdbc14.jar

    注册加载驱动driver,也就是强制类加载

    Class.forName(Driver包名.Driver类名)

    Driver d=new Driver();//注意:这个方法不能用参数来构造

    DriverManager.registerDriver(d);

    OracleDriver的全名oracle.jdbc.driver.OracleDriver

    mysqlDriver的全名com.mysql.jdbc.Driver

    SQLServerDriver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver

 

    创建连接

    DriverManager.getConnection(String url,String username,String password);

    Connection连接是通过DriverManager的静态方法getConnection(.....)来得到的,这个方法的实质是把参数传到实际的Driver中的connect()方法中来获得数据库连接的。

    OracleURL值是由连接数据库的协议和数据库的IP地址及端口号还有要连接的数据库的库名(DatebaseName

    Oracle URL的格式

    jdbc:oracle:thin:(协议)@XXX.XXX.X.XXX:XXXXIP地址及端口号):XXXXXXX(所使用的库名)

    例:jdbc:oracle:thin:@192.168.0.20:1521: dbName

    MySql URL的写法

    例: jdbc:mysql://localhost:3306/ dbName

    SQLServer URL的写法

    例:jdbc:microsoft:sqlserver://localhost:1433/ dbName

 

.JDBC基本方法

    DriverManager:如果有多个驱动可用的话,DriverManager会根据URL选择其中一个可用的驱动.  

    Driver:可以选择固定的驱动

    Driver driver = new oracle.jdbc.driver.OracleDriver();

    String user = "sd0613";

String password = "sd0613";

Properties prop = new Properties();

prop.setProperty("user",user);

prop.setProperty("password",password);

    driver.connect(url,properties);

    

    executeQuery(sqlString);//返回结果集

    executeUpdate(sqlString);//返回值为该次操作影响的记录条数,  create table返回0

    execute(sqlString);

    //适用于不知道具体的操作是什么,返回值是boolean类型的

    //如果返回值是true,代表执行查询操作;否则代表执行更新操作.

    

    ResultSet

    next()方法:

    1.判断是否存在下一条记录

    2.将游标移向下一条记录   

    getXXX(字段名或字段序号)//注意:字段序号从1开始

    

    关闭问题:

    使用Connection对象获得一个StatementStatement中的executeQuery(String sql) 方法可以使用select语句查询,并且返回一个结果集 ResultSet通过遍历这个结果集,可以获得select语句的查询结果,ResultSetnext()方法会操作一个游标从第一条记录的前边开始读取,直到最后一条记录。executeUpdate(String sql) 方法用于执行DDLDML语句,可以updatedelete操作。

注意:要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为StatementResultSet是需要连接时才可以使用的,所以在使用结束之后有可能其他的Statement还需要连接,所以不能先关闭Connection


一、Statement  

execute(sql); 当不知道执行的SQL语句是什么类型的时候执行 ,返回值是boolean

executeQuery(sql); 执行查询语句

executeUpdate(sql); 执行更新语句

二、PreparedStatement

可以使用参数替代sql语句中的某些参数使用 "?"代替,他先将带参数的sql语句发送到数据库,进行编译,然后PreparedStatement会将参数发送给数据库。

在使用PreparedStatement时,在设置相应参数时,要指明参数的位置和类型,以及给出参数值

根据不同的参数类型使用不同的setXXX(参数的位置,参数值)来设置参数

例:

public void insert(Student s){

Connection con=ConnectionFactory.getConnection();//建立连接

String sql="insert into student(id,name) values(?,?)";

PreparedStatement ps=null;

try {

ps=con.prepareStatement(sql);

//创建一个PreparedStatement

        int index=1;

ps.setInt(index++,s.getStuId());  //为参数赋值

ps.setString(index++,s.getName());

ps.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

}finally{

if(ps!=null)

try {

ps.close();

} catch (SQLException e) {

e.printStackTrace();

}

if(con!=null)

try {

con.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

 

CallableStatement是可以用非sql语句来访问数据库,他是通过调用存储过程(PL/SQL)来访问数据库的。可以直接使用连接来调用 prepareCall(...)方法,来执行这个存储过程,"..."是存储过程的名字。

对于系统时间要去数据库时间

TimeStamp Date都可以保存时间

TimeStamp可以保存时、分、秒的数据,Date只保存日期年月的信息。  

 

SQLException是检查异常必须处理要么throws ,要么try{}catch(){}

getErrorCode()可以获得错误码,可以对错误进行查询。

三、源数据

JDBC中有两种源数据,一种是数据库源数据,另一种是ResultSet源数据。

源数据就是描述存储用户数据的容器的数据结构。

ResultSet rs=ps.executeQuery(sql);

ResultSetMetaData m=rs.getMetaData();

getColumnCount(),获得实际列数

getColumnName(int colnum),获得指定列的列名

getColumnType(int colnum),获得指定列的数据类型

//打印结果集

public static void printRS(ResultSet rs)throws SQLException{

    ResultSetMetaData rsmd = rs.getMetaData();

    while(rs.next()){

       for(int i = 1 ; i < = rsmd.getColumnCount() ; i++){

          String colName = rsmd.getColumnName(i);

          String colValue = rs.getString(i);

          if(i>1){

             System.out.print(",");

          }

          System.out.print(name+"="+value);

       }

       System.out.println();

    }

}

四、数据库源数据

DatabaseMetaData

getURL(),获得连接数据库的URL

getDatabaseProductName() 获得数据库产品的名称

getDriverVersion() 获得JDBC驱动程序的String形式的版本号

getTables()获得数据库中该用户的所有表

getUserName() 获得数据库用户名。

五、异常的处理

try{}

catch(SQLException){}

try{}

catch(Exception){}



.事务(Transaction

原子操作:不可再分的操作,一个操作不能再分成比它更细小的操作.

事务是针对原子操作的,要求原子操作不可再分,并且必须同时成功同时失败。

事务就是把一些非原子操作,变成原子操作,由应用服务器来提出要求,由数据库服务器来执行操作.

 

JDBC中默认是自动提交的,如果要想使用事务,需要按以下步骤执行:

1.要调用con.setAutoCommit(false)方法,把自动提交(commit)置为false

2.进行正常的数据库操作

3.如果操作成功了可以选择con.commit(),或者操作失败时选择con.rollback();

注意:打开事务就要关闭自动提交,当不需要再使用事务的时候调用setAutoCommit(true).

1.更新特性常量:

CONCUR_READ_ONLY 只读结果集(默认)

CONCUR_UPDATABLE 可更新结果集

 

2.滚动特性常量:

TYPE_FORWARD_ONLY ,该常量表示指针只能向前移动的 ResultSet 对象的类型。(默认)

TYPE_SCROLL_INSENSITIVE ,该常量指示可滚动但通常不受其他更改影响的 ResultSet 对象的类型。

TYPE_SCROLL_SENSITIVE ,该常量指示可滚动并且通常受其他更改影响的 ResultSet 对象的类型。

//敏感:数据库改变,结果集改变.

语法:         

Statement st=null;

st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE)

在创建Statement的时候就要指定这两个参数,使用Statement,第一个参数代表滚动特性常量,第二个代表更新特性常量



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值