Jdbc连接Oracle数据库详细案例,占位符的使用

简介: Jdbc连接Oracle数据库详细案例,占位符的使用

一、什么是jdbc ?

Java database connectivity: Java连接数据库技术

1.Sun公司研发java语言的程序员,他们定义出来的java连接数据库的一些接口。这些接口就是jdbc。

2.接口没有具体的功能,但是他统一了java连接各个数据库的标准。具体的实现类有各个数据库厂商去实现。

3.数据库厂商写好这些实现类后,把这些类打成压缩包,放到官网上,供java程序员下载使用。这些压缩包被称为jdbc驱动。

4.Java程序员想连接某个数据库,需要从该数据库官网上把jdbc驱动下载下来引入到自己的项目中,然后通过jdbc的接口提供的方法就可以连接到该数据库上了。

二、Jdbc的api(application program interface)

之前使用plsqldev或者navicat工具连接到数据库的过程:

1.输入账号,密码,数据库,连接到数据库服务器上。

2.连接到数据库上后,我们需要打开一个sql窗口,在sql窗口里面去写sql语句。

3.点击执行按钮

4.如果是dql语句,会得到一个查询结果,如果是dml,没有结果执行结束。

5.关闭窗口,整个过程结束。


使用java连接数据库需要的类或接口:

Connection:封装了数据库的连接,该对象一旦被创建,java代码就连接到了oracle数据库上。

PreparedStatement:执行器对象,当你要执行sql脚本时,你需要把sql脚本放入到该对象里面。

ResultSet:结果集对象,该对象封装的是dql的查询结果。


上面这些接口都在java.sql这个包里面。


Driver:jdbc驱动。各个数据库厂商实现的jdbc实现类。这些驱动是以压缩包的形式存在的。格式jar。这些jar包需要到各个数据库官网上下载。


DriverManager:各个数据库驱动的管理者。他是来管理众多的数据库驱动的。


三、使用jdbc连接Oracle数据库实例


让java连接到数据库上,创建出Connection conn对象。


前提准备:

1.下载jdbc驱动。

C:\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib\ojdbc14.jar

2.把jar包放入到我们的项目中。在项目上面右键—》新建—》folder—》lib

3.让项目识别jar包。在jar上面右键—》bulid path—>add jar to bulid path

数据库连接步骤为:

1.加载驱动。

2.建立连接

3.写sql语句。

4.创建ps对象。

5.执行

6.释放资源。

例如:

package testconn;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 * @author 超伟
 * @2019年5月26日 上午10:13:08
 * @博客:https://blog.csdn.net/MacWx
 */
public class conn {
  /**
   * @param args
   * @throws ClassNotFoundException 
   * @throws SQLException 
   */
  public static void main(String[] args) throws ClassNotFoundException, SQLException {
    // TODO Auto-generated method stub
    //1,加载数据库连接驱动
    Class.forName("oracle.jdbc.OracleDriver");
    //2,创建连接
    /*getConnection需要三个参数:
     * 第一个参数是数据库信息,     
     * jdbc:oracle:thin指的是两台电脑之间连接的协议
     * @localhost:1521:指的是 要找哪台计算机上的数据库,并且指明端口号,localhost指的是自己的本机电脑
     * 第二个参数是连接数据库的账号
     * 第三个参数是连接数据库的密码
     */
    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
    System.out.println(conn);
    //创建出prepareStatement对象,向数据库中插入一条数据
    String sql = "insert into t_student(student_id,student_name,age,sex) values (seq_student.nextval,'macw',18,'男')  ";
    PreparedStatement ps = conn.prepareStatement(sql);
    //执行ps里面 的sql脚本,如果是增删改dml语言,则调用ps 的executeUpdate方法;
    ps.executeUpdate();
    //关闭ps资源,后创建的对象先关闭
    ps.close();
    //3,关闭数据库连接
    conn.close();
  }
}

1.rs对象是对结果集的封装。

