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

2023-10-28

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方式

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java连接Oracle数据库(详细!快速上手) 的相关文章

  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • Android中不同线程的数据库访问

    我有一个在 AsyncTasks 中从互联网下载数据的服务 它解析数据并将其存储在数据库中 该服务持续运行 当服务写入数据库时 活动会尝试从数据库中读取更改 我有一个数据库助手 有多种写入和读取方法 这会导致问题吗 可能尝试从两个不同的线程
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • ConcurrentHashMap 内部是如何工作的?

    我正在阅读有关 Java 并发性的 Oracle 官方文档 我想知道Collection由返回 public static
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • 自动删除主键序列中的间隙

    我正在创建一个网页 该网页根据用户操作将数据存储到 MySQL 数据库中 数据库有很多行 行的主键是列 rowID 它只是按顺序对行进行编号 例如 1 2 3 4 用户可以选择删除行 问题是当用户删除最后一行以外的行时 rowID 中有一个
  • Android:打开和关闭SQLite数据库

    我正在开发Android应用程序 我经常在其中访问本地数据库 该数据库可以从不同的主题访问 因此我遇到了数据库的协调问题 我使用以下open and close method public void open mDb mDbHelper g
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • 将数据从 oracle 移动到 HDFS,处理并从 HDFS 移动到 Teradata

    我的要求是 将数据从 Oracle 移至 HDFS 处理HDFS上的数据 将处理后的数据移至 Teradata 还需要每 15 分钟执行一次整个处理 源数据量可能接近50GB 处理后的数据也可能相同 在网上搜索了很多之后 我发现 PRARO

