Java数据库连接技术(JDBC)——Java笔记

Java连接所有数据库的性能都很高,除了SQL Server

关于JDBC(Java DataBase Connection):

  • 由Java提供的操作数据库的一组接口
  • 所有数据库的操作最后都要关闭数据库的连接,否则用户将会无法使用。

4种Java数据库操作的形式:

一.JDBC-ODBC桥接技术(几乎不用)

  • ODBC开放数据库连接,由微软提供的数据库连接应用,利用JDBC间接操作ODBC技术,从而实现数据库的连接;
  • 流程:程序——JDBC——ODBC——数据库         性能最差,但支持版本最新;

二.JDBC直接连接

  • 直接由不同数据库生产商提供的数据库连接驱动程序(实现Java数据库标准的一群类)
  • 由于Java直接操作数据库,性能做好,但支持的JDBC版本不是最新的;

三.JDBC网络连接(应用最多,以此为例)

  • 专门的数据库的网络连接指令进行指定主机的数据库操作

四.模拟指定数据库通信协议,编写自己的数据库操作


java中的所有数据库的类和接口都在java.sql包中

一个类:DriverManager
四个接口:Connection,Statement,ResultSet,PreparedStatement。

连接数据库操作流程:

  1. 加载数据库的驱动程序(向容器加载);
  2. 进行数据库的连接(通过DriverManager类完成,Connection连接);
  3. 进行数据的CRUD(Statement,ResultSet,PreparedStatement);
  4. 关闭数据库操作以及连接 

一.加载驱动程序

  • 驱动程序:(位于Oracle安装目录下,例E:\app\hp\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar),在libra添加此项
  • Oracle驱动程序类:oracle.jdbc.driver.OracleDriver
  • 加载类使用:Class.forName("oracle.jdbc.driver.OracleDriver");

二.连接数据库

  • 数据库连接地址:jdbc:oracle:连接方式:@主机名称:端口名称:数据库的SID;
  • 数据库用户名:
  • 数据库密码:

连接数据库依靠DriverManager类完成

  • 连接数据库:public static Connection getConnection(String url, String user, String password)

 每一个数据库的连接都要使用Connection对象进行封装,所以,每使用一次Connection就表示要连接一次数据库

四.关闭数据库

Connection提供的close()方法:public void close()throws SQLException。

Statement接口实现数据更新和查询(实际开发不常用)

执行模式不适合处理敏感字符

不要在sql语句后加”  ; “

否则报错: 

Exception in thread "main" java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符

更新数据

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class Demo {
    private static final String DBDRIVER="oracle.jdbc.driver.OracleDriver";
    private static final String DBURL="jdbc:oracle:thin:@localhost:1521:midn";
    private static final String USER="scott";
    private static final String PASSWORD="tiger";
    public static void main(String[] srgs)throws Exception{
        //第一步,加载数据库驱动程序,不需要实例化,由容器负责管理
        Class.forName(DBDRIVER);
        //第二步,连接数据库
        Connection conn=DriverManager.getConnection(DBURL,USER,PASSWORD);
        //System.out.println(conn);
        //第三部进行数据库的操作
        Statement stmt = conn.createStatement();
        String sql=" INSERT INTO member(mid,name,birthday,age,note) VALUES(myseq.nextval,'老大',TO_DATE('1996-01-01','yyyy-mm-dd'),22,'没什么好说的') ";
        int len=stmt.executeUpdate(sql);       //执行sql返回更新的数据行
        System.out.println("影响数据行数:"+len);          //有输出则表示连接成功
        //第四步,关闭数据库
        conn.close();

    }
}

查询数据

习惯:按顺序提取,且每个数据仅取一次

package com.test;

import java.sql.*;

public class Demo {
    private static final String DBDRIVER="oracle.jdbc.driver.OracleDriver";
    private static final String DBURL="jdbc:oracle:thin:@localhost:1521:midn";
    private static final String USER="scott";
    private static final String PASSWORD="tiger";
    public static void main(String[] srgs)throws Exception{
        //第一步,加载数据库驱动程序,不需要实例化,由容器负责管理
        Class.forName(DBDRIVER);
        //第二步,连接数据库
        Connection conn=DriverManager.getConnection(DBURL,USER,PASSWORD);
        //System.out.println(conn);
        //第三部进行数据库的操作
        Statement stmt = conn.createStatement();
        String sql=" select mid,name,birthday,age,note from member ";         //在jdbc中的sql语句中不适用*
        ResultSet rs =stmt.executeQuery(sql);
        while (rs.next()){                              //循环取出每一行数据
            //int mid=rs.getInt(1);                //也可按序号提取
           // String name=rs.getString(2);
            //Date birthday=rs.getDate(3);
            //int age=rs.getInt(4);
            //String note=rs.getString(5);
            int mid=rs.getInt("mid");
            String name=rs.getString("name");
            Date birthday=rs.getDate("birthday");
            int age=rs.getInt("age");
            String note=rs.getString("note");
            System.out.println(mid+","+name+","+birthday+","+age+","+note);
        }
        //int len=stmt.executeUpdate(sql);       //执行sql返回更新的数据行
        //System.out.println("影响数据行数:"+len);          //有输出则表示连接成功
        //第四步,关闭数据库
        conn.close();       //非必要
        stmt.close();      //非必要
        conn.close();

    }
}

