Java连接Oracle数据库(详细!快速上手)

Java连接Oracle数据库及封装JDBC

如果你点开看到了这篇文章,说明你已经或多或少地通过学校学习亦或是自学了解了 oracle 数据库的基本用法。但是实际在开发程序的时候,我们是不可能手动地去操作sql语句的,而是由程序去调用。这个时候,就需要使用上编程语言了。本文主要介绍的是Java连接数据库的技术 —— JDBC。

一、JDBC???

JDBC的全称是Java Data Base Connectivity, Java与各大数据库相连接都是使用这门技术。各种数据库的API各不相同,Java是如何实现统一的呢?这是因为sun公司制定了一套标准,各大数据库厂商依据这个标准开发出数据库驱动程序。我们只需要使用这些驱动即可操作数据库。

在oracle安装目录之下可以找到这些驱动程序
在这里插入图片描述
那么多个驱动程序,该选择哪个?

Oracle版本 jdk版本 推荐jar包 备注
Oracle 8i JDK 1.1.x classes111.zip
Oracle 8i JDK 1.1.x classes12.zip
Oracle 9i JDK 1.1.x classes111.jar或者 classes111.zip
Oracle 9i JDK 1.2 and JDK 1.3 classes12.jar 或者 classes12.zip
Oracle 9i JDK 1.4 ojdbc14.jar
Oracle 9i JDK 1.5 ojdbc5.jar
Oracle 9i JDK 1.6 ojdbc6.jar
Oracle 10g JDK 1.2 and JDK 1.3. classes12.jar
Oracle 10g JDK 1.4 and 5.0 ojdbc14.jar
Oracle 11g jdk5 ojdbc5.jar
Oracle 11g jdk6 ojdbc6.jar

按照oracle版本和jdk版本选择,这里的表格仅作参考。

二、连接!!!

说的太多也没用,直接上一段程序体验一下。只需要准备一个IDE(eclipse、IDEA等)和上面所说的驱动程序即可。

创建项目

首先,创建一个普通的Java项目,引入jar包。(我这里是放在了jbdc_oracle目录下)最后把鼠标移到ojdbc.jar,右键,bulild path,add to build path

在这里插入图片描述

IDEA创建的项目同理(Add to libary),会使用Maven的也可以创建Maven项目,在pom文件引入依赖即可。

编写代码

import java.sql.*;

public class Main {