随机推荐

  • 第十二章:使用C语言(Python语言)操作Sqlserver2019数据库

    目录 一 连接数据库的准备工作 二 使用 ODBC 连接数据库 1 ODBC 数据源简介 2 配置 ODBC 数据库源 3 连接数据库函数 4 C 语言通过 ODBC 操作数据库 三 非 ODBC 方式操作数据库 3 1 删除 修改 插入数
  • java 僵尸进程_僵尸进程ZOMBIE

    僵尸进程是指它的父进程已经退出 父进程没有等待 调用wait waitpid 它 而该进程dead之后没有进程接受 就成为僵尸进程 也就是 zombie 进程 一个进程在调用exit命令结束自己的生命的时候 其实它并没有真正的被销毁 而是留
  • 梦幻服务器系统维护后多久再登录,梦幻西游:系统维护后出现重大漏洞,官方发文紧急停机修复?...

    原标题 梦幻西游 系统维护后出现重大漏洞 官方发文紧急停机修复 精彩游戏 快乐无穷无尽 这里是梦幻西游资讯集中营 每天为你分享不一样的游戏乐趣 大家好 我是梦幻小九 当今社会网络游戏成千上万个 相信每一款网络游戏都会偶尔出现系统漏洞 梦幻西
  • 西门子PLC300系列与上位机无法建立以太网通信问题

    问题描述 最近做一个Java开发的WCS项目需要对接机械臂 使用的是PLC313型号 按照之前和其他型号PLC例如1200系列或者1500系列对接的经验配置好相关IP DB块以及数据结构偏移量以后发现无法建立连接 刚开始以为是使用是git上
  • keil编译运行错误,缺少error:#5:#includecore_cm3.h_过路老熊_新浪博客

    keil编译运行错误 提示缺少某个文件等等 如缺少error 5 include core cm3 h 用Keil vision5编译时出现以下错误 error 5 cannot open source input file core cm
  • Java EE 企业级应用 复习 初识Spring框架

    Spring概述 Spring是由Rod Johnson组织开发的一个分层的Java SE EE一站式轻量级开源框架 它最核心的理念是控制反转和面向切面编程 Spring框架的优点 非倾入式设计 降低耦合性 方便开发 支持AOP编程 支持声
  • Linux之Centos7.6版本下载及安装Go语言环境配置,安装Go1.18版本教程笔记-2023版

    文章目录 一 Linux下安装Go环境 1 远程获取 2 解压 3 添加环境变量 5 Go环境配置图 配置完成信息图 二 VsCode连接我们Go 2 1安装对应的插件 2 2进行连接 3 相关配置 4 成功连接 一 Linux下安装Go环
  • 视频在H5页面在微信浏览器不能自动播放问题

    引用官方的JS文件 正式方法 function BGMAutoPlayMgr url this audioContext new window AudioContext window webkitAudioContext window mo
  • 2020那些搭载Imagination IP的设备(国内篇)

    除海外市场外 2020年国内不少智能新品上市 并通过搭载ImaginationGPU 和 NNA IP 实现了更加明显的市场差异化 基于紫光展锐虎贲T7510 平台国内多款 5G 手机上市 智能手机市场 5G AI 无疑成为下一代手机的焦点
  • Unity调用Android类方法

    1 添加Unity的classes jar文件 创建一个Android工程AndroidUnityDemo 由于Unity的版本不同 直接在Unity安装包文件夹里面搜索classes jar文件 如果有多个classes jar文件 一般
  • SpringData JPA 提示:TransactionRequiredException: Executing an update/delete query

    问题场景 package com zzg dao import javax transaction Transactional import org springframework data jpa repository JpaReposi
  • [MySQL]实训七

    实训目的 设置字段的默认值约束 设置字段的自动增长约束 设置字段的外键约束 有关上述三种约束的概念在上一篇文章中有提及 http t csdn cn 9rV9T 1 在数据库db school中重新定义表tb student 要求以表级完整
  • 4. TypeScript 类

    TypeScript 类 1 TS中定义类 class Pointer x number 实例上的属性必须先声明 y number constructor x number y number args number this x x thi
  • 关于研一Python基础课程第四周课后习题的几点理解(含一个问题的订正)

    1 第八题一个函数的订正 def output prime number for i in range number 1 if is prime i True print i end 这里原文的代码是for i in range numbe
  • VS 配置Qt 开发组件

    VS 配置Qt 步骤比较简单 入门级吧 按照如下几步即可快速配置 希望可以帮到你 一 安装VS Qt组件 1 方法一 扩展 gt 管理扩展 gt 联机 搜素Qt Visual Studio Tools 工具 自动下载完成 按照向导提示正常安
  • 深入解析JS工程逆中的反爬机制

    在当今互联网时代 爬虫技术被广泛应用于数据采集 搜索引擎优化等领域 然而 许多网站为了保护其数据和资源 采取了各种反爬机制 JS逆工程是其中一种常见的反爬手段 通过在网页中利用JavaScript代码动态生成内容 使得爬虫难以获取有效数据
  • ansible批量自动安装LNMP

    转载于 https www cnblogs com hai better p 9995258 html
  • 算法[动态规划]---买卖股票最佳时机

    1 题目 给你一个整数数组 prices 其中 prices i 表示某支股票第 i 天的价格 在每一天 你可以决定是否购买和 或出售股票 你在任何时候最多只能持一股股票 你也可以先购买 然后在同一天出售 返回你能获得的最大利润 2 分析特
  • 蓝桥杯2022 python C组

    蓝桥杯2022 python C组 跟之前的就四题不一样 第二题 特殊时间 就是i 从0 9 j从0 9 i是三个一样的 然后看看他们能不能成为 年 月日 时分 成为年只要大于0就好了 称为月日的话月要从1 12 日呢 特殊的日子就二月28
  • Java连接Oracle数据库(详细!快速上手)

    Java连接Oracle数据库及封装JDBC 如果你点开看到了这篇文章 说明你已经或多或少地通过学校学习亦或是自学了解了 oracle 数据库的基本用法 但是实际在开发程序的时候 我们是不可能手动地去操作sql语句的 而是由程序去调用 这个