2.Rs调用一次next方法,光标就往下移动一行。

3.Next方法是有返回值的。返回值表示移动后,指向的行是否有数据。

4.从rs里面获取数据需要用到rs.getXxx(“字段名”)。其中xxx表示数据类型,参数表示字段名。

5.注意不要在while循环里面试图调用两次next方法。这样展示的数据就会有漏掉的。


这是一个对于数据库的DML (Data Manipulation Language) 数据操纵语言,插入一条数据,是没有返回值的,其他增删改也是一样没有返回值,但是查询就不一样了,查询有返回值,

查询操作的示例代码如下:

package testconn;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 * @author 超伟
 * @2019年5月26日 下午3:15:53
 * @博客:https://blog.csdn.net/MacWx
 */
public class connQuery {
  /**
   * @param args
   * @throws ClassNotFoundException
   * @throws SQLException
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
      // 1,加载数据库连接驱动
      Class.forName("oracle.jdbc.OracleDriver");
      // 2,创建连接
      /* getConnection需要三个参数: 第一个参数是数据库信息, jdbc:oracle:thin指的是两台电脑之间连接的协议
       * @localhost:1521:指的是 要找哪台计算机上的数据库,并且指明端口号,localhost指的是自己的本机电脑
       * 第二个参数是连接数据库的账号 第三个参数是连接数据库的密码
       */
      conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
      // 创建出prepareStatement对象,并查询student表中所有数据
      String sqlQuery = "select * from t_student";
      // 执行ps里面 的sql脚本,如果是查询语言dql,则调用ps 的executeQuery方法;
      ps = conn.prepareStatement(sqlQuery);
      rs = ps.executeQuery(sqlQuery);
      // 从rs中获取数据
      // 让rs结果集光标从第一行的上一行指向第一行数据, 返回值表示如果第二行有数据, rs.next();就是true。否则为false
      // 所以,循环遍历t_student表中所有数据,让rs光标往下移,如果有数据就继续打印,没有就不进入循环
      while (rs.next()) {
        // 获取id
        int id = rs.getInt("student_id");
        // 获取name
        String name = rs.getString("student_name");
        System.out.println(id + "\t" + name);
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      // 关闭ps资源,后创建的对象先关闭
      //这里建议每一个关闭操作都单独抛出一个异常,保证每一个都可以正常关闭
      try {
        if (rs != null) {rs.close();}
      } catch (SQLException e) {
        e.printStackTrace();
      }
      try {
        if (rs != null) { ps.close(); }
      } catch (SQLException e) {
        e.printStackTrace();
      }
      try {
        if (rs != null) {conn.close();    }
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }
}

四、prepareStatement的占位符:

为什么要使用占位符

1.字符串拼接后,代码的可读性差。

2.字符串拼接后,代码容易出现sql注入。安全性出现问题。

例如:假如说要实现一个简单的登录操作,如果用户密码都正确则输出登录成功,否则登录失败!

数据库设计如下:

--创建用户表
CREATE TABLE t_USer(
  user_id NUMBER(5) primary key,
  username VARCHAR2(30),
  password VARCHAR2(30)
);
--建立索引
create sequence seq_uid;
--插入数据
INSERT INTO t_user VALUES (seq_uid.nextval,'aaa','111');
INSERT INTO t_user VALUES (seq_uid.nextval,'bbb','222');
INSERT INTO t_user VALUES (seq_uid.nextval,'ccc','333');
SELECT * FROM t_user;

java 实现登录操作如下:

package testconn;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
/**
 * @author 超伟
 * @2019年5月26日 下午4:26:25
 * @博客:https://blog.csdn.net/MacWx
 */
public class testLogin {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入账号:");
    String name = sc.nextLine();
    System.out.println("请输入密码:");
    String pwd = sc.nextLine();
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
      // 1,加载数据库连接驱动
      Class.forName("oracle.jdbc.OracleDriver");
      // 2,创建连接
      conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
      // 创建出prepareStatement对象
      String sqlQuery = "select * from t_user where username = ? and password = ?";
      // 执行ps里面 的sql脚本,如果是查询语言dql,则调用ps 的executeQuery方法;
      ps = conn.prepareStatement(sqlQuery);
      ps.setString(1, name);
      ps.setString(2, pwd);
      rs = ps.executeQuery();
      // 从rs中获取数据
      if (rs.next()) {
        // 获取id
        int id = rs.getInt("user_id");
        // 获取name
        String usa = rs.getString("username");
        String pwds = rs.getString("password");
        System.out.println(id + "\t" + usa + "\t" + pwds);
        System.out.println("登录成功");
      }else {
        System.out.println("登录失败!");
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      // 关闭ps资源,后创建的对象先关闭
      try {
        if (rs != null) {rs.close();}
      } catch (SQLException e) {
        e.printStackTrace();
      }
      try {
        if (rs != null) {ps.close();}
      } catch (SQLException e) {
        e.printStackTrace();
      }
      try {
        if (rs != null) {conn.close();  }
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }
}

注意事项:

1.占位符可以用到dql,dml

2.占位符只可以表示一个具体的值,不能表示sql中的关键字。

3.给占位符赋值一定要写在执行之前。

目录
打赏
0
0
0
0
65
分享
相关文章
数据库数据恢复——sql server数据库被加密的数据恢复案例
SQL server数据库数据故障: SQL server数据库被加密,无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密,文件名字被篡改。
【YashanDB知识库】如何配置jdbc驱动使getDatabaseProductName()返回Oracle
【YashanDB知识库】如何配置jdbc驱动使getDatabaseProductName()返回Oracle
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
169 28
分布式存储数据恢复—hbase和hive数据库数据恢复案例
分布式存储数据恢复环境: 16台某品牌R730xd服务器节点,每台服务器节点上有数台虚拟机。 虚拟机上部署Hbase和Hive数据库。 分布式存储故障: 数据库底层文件被误删除,数据库不能使用。要求恢复hbase和hive数据库。
53 12
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
数据库数据恢复——MongoDB数据库服务无法启动的数据恢复案例
MongoDB数据库数据恢复环境: 一台Windows Server操作系统虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 管理员在未关闭MongoDB服务的情况下拷贝数据库文件。将MongoDB数据库文件拷贝到其他分区后,对MongoDB数据库所在原分区进行了格式化操作。格式化完成后将数据库文件拷回原分区,并重新启动MongoDB服务。发现服务无法启动并报错。
【YashanDB知识库】oracle与yashanDB的jdbc返回常量列"0.00"的精度和刻度不一致
本文分析了YashanDB中一个客户遇到的问题:常量列"0.00"在Java中被错误映射为整型而非浮点型,导致查询失败。问题源于Oracle与YashanDB的JDBC驱动对常量列"0.00"精度和刻度处理的差异。在未定义状态下,Oracle返回的精度和刻度值可能导致Java程序误判类型。解决方法是修改Java程序,统一使用Decimal类型接收数据,并根据实际字符类型解析。文章提醒,在从Oracle迁移到YashanDB时,需特别注意数值类型的处理差异,避免类似问题发生。
数据库数据恢复—SQL Server报错“错误 823”的数据恢复案例
SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”,附加数据库失败。 如果数据库有备份则只需还原备份即可。但是如果没有备份,备份时间太久,或者其他原因导致备份不可用,那么就需要通过专业手段对数据库进行数据恢复。
【YashanDB 知识库】oracle 与 yashanDB 的 jdbc 返回常量列"0.00"的精度和刻度不一致
oracle 数值类型只有 number 类型,float 和 integer 都只是 number 类型的子类。 且 oracle 的类型 number 类型还有未定义状态,此时取精度(precision)和刻度(scale) 都是不准确的,如果是未定义状态,还是通过精度和刻度判断是否能够转换为整型也是不严谨的,

推荐镜像

更多