当前位置: 首页 > article >正文

IDEA实现Oracle连接以及基本的增删改查操作步骤详解

1. 导入数据库对应jdbc驱动

去Oracle官网下载数据库连接驱动,下载地址:https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html
大家根据java版本选择对应的版本驱动。
在这里插入图片描述
或者在Oracle安装目录下自带有个jdbc文件夹,点进lib,里面有各版本的jdbc包
在这里插入图片描述

2. 导入JAR包

打开项目结构
在这里插入图片描述
点击模块,选择依赖,点+导入Jar包后应用
在这里插入图片描述
在外部库能检索到jar包说明导入成功
在这里插入图片描述
测试能否连接数据库
在这里插入图片描述

3.JDBC介绍

3.1 常用接口

1)Driver 接口
Driver 接口由数据库厂家提供,只需要使用 Driver 接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。如:

装载 MySql 驱动:Class.forName("com.mysql.jdbc.Driver");
装载 Oracle 驱动:Class.forName("oracle.jdbc.driver.OracleDriver");

2)Connection 接口
Connection 与特定数据库的连接(会话),在连接上下文中执行 sql 语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在 JDBC URL 中定义的数据库 Connection 连接上。

连接 MySql 数据库:
Connection conn =
DriverManager.getConnection("jdbc:mysql://host:port/database", "user",
"password");
连接 Oracle 数据库:
Connection conn =DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user",
"password");
连接 SqlServer 数据库:
Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port;
DatabaseName=database", "user", "password");

常用方法:
• createStatement():创建向数据库发送 sql 的 statement 对象。
• prepareStatement(sql) :创建向数据库发送预编译 sql 的 PrepareSatement 对象。
• prepareCall(sql):创建执行存储过程的 callableStatement 对象。
• setAutoCommit(boolean autoCommit):设置事务是否自动提交。

注意:
prepareStatement会先初始化SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率。

createStatement不会初始化,没有预处理,每次都是从0开始执行SQL。

prepareStatement支持批量处理,createStatement只执行一次。

PreparedStatement 有效的防止 sql 注入(SQL 语句在程序运行前已经进行了预编译, 当运行时动态地把参数传给 PreprareStatement 时,即使参数里有敏感字符如 or '1=1’也数据库会作为一个参数一个字段的属性值来处理而不会作为一个 SQL 指令

3)Statement 接口

用于执行静态 SQL 语句并返回它所生成结果的对象。
两种 Statement 类:
• Statement:由 createStatement 创建,用于发送简单的 SQL 语句(不带参数)。
• PreparedStatement :继承自 Statement 接口,由 preparedStatement 创建,用于发送含有一个或多个参数的 SQL 语句。PreparedStatement 对象比Statement 对象的效率更高,并且可以防止 SQL 注入,所以我们一般都使用PreparedStatement。

常用 Statement 方法:
• execute(String sql):运行语句,返回是否有结果集
• executeQuery(String sql):运行 select 语句,返回 ResultSet 结果集。
• executeUpdate(String sql):运行 insert/update/delete 操作,返回更新的行数。
• addBatch(String sql) :把多条 sql 语句放到一个批处理中。
• executeBatch():向数据库发送一批 sql 语句执行。

4)ResultSet 接口
ResultSet 提供检索不同类型字段的方法,常用的有:
• getString(int index)、getString(String columnName):获得在数据库里是varchar、char 等类型的数据对象。
• getFloat(int index)、getFloat(String columnName):获得在数据库里是 Float类型的数据对象。
• getDate(int index)、getDate(String columnName):获得在数据库里是 Date 类型的数据。
• getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean 类型的数据。
• getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。

ResultSet 还提供了对结果集进行滚动的方法:
• next():移动到下一行
• Previous():移动到前一行
• absolute(int row):移动到指定行
• beforeFirst():移动 resultSet 的最前面。
• afterLast() :移动到 resultSet 的最后面。
使用后依次关闭对象及连接:ResultSet → Statement → Connection

4. 编写代码连接Oracle数据库

创建文件夹用作数据访问层Dao,可在BaseDao实现初始化数据库连接和连接关闭的操作
在这里插入图片描述