利用PrepareStatement实现数据操作

与Statement不同:
执行的是完整的具备特殊占位标记的SQL语句,动态设置我们所需要的数据。

在日常开发中常用

更新操作:public int executeUpdate()throws SQLException

查询操作:public ResultSet executeQuery()throws SQLException

在java.unit.date 中的三个类在java.sql.date包中

  • java.sql.Date:描述的日期
  • Java.sql.Time:描述的时间
  • java.sql.Timestamp:描述时间戳

更新数据

更新操作几乎是固定的模式,

import java.sql.*;
import java.util.Date;

public class Demo {
    private static final String DBDRIVER="oracle.jdbc.driver.OracleDriver";
    private static final String DBURL="jdbc:oracle:thin:@localhost:1521:midn";
    private static final String USER="scott";
    private static final String PASSWORD="tiger";
    public static void main(String[] srgs)throws Exception{
        String name="Smith";
        Date birthday = new Date();
        int age=23;
        String note="wohat";
        //第一步,加载数据库驱动程序,不需要实例化,由容器负责管理
        Class.forName(DBDRIVER);
        //第二步,连接数据库
        Connection conn=DriverManager.getConnection(DBURL,USER,PASSWORD);
        //第三部进行数据库的操作
        String sql=" INSERT INTO member(mid,name,birthday,age,note) VALUES(myseq.nextval,?,?,?,?) ";
        PreparedStatement stmt=conn.prepareStatement(sql);
        stmt.setString(1,name);
        stmt.setDate(2,new java.sql.Date(birthday.getTime()));
        stmt.setInt(3,age);
        stmt.setString(4,note);
        int len=stmt.executeUpdate();       //执行sql返回更新的数据行
        System.out.println("影响数据行数:"+len);          //有输出则表示连接成功
        //第四步,关闭数据库
        conn.close();

    }
}

查询数据

import java.sql.*;

public class Demo {
    private static final String DBDRIVER="oracle.jdbc.driver.OracleDriver";
    private static final String DBURL="jdbc:oracle:thin:@localhost:1521:midn";
    private static final String USER="scott";
    private static final String PASSWORD="tiger";
    public static void main(String[] srgs)throws Exception{
        //第一步,加载数据库驱动程序,不需要实例化,由容器负责管理
        Class.forName(DBDRIVER);
        //第二步,连接数据库
        Connection conn=DriverManager.getConnection(DBURL,USER,PASSWORD);
        //第三部进行数据库的操作
        String sql=" select mid,name ,birthday,age,note from member order by mid ";
        PreparedStatement stmt=conn.prepareStatement(sql);
        ResultSet rs=stmt.executeQuery();
        while(rs.next()){
            int mid=rs.getInt(1);
            String name=rs.getString(2);
            Date birthday =rs.getDate(3);
            int age=rs.getInt(4);
            String note=rs.getString(5);
            System.out.println(mid+","+name+","+birthday+","+age+","+note);
        }
        //第四步,关闭数据库
        conn.close();

    }
}

批处理

一次性向数据库发出多条操作指令一起一起执行。

import java.sql.*;
import java.util.Arrays;

public class Demo {
    private static final String DBDRIVER="oracle.jdbc.driver.OracleDriver";
    private static final String DBURL="jdbc:oracle:thin:@localhost:1521:midn";
    private static final String USER="scott";
    private static final String PASSWORD="tiger";
    public static void main(String[] srgs)throws Exception{
        //第一步,加载数据库驱动程序,不需要实例化,由容器负责管理
        Class.forName(DBDRIVER);
        //第二步,连接数据库
        Connection conn=DriverManager.getConnection(DBURL,USER,PASSWORD);
        //第三部进行数据库的操作`
        Statement stmt=conn.createStatement();
        conn.setAutoCommit(false);      //设置不自动提交
        try{

            stmt.addBatch(" insert into member(mid,name) values(myseq.nextval,'a')");
            stmt.addBatch(" insert into member(mid,name) values(myseq.nextval,'b')");
            stmt.addBatch(" insert into member(mid,name) values(myseq.nextval,'c')");
            stmt.addBatch(" insert into member(mid,name) values(myseq.nextval,'d')");
            stmt.addBatch(" insert into member(mid,name) values(myseq.nextval,'e')");
            stmt.addBatch(" insert into member(mid,name) values(myseq.nextval,'f')");
            int result []=stmt.executeBatch();                          //批量处理
            System.out.println(Arrays.toString(result));
            conn.commit();
        }catch(Exception e){
            e.printStackTrace();
        }
        conn.close();
        //第四步,关闭数据库
        conn.close();

    }
}

猜你喜欢

转载自blog.csdn.net/qq_36230524/article/details/82868863