    public static void main(String[] args) {
        try {
            // 1.加载驱动
            Class.forName("oracle.jdbc.driver.OracleDriver");
            // 2.获取连接
            Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//127.0.0.1:1521/orcl","scott","tiger");
            System.out.println(connection.getMetaData());
            // 3.创建Statement对象(可以执行sql的对象)
            PreparedStatement preparedStatement = connection.prepareStatement("select * from dept");
            // 4.获取结果集
            ResultSet resultSet = preparedStatement.executeQuery();
            // 5.对数据进行处理
            while(resultSet.next()) {
                Integer id = resultSet.getInt("DEPTNO");
                String dname = resultSet.getString("DNAME");
                String location = resultSet.getString("LOC");
                System.out.println(id+" "+dname+" "+location);
            }
            // 6.关闭连接 先调用的最后关闭 关闭前判断是否存在
           if(resultSet != null) {
                resultSet.close();
            }
            if(preparedStatement != null) {
                preparedStatement.close();
            }
            if(connection != null) {
                connection.close();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

接下来对以上代码进行一一说明

  • 加载驱动,这里是固定写法,包名不要写错

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

    其实写法不止这一种,只是比较推荐这种。感兴趣的可以看看官方的写法:

    官方JDBC的连接

  • 获取连接

     Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//127.0.0.1:1521/orcl","scott","tiger");
    

    getConnection()里面的三个参数分别是url地址,用户名和密码

    jdbc:oracle:thin:固定写法,其中thin表示连接数据库的一种方式,想进一步了解的话,文末有参考地址

    127.0.0.1:ip地址,这里表示本机

    1521:oracle的端口地址,一般安装后默认为1521

    orcl:数据库的实例名称,一般安装后默认有一个orcl

在这里插入图片描述

JDBC常见的对象

注:以下方法都省略了函数的参数

Connection

意如其名,就是表示数据库和Java之间的一个连接,所有的数据库操作都与其密切相关。

prepareStatement();//PreparedStatement对象
createStatement();//Statement对象
commit();        //提交
rollback();      //回滚
prepareCall();   //存储过程

Statement

executeQuery(); //查询,返回ResultSet
executeUpdate(); //增加、删除、更新,返回受影响的行数
();//增删改查都可以进行,不建议使用。运行结果为ResultSet则返回true,否则返回false

PreparedStatement

PreparedStatement是Statement的子类,PreparedStatement对象可以对sql语句进行预编译,并且可以通过占位符的方式方便我们进行参数的拼接:

PreparedStatement preparedStatement = connection.prepareStatement("select * from dept where deptno=?");
preparedStatement.setInt(1,10); //int对应deptno的类型,1代表第1个问号,

ResultSet

查询后获得的结果集

getXXX(数据库的列名/第几列)  //其中XXX可以是Int,Array,Boolean等
 /*
 第几列对应的是sql中的第几列,
 如select deptno,loc,dname from dept;
 写法:getInt(1) / getInt("deptno")
 select loc,dname,deptno from dept;
 写法:getInt(3) / getInt("deptno");

这几个对象多调用几次就知道如何使用了,总的使用流程是

连接数据库(获取Connection对象) -> 创建Statement对象(Statement/PreparedStatement) -> 用Statement对象执行语句(execute/executeUpdate/executeQuery) -> 利用返回值(execute返回true/false,executeUpdate返回受影响行数,executeQuery返回ResultSet)判断执行的结果 -> 关闭对象

多多使用就对了!

三、增删改查示例

示例的项目结构做出来是这样的:utils包里的DBUtil用于获取数据库连接,pojo包里的Student用于封装数据,dao包里的StudentDao封装了学生的增删改查的方法,最终在Main里面完成测试。
在这里插入图片描述
示例使用到的表:

CREATE TABLE "STUDENT" 
 (	"SNO" VARCHAR2(17 BYTE), 
	"SNAME" VARCHAR2(10 BYTE), 
	"SAGE" NUMBER(*,0), 
	"SSEX" CHAR(2 BYTE), 
	"SDEPT" VARCHAR2(20 BYTE), 
	"SENROLLMENT" DATE
 ) SEGMENT CREATION IMMEDIATE 
Insert into STUDENT (SNO,SNAME,SAGE,SSEX,SDEPT,SENROLLMENT) values ('1806100001','李四',20,'男',null,null);
Insert into STUDENT (SNO,SNAME,SAGE,SSEX,SDEPT,SENROLLMENT) values ('1806100002','王五',21,'男',null,null);
Insert into STUDENT (SNO,SNAME,SAGE,SSEX,SDEPT,SENROLLMENT) values ('1806100003','赵柳儿',21,'女',null,null);

针对学生表写学生类:

public class Student {

    private String id;

    private String name;

    private Integer age;

    private String sex;

    public Student(){}

    public Student(String id, String name, Integer age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}


对Connection类的获取作了简单的封装:

public class DBUtil {

    private static final String URL  ="jdbc:oracle:thin:@127.0.0.1:1521:orcl" ;
    private static final String USERNAME  ="cc" ;
    private static final String PASSWORD  ="ccpassword" ;

    /**
     * 关闭连接
     * @param rs
     * @param stmt
     * @param connection
     */
    public static void closeAll(ResultSet rs,Statement stmt,Connection connection) {
        try {
            if(rs!=null) {
                rs.close();
            }
            if(stmt!=null) {
                stmt.close();
            }
            if(connection!=null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static Connection getConnection() throws ClassNotFoundException, SQLException {
        Class.forName("oracle.jdbc.OracleDriver") ;
        return  DriverManager.getConnection( URL,USERNAME,PASSWORD ) ;
    }

}

增删改查的示例:

public class StudentDao {

    /**
     * 插入学生
     * @param student
     * @return
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public Integer insert(Student student) throws SQLException, ClassNotFoundException {
        Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement("insert into student(sno,sname,sage,ssex) values(?,?,?,?)");
        preparedStatement.setString(1,student.getId());
        preparedStatement.setString(2,student.getName());
        preparedStatement.setInt(3,student.getAge());
        preparedStatement.setString(4,student.getSex());
        Integer count = preparedStatement.executeUpdate();
        if(count == 1) {
            System.out.println("插入成功!");
        } else {
            System.out.println("插入失败");
        }
        DBUtil.closeAll(null,preparedStatement,connection);
        return count;
    }

    /**
     * 根据id删除
     * @param id
     * @return
     * @throws Exception
     */
    public Integer delete(String id) throws Exception{
        Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement("delete from student where sno = ?");
        preparedStatement.setString(1,id);
        Integer count = preparedStatement.executeUpdate();
        if(count == 1) {
            System.out.println("删除成功!");
        } else {
            System.out.println("删除失败");
        }
        DBUtil.closeAll(null,preparedStatement,connection);
        return count;
    }

    /**
     * 根据id更新名字
     * @param name
     * @param id
     * @return
     * @throws Exception
     */
    public Integer updateName(String name,String id) throws Exception {
        Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement("update student set sname = ? where sno = ?");
        preparedStatement.setString(1,name);
        preparedStatement.setString(2,id);
        Integer count = preparedStatement.executeUpdate();
        if(count == 1) {
            System.out.println("更新成功!");
        } else {
            System.out.println("更新失败");
        }
        DBUtil.closeAll(null,preparedStatement,connection);
        return count;
    }

    /**
     * 查询所有数据
     * @return
     * @throws Exception
     */
    public List<Student> selectAll() throws Exception{
        Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement("select sno,sname,sage,ssex from student");
        ResultSet rs = preparedStatement.executeQuery();
        List<Student> list = new ArrayList<>();
        while (rs.next()) {
            // 封装成对象,放入数组中
            String sno = rs.getString("sno");
            String sname = rs.getString(2);
            Integer sage = rs.getInt(3);
            String ssex = rs.getString("ssex");
            Student student = new Student(sno,sname,sage,ssex);
            list.add(student);
        }
        DBUtil.closeAll(rs,preparedStatement,connection);
        return list;
    }

    /**
     * 根据id查询
     * @param id
     * @return
     * @throws Exception
     */
    public Student select(String id) throws Exception{
        Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement("select sno,sname,sage,ssex from student where sno = ?");
        preparedStatement.setString(1,id);
        ResultSet rs = preparedStatement.executeQuery();
        if (rs.next()) {
            // 封装成对象
            String sno = rs.getString("sno");
            String sname = rs.getString(2);
            Integer sage = rs.getInt(3);
            String ssex = rs.getString("ssex");
            DBUtil.closeAll(rs,preparedStatement,connection);
            Student student = new Student(sno,sname,sage,ssex);
            return student;
        }
        DBUtil.closeAll(rs,preparedStatement,connection);
        return null;
    }

}

测试:

public class Main {

    public static void main(String[] args) throws Exception {
        StudentDao studentDao = new StudentDao();

        Student student = new Student();
        student.setId("188888888");
        student.setName("TestInsert");
        student.setAge(20);
        student.setSex("男");

        // 测试插入数据
        studentDao.insert(student);

        // 测试更新数据
        studentDao.updateName("testInsert","188888888");

        // 测试查询数据
        System.out.println(studentDao.select("188888888"));
        System.out.println(studentDao.selectAll());

        // 测试删除数据
        studentDao.delete("188888888");

    }
}


测试结果:

参考资料:

oracle jdbc选择

JDBC连接数据库三种url方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章