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");
其实写法不止这一种,只是比较推荐这种。感兴趣的可以看看官方的写法:
-
获取连接
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");
}
}
测试结果:
参考资料:
更多推荐
所有评论(1)








Error: bind failed for 0000:00:04.0 - Cannot bind to driver vfio-pci
Error: unbind failed for 0000:00:04.0 - Cannot open /sys/bus/pci/drivers//unbind