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

火影  论坛元老 | 2024-12-21 07:04:29 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1017|帖子 1017|积分 3051

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 接口就可以了。在编程中要毗连数据库,必须先装载特定厂商的数据库驱动程序,差别的数据库有差别的装载方法。如:
  1. 装载 MySql 驱动:Class.forName("com.mysql.jdbc.Driver");
  2. 装载 Oracle 驱动:Class.forName("oracle.jdbc.driver.OracleDriver");
复制代码
2)Connection 接口
Connection 与特定命据库的毗连(会话),在毗连上下文中实行 sql 语句并返回结果。DriverManager.getConnection(url, user, password)方法创建在 JDBC URL 中定义的数据库 Connection 毗连上。
  1. 连接 MySql 数据库:
  2. Connection conn =
  3. DriverManager.getConnection("jdbc:mysql://host:port/database", "user",
  4. "password");
  5. 连接 Oracle 数据库:
  6. Connection conn =DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user",
  7. "password");
  8. 连接 SqlServer 数据库:
  9. Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port;
  10. 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 → 释放资源

  1. package cn.test_oracle.dao;
  2. /*基本数据访问类(获取数据库连接)*/
  3. import org.junit.platform.commons.function.Try;
  4. import java.sql.*;
  5. public class BaseDao {
  6.     static {
  7.         //加载驱动
  8.         try {
  9.             Class.forName("oracle.jdbc.driver.OracleDriver");
  10.         } catch (ClassNotFoundException e) {
  11.             throw new RuntimeException(e);
  12.         }
  13.     }
  14.     //获取数据库连接
  15.     public static Connection getConnection() throws SQLException {
  16.         Connection conn = null;
  17.         try {
  18.             conn =  DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","system","123456" );
  19.         } catch (SQLException e) {
  20.             throw new RuntimeException(e);
  21.         }
  22.         if (conn != null) {
  23.             System.out.println("连接成功");
  24.         }else {
  25.             System.out.println("连接失败");
  26.         }
  27.         return conn;
  28.     }
  29.     public static void CloseAll(Connection conn, Statement stmt, ResultSet rs) {
  30.         try {
  31.             if (rs != null) {
  32.                 rs.close();
  33.             }
  34.         } catch (SQLException e) {
  35.             e.printStackTrace();
  36.         }
  37.         try {
  38.             if (stmt != null) {
  39.                 stmt.close();
  40.             }
  41.         } catch (SQLException e) {
  42.             e.printStackTrace();
  43.         }
  44.         try {
  45.             if (conn != null) {
  46.                 conn.close();
  47.             }
  48.         } catch (SQLException e) {
  49.             e.printStackTrace();
  50.         }
  51.     }
  52. }
复制代码
数据库表字段类型计划如下

创建实体类,并实现get,set方法
  1. package cn.test_oracle.entity;
  2. import java.util.Date;
  3. //用户表
  4. public class Owners {
  5.     private Long userId; //用户id
  6.     private String userName;
  7.     private String userPwd;
  8.     private Long age;
  9.     private String gender;
  10.     private String email;
  11.     private Date regTime;
  12.     public Long getUserId() {
  13.         return userId;
  14.     }
  15.     public void setUserId(Long userId) {
  16.         this.userId = userId;
  17.     }
  18.     public String getUserName() {
  19.         return userName;
  20.     }
  21.     public void setUserName(String userName) {
  22.         this.userName = userName;
  23.     }
  24.     public String getUserPwd() {
  25.         return userPwd;
  26.     }
  27.     public void setUserPwd(String userPwd) {
  28.         this.userPwd = userPwd;
  29.     }
  30.     public Long getAge() {
  31.         return age;
  32.     }
  33.     public void setAge(Long age) {
  34.         this.age = age;
  35.     }
  36.     public String getGender() {
  37.         return gender;
  38.     }
  39.     public void setGender(String gender) {
  40.         this.gender = gender;
  41.     }
  42.     public String getEmail() {
  43.         return email;
  44.     }
  45.     public void setEmail(String email) {
  46.         this.email = email;
  47.     }
  48.     public Date getRegTime() {
  49.         return regTime;
  50.     }
  51.     public void setRegTime(Date regTime) {
  52.         this.regTime = regTime;
  53.     }
  54. }
复制代码
在OwnersDao实现对数据库的增删改查操作
增加用户代码如下
  1.     //增加用户
  2.     public static void Add(Owners owners) {
  3.         Connection conn = null;
  4.         //创建执行对象
  5.         PreparedStatement stmt = null;
  6.         try {
  7.             conn = BaseDao.getConnection();
  8.             //SQL语句
  9.             stmt = conn.prepareStatement("insert into PJ.tb_user values (?,?,?,?,?,?,?)");
  10.             //设置占位符
  11.             stmt.setLong(1, owners.getUserId());
  12.             stmt.setString(2, owners.getUserName());
  13.             stmt.setString(3, owners.getUserPwd());
  14.             stmt.setLong(4, owners.getAge());
  15.             stmt.setString(5, owners.getGender());
  16.             stmt.setString(6, owners.getEmail());
  17.             //这里需求的是sql.date,但java提供的是util.date,可以通过java的getTime方法将util.date变成long型,再转换成Date型
  18.             stmt.setDate(7, new Date(owners.getRegTime().getTime()));
  19.             stmt.execute();
  20.         } catch (SQLException e) {
  21.             throw new RuntimeException(e);
  22.         } finally {
  23.             BaseDao.CloseAll(conn, stmt, null);
  24.         }
  25.     }
