jdbc直连数据库

本文详细介绍了如何使用Java的JDBC连接MySQL和Oracle数据库,包括加载驱动、获取连接、执行SQL以及关闭连接的步骤。同时,文章探讨了数据库事务的ACID原则,以原子性、一致性、隔离性和持久性为核心,并通过示例代码展示了如何在Java中处理事务,包括开启事务、执行SQL和处理异常回滚事务。
摘要由CSDN通过智能技术生成

1、jdbc连接数据库

1.1、步骤

  • 加载数据库驱动

    • mysql驱动:com.mysql.jdbc.Driver
    • oracle驱动:oracle.jdbc.driver.OracleDriver
    Class.forName("com.mysql.jdbc.Driver")
    
  • 获取连接

    • mysql:jdbc:mysql://mysql主机IP:端口号(一般是3306)/数据库名?userUnicode=true&characterEncoding=utf8&useSSL=false
    • oracle:jdbc:oracle:thin:@主机IP:端口号(一般是1521):数据库名
    DriverManager.getConnection(url, user, password)
    
  • 执行sql

    使用预编译PreparedStatement,防止sql注入问题

  • 获取结果集

  • 关闭连接

    不要忘了关闭连接

1.2、示例代码

package org.jdbc.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JdbcUtil {
    private static String driver = null;
    private static String url = null;
    private static String username = null;
    private static String password = null;

    static {
        try {
            InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
            Properties properties = new Properties();
            properties.load(in);
            driver = properties.getProperty("jdbc.driver");
            url = properties.getProperty("jdbc.url");
            username = properties.getProperty("jdbc.username");
            password = properties.getProperty("jdbc.password");

            // 加载驱动,只需要加载一次
            Class.forName(driver);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }

    /**
     * 释放连接
     * @param conn
     * @param stat
     * @param rs
     */
    public static void release(Connection conn, Statement stat, ResultSet rs){
        try {
            if(rs!=null) {
                rs.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            if(stat != null) {
                stat.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            if(conn != null) {
                conn.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

jdbc.properties文件

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/mine?userUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.username = root
jdbc.password = root

2、事务

2.1、概述

要么都成功,要么都失败

ACID原则

  1. 原子性

    事务是一个不可分割的工作单位,要么都成功,要么都失败

  2. 一致性

    总数不变

  3. 隔离性

    多个进程互不干扰,一个事务内部的操作及使用的数据对并发的其他事务是隔离的

  4. 持久性

    一个事务一旦被提交,它对数据库中数据的改变就是 永久性的,接下来的其他操作和数据库故障不应该对其有任何影响,

    持久化到了数据库了

隔离性的问题:

脏读:一个事务读取到了另一个没有提交的事务

不可重复读:在同一个事务内,重复读取表中的数据,表数据发生了改变

虚读:在同一个事务内,读取到了别人插入的数据,导致前后读取的结果不一致

2.2、示例代码:

@Test
    public void testTransaction(){
        Connection conn = null;
        PreparedStatement ptst = null;

        try {
            // 获取连接
            conn = JdbcUtil.getConnection();
            conn.setAutoCommit(false);  // 关闭自动提交,开启事务
            String sql1 = "update account set money = money - 100 where name='A'";
            // 预编译sql
            ptst = conn.prepareStatement(sql1);
            ptst.executeUpdate();

            // 测试事务
            int x = 1 / 0;

            String sql2 = "update account set money = money + 100 where name='B'";
            ptst = conn.prepareStatement(sql2);
            ptst.executeUpdate();

            // 业务完毕,提交事务
            conn.commit();
            System.out.println("成功");
        } catch (SQLException e) {
            // 出现异常,默认会自动调用rollback,回滚数据
            e.printStackTrace();
        } finally {
            JdbcUtil.release(conn, ptst, null);
        }
    }
1. 下载Oracle JDBC驱动程序 首先需要下载Oracle JDBC驱动程序,可以在Oracle官网下载,下载地址为:http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html 2. 安装Oracle JDBC驱动程序 下载后将JDBC驱动程序解压缩,将解压后的jar包复制到项目的lib目录下。 3. 加载JDBC驱动程序 在Java代码中,需要使用Class.forName()方法来加载JDBC驱动程序,如下所示: Class.forName("oracle.jdbc.driver.OracleDriver"); 4. 建立数据库连接 使用DriverManager.getConnection()方法建立数据库连接,需要传入数据库连接的URL、用户名和密码,如下所示: String url = "jdbc:oracle:thin:@localhost:1521:orcl"; //数据库连接URL String username = "username"; //数据库用户名 String password = "password"; //数据库密码 Connection conn = DriverManager.getConnection(url, username, password); 其中,url是JDBC连接字符串,包括数据库的IP地址、端口号和SID,如上面示例中的localhost、1521和orcl。 5. 执行SQL语句 使用Connection对象的createStatement()方法创建Statement对象,然后使用executeQuery()方法执行SQL查询语句,如下所示: Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM users"); 6. 处理结果集 使用ResultSet对象的方法来处理结果集,比如使用next()方法遍历结果集中的每一行数据,如下所示: while (rs.next()) { String name = rs.getString("name"); int age = rs.getInt("age"); //处理结果集中的数据 } 7. 关闭连接 在使用完数据库连接后,需要关闭连接,释放资源,如下所示: rs.close(); stmt.close(); conn.close(); 完整的代码示例: import java.sql.*; public class OracleJDBCExample { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { //加载JDBC驱动程序 Class.forName("oracle.jdbc.driver.OracleDriver"); //建立数据库连接 String url = "jdbc:oracle:thin:@localhost:1521:orcl"; //数据库连接URL String username = "username"; //数据库用户名 String password = "password"; //数据库密码 conn = DriverManager.getConnection(url, username, password); //执行SQL查询语句 stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT * FROM users"); //处理结果集 while (rs.next()) { String name = rs.getString("name"); int age = rs.getInt("age"); System.out.println(name + ", " + age); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { //关闭连接,释放资源 try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值