JDBC使用步骤:

加载 JDBC 驱动程序 → 建立数据库连接 Connection → 创建执行 SQL 的语句
Statement → 处理执行结果 ResultSet → 释放资源

package cn.test_oracle.dao;
/*基本数据访问类(获取数据库连接)*/

import org.junit.platform.commons.function.Try;

import java.sql.*;


public class BaseDao {
    static {
        //加载驱动
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
    //获取数据库连接
    public static Connection getConnection() throws SQLException {
        Connection conn = null;
        try {
            conn =  DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","system","123456" );
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        if (conn != null) {
            System.out.println("连接成功");
        }else {
            System.out.println("连接失败");
        }
        return conn;
    }

    public static void CloseAll(Connection conn, Statement stmt, ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (stmt != null) {
                stmt.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

数据库表字段类型设计如下
在这里插入图片描述

创建实体类,并实现get,set方法

package cn.test_oracle.entity;

import java.util.Date;

//用户表
public class Owners {
    private Long userId; //用户id
    private String userName;
    private String userPwd;
    private Long age;
    private String gender;
    private String email;
    private Date regTime;

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPwd() {
        return userPwd;
    }

    public void setUserPwd(String userPwd) {
        this.userPwd = userPwd;
    }

    public Long getAge() {
        return age;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getRegTime() {
        return regTime;
    }

    public void setRegTime(Date regTime) {
        this.regTime = regTime;
    }
}

在OwnersDao实现对数据库的增删改查操作
增加用户代码如下

    //增加用户
    public static void Add(Owners owners) {
        Connection conn = null;
        //创建执行对象
        PreparedStatement stmt = null;
        try {
            conn = BaseDao.getConnection();
            //SQL语句
            stmt = conn.prepareStatement("insert into PJ.tb_user values (?,?,?,?,?,?,?)");
            //设置占位符
            stmt.setLong(1, owners.getUserId());
            stmt.setString(2, owners.getUserName());
            stmt.setString(3, owners.getUserPwd());
            stmt.setLong(4, owners.getAge());
            stmt.setString(5, owners.getGender());
            stmt.setString(6, owners.getEmail());
            //这里需求的是sql.date,但java提供的是util.date,可以通过java的getTime方法将util.date变成long型,再转换成Date型
            stmt.setDate(7, new Date(owners.getRegTime().getTime()));
            stmt.execute();


        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            BaseDao.CloseAll(conn, stmt, null);
        }
    }

修改用户代码如下

    //修改用户
    public static void Update(Owners owners) {
        Connection conn = null;
        //创建执行对象
        PreparedStatement stmt = null;
        try {
            conn = BaseDao.getConnection();
            //SQL语句
            stmt = conn.prepareStatement("update PJ.tb_user set username=?, userpwd=?, " +
                    "age = ?, gender = ?, email = ?, regtime = ? where  userid = ?");
            //设置占位符

            stmt.setString(1, owners.getUserName());
            stmt.setString(2, owners.getUserPwd());
            stmt.setLong(3, owners.getAge());
            stmt.setString(4, owners.getGender());
            stmt.setString(5, owners.getEmail());
            //这里需求的是sql.date,但java提供的是util.date,可以通过java的getTime方法将util.date变成long型,再转换成Date型
            stmt.setDate(6, new Date(owners.getRegTime().getTime()));
            stmt.setLong(7, owners.getUserId());
            stmt.execute();


        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            BaseDao.CloseAll(conn, stmt, null);
        }
    }

删除用户代码如下

    //删除用户
    public static void Delete(Long id) {
        Connection conn = null;
        //创建执行对象
        PreparedStatement stmt = null;
        try {
            conn = BaseDao.getConnection();
            //SQL语句
            stmt = conn.prepareStatement("delete from PJ.tb_user where userid = ?");
            //设置占位符
            stmt.setLong(1, id);
            stmt.execute();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            BaseDao.CloseAll(conn, stmt, null);
        }
    }

查询代码如下

    //查询用户
    public static ArrayList<Owners> Query(Long id) {
        ArrayList<Owners> list = new ArrayList<>();
        Connection conn = null;
        //创建执行对象
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            conn = BaseDao.getConnection();
            //SQL语句
            stmt = conn.prepareStatement("select * FROM PJ.tb_user where  userid = ?");
            //设置占位符
            stmt.setLong(1, id);
            //处理执行结果
            rs = stmt.executeQuery();
            while (rs.next()){
                Owners s = new Owners();
                s.setUserId(rs.getLong("userid"));
                s.setUserName(rs.getString("username"));
                s.setUserPwd(rs.getString("userpwd"));
                s.setAge(rs.getLong("age"));
                s.setGender(rs.getString("gender"));
                s.setEmail(rs.getString("email"));
                s.setRegTime(rs.getDate("regtime"));
                list.add(s);
            }
            return list;

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            BaseDao.CloseAll(conn, stmt, rs);
        }
    }

看上述代码能否实现对数据库的交互,测试代码如下:

package cn.test_oracle.test;

import cn.test_oracle.dao.OwnersDao;
import cn.test_oracle.entity.Owners;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;


public class testdao {
    public static void main(String[] args) throws ParseException {
        Owners owners = new Owners();
        owners.setUserId(2L);
        owners.setUserName("clearlove7");
        owners.setUserPwd("123456");
        owners.setAge(39L);
        owners.setGender("男");
        owners.setEmail("pnj@3422.com");
        //将String转换成Date两者处理方式,方式1
/*        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
        Date date = fmt.parse("2021-01-30");*/
        //将String转换为Date,方式2
        Date date = java.sql.Date.valueOf("2023-02-12");
        owners.setRegTime(date);

        OwnersDao.Add(owners);//增加用户
        OwnersDao.Update(owners);//修改用户信息
        OwnersDao.Delete(2L);//删除用户信息
        ArrayList<Owners> a = OwnersDao.Query(1L);//查询用户信息

        for (int i = 0; i < a.size(); i++) {
            Owners owner1 = a.get(i);
            System.out.println(owner1.getUserId());
            System.out.println(owner1.getUserName());
            System.out.println(owner1.getUserPwd());
            System.out.println(owner1.getGender());
            System.out.println(owner1.getAge());
            System.out.println(owner1.getEmail());
            System.out.println(owner1.getRegTime());
        }
    }
}

结果如下,用户2成功添加进数据库。
在这里插入图片描述
查询结果:
在这里插入图片描述


http://www.kler.cn/a/411892.html

相关文章:

  • LeetCode 0632.最小区间:优先队列
  • 鸿蒙多线程开发——sendable共享容器
  • 探秘嵌入式位运算:基础与高级技巧
  • 金融租赁系统助力企业升级与风险管理的新篇章
  • lua除法bug
  • 深度学习day4-模型
  • 网易游戏用户流失预测实践
  • 【公益接口】不定时新增接口,仅供学习
  • 高校宿舍节能用电现状及智慧监管平台构建
  • javax.xml.ws.soap.SOAPFaultException: ZONE_OFFSET
  • 鸢尾花Iris训练数据和测试数据的分割和训练数据的散点图矩阵绘制
  • Linux中的“块”是什么
  • torch张量与函数表达式写法
  • 技术周刊 | 前端真的凉了吗?2024 前端趋势解读
  • 外包干了3年,技术退步明显...
  • 大数据新视界 -- Hive 查询性能优化:基于成本模型的奥秘(上)(5/ 30)
  • HTTP代理是什么,主要用来干嘛?
  • 在xml的sql的子查询中使用row_number over之后再在mapper的接口层传入Page对象实现分页功能,出现Bug
  • 鸿蒙系统的崛起:抓住机遇与挑战,创造更好的应用体验
  • Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway)
  • Emgu (OpenCV)
  • 计算机网络socket编程(3)_UDP网络编程实现简单聊天室
  • 多输入多输出 | Matlab实现TCN-GRU时间卷积神经网络结合门控循环单元多输入多输出预测
  • 【机器学习chp7】SVM
  • ElasticSearch学习篇18_《检索技术核心20讲》LevelDB设计思想
  • Unity 导出 xcode 工程 并给 Info.plist 文件添加字段