复制代码
修改用户代码如下
  1.     //修改用户
  2.     public static void Update(Owners owners) {
  3.         Connection conn = null;
  4.         //创建执行对象
  5.         PreparedStatement stmt = null;
  6.         try {
  7.             conn = BaseDao.getConnection();
  8.             //SQL语句
  9.             stmt = conn.prepareStatement("update PJ.tb_user set username=?, userpwd=?, " +
  10.                     "age = ?, gender = ?, email = ?, regtime = ? where  userid = ?");
  11.             //设置占位符
  12.             stmt.setString(1, owners.getUserName());
  13.             stmt.setString(2, owners.getUserPwd());
  14.             stmt.setLong(3, owners.getAge());
  15.             stmt.setString(4, owners.getGender());
  16.             stmt.setString(5, owners.getEmail());
  17.             //这里需求的是sql.date,但java提供的是util.date,可以通过java的getTime方法将util.date变成long型,再转换成Date型
  18.             stmt.setDate(6, new Date(owners.getRegTime().getTime()));
  19.             stmt.setLong(7, owners.getUserId());
  20.             stmt.execute();
  21.         } catch (SQLException e) {
  22.             throw new RuntimeException(e);
  23.         } finally {
  24.             BaseDao.CloseAll(conn, stmt, null);
  25.         }
  26.     }
复制代码
删除用户代码如下
  1.     //删除用户
  2.     public static void Delete(Long id) {
  3.         Connection conn = null;
  4.         //创建执行对象
  5.         PreparedStatement stmt = null;
  6.         try {
  7.             conn = BaseDao.getConnection();
  8.             //SQL语句
  9.             stmt = conn.prepareStatement("delete from PJ.tb_user where userid = ?");
  10.             //设置占位符
  11.             stmt.setLong(1, id);
  12.             stmt.execute();
  13.         } catch (SQLException e) {
  14.             throw new RuntimeException(e);
  15.         } finally {
  16.             BaseDao.CloseAll(conn, stmt, null);
  17.         }
  18.     }
复制代码
查询代码如下
  1.     //查询用户
  2.     public static ArrayList<Owners> Query(Long id) {
  3.         ArrayList<Owners> list = new ArrayList<>();
  4.         Connection conn = null;
  5.         //创建执行对象
  6.         PreparedStatement stmt = null;
  7.         ResultSet rs = null;
  8.         try {
  9.             conn = BaseDao.getConnection();
  10.             //SQL语句
  11.             stmt = conn.prepareStatement("select * FROM PJ.tb_user where  userid = ?");
  12.             //设置占位符
  13.             stmt.setLong(1, id);
  14.             //处理执行结果
  15.             rs = stmt.executeQuery();
  16.             while (rs.next()){
  17.                 Owners s = new Owners();
  18.                 s.setUserId(rs.getLong("userid"));
  19.                 s.setUserName(rs.getString("username"));
  20.                 s.setUserPwd(rs.getString("userpwd"));
  21.                 s.setAge(rs.getLong("age"));
  22.                 s.setGender(rs.getString("gender"));
  23.                 s.setEmail(rs.getString("email"));
  24.                 s.setRegTime(rs.getDate("regtime"));
  25.                 list.add(s);
  26.             }
  27.             return list;
  28.         } catch (SQLException e) {
  29.             throw new RuntimeException(e);
  30.         } finally {
  31.             BaseDao.CloseAll(conn, stmt, rs);
  32.         }
  33.     }
复制代码
看上述代码可否实现对数据库的交互,测试代码如下:
  1. package cn.test_oracle.test;
  2. import cn.test_oracle.dao.OwnersDao;
  3. import cn.test_oracle.entity.Owners;
  4. import java.text.DateFormat;
  5. import java.text.ParseException;
  6. import java.text.SimpleDateFormat;
  7. import java.util.ArrayList;
  8. import java.util.Date;
  9. public class testdao {
  10.     public static void main(String[] args) throws ParseException {
  11.         Owners owners = new Owners();
  12.         owners.setUserId(2L);
  13.         owners.setUserName("clearlove7");
  14.         owners.setUserPwd("123456");
  15.         owners.setAge(39L);
  16.         owners.setGender("男");
  17.         owners.setEmail("pnj@3422.com");
  18.         //将String转换成Date两者处理方式,方式1
  19. /*        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
  20.         Date date = fmt.parse("2021-01-30");*/
  21.         //将String转换为Date,方式2
  22.         Date date = java.sql.Date.valueOf("2023-02-12");
  23.         owners.setRegTime(date);
  24.         OwnersDao.Add(owners);//增加用户
  25.         OwnersDao.Update(owners);//修改用户信息
  26.         OwnersDao.Delete(2L);//删除用户信息
  27.         ArrayList<Owners> a = OwnersDao.Query(1L);//查询用户信息
  28.         for (int i = 0; i < a.size(); i++) {
  29.             Owners owner1 = a.get(i);
  30.             System.out.println(owner1.getUserId());
  31.             System.out.println(owner1.getUserName());
  32.             System.out.println(owner1.getUserPwd());
  33.             System.out.println(owner1.getGender());
  34.             System.out.println(owner1.getAge());
  35.             System.out.println(owner1.getEmail());
  36.             System.out.println(owner1.getRegTime());
  37.         }
  38.     }
  39. }
复制代码
结果如下,用户2成功添加进数据库。

查询结果:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表