JDBC狂神说

JDBC(Java DataBase Connectivity)

1、JDBC入门

客户端操作 MySQL 数据库的方式:

  • 使用第三方客户端来访问 MySQL:SQLyog、Navicat、SQLWave、MyDB Studio、EMS SQL Manager for MySQL

img

  • 使用 MySQL 自带的命令行方式

  • 通过 Java 来访问 MySQL 数据库,今天要学习的内容

1.1、什么是JDBC

JDBC 规范定义接口,具体的实现由各大数据库厂商来实现。

JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个

数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即

可,数据库驱动由数据库厂商提供。

1.2、JDBC的优点
  1. 程序员如果要开发访问数据库的程序,只需要会调用 JDBC 接口中的方法即可,不用关注类是如何实现的。
  2. .使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库

img

1.3、JDBC开发用到的包
java.sql所有与 JDBC 访问数据库相关的接口和类
javax.sql数据库扩展包,提供数据库额外的功能。如:连接池
数据库的驱动由各大数据库厂商提供,需要额外去下载,是对 JDBC 接口实现的类
1.4、 JDBC 的核心 API
接口or类作用
DriverManager 1.管理和注册数据库驱动 2.得到数据库连接对象
Connection 接口连接对象,可用于创建 Statement 和 PreparedStatement 对象
Statement 接口SQL 语句对象,用于将 SQL 语句发送给数据库服务器
PreparedStatemen 接口SQL 语句对象,是 Statement 的子接口
ResultSet 接口代表查询结果对象,结果集
1.5、 导入驱动 Jar 包

img

img

2、第一个JDBC程序

2.1、JdbcFirstDemo代码
public class JdbcFirstDemo {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 1、连接数据库 注册 JDBC 驱动    
        Class.forName("com.mysql.jdbc.Driver"); // 固定写法,加载驱动

        // 2、打开链接 用户信息URL
        // useUnicode=true&characterEncoding=utf8&useSSL=true
        String url = "jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
        String userName = "root";
        String pwd = "123456";

        // 3、连接成功,获得connection 数据库对象
        Connection connection = DriverManager.getConnection(url, userName, pwd);

        // 4、获得SQL的对象 statement 
        Statement statement = connection.createStatement();

        // 5、执行sql对象 去 执行sql, 可能存在的结果,查看返回结果
        String sql = "SELECT * FROM users";

        ResultSet resultSet = statement.executeQuery(sql); // 执行sql,返回结果集

        while (resultSet.next()) {
            System.out.println("id:" + resultSet.getObject("id"));
            System.out.println("name:" + resultSet.getObject("NAME"));
            System.out.println("pwd:" + resultSet.getObject("PASSWORD"));
            System.out.println("email:" + resultSet.getObject("email"));
            System.out.println("birth:" + resultSet.getObject("birthday"));
            System.out.println("==================================");
        }
        // 6、释放连接
        resultSet.close();
        statement.close();
        connection.close();
    }
}
2.2、步骤总结:
  1. 加载驱动
  2. 链接数据库DriverManager
  3. 获得执行sql的对象 statement
  4. 获得返回的结果集
  5. 释放连接

3、JDBC中对象解释

3.1、DriverManager 驱动程序管理器
// DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
// Class.forName(数据库驱动实现类)
Class.forName("com.mysql.jdbc.Driver"); 

Connection connection = DriverManager.getConnection(url, userName, pwd);
// connection 代表数据库
// 数据库设置自动提交
// 事务提交
// 事务回滚
connection.setAutoCommit();
connection.commit();
connection.rollback();
3.2、URL
img
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useSSL=false&useUnicode=true&characterEncoding=utf8";
// 如果数据库出现乱码,可以指定参数: characterEncoding=utf8,表示让数据库以 UTF-8 编码来处理数据
// mysql--3306
// 协议:子协议://主机地址:端口号/数据库名?参数1&参数2...

// oracle--1521
// jdbc:oracle:thin:@localhost:1521:sid
3.3、Statement 执行SQL的对象
String sql = "SELECT * FROM users"; // 编写sql

statement.executeQuery();//查询操作 返回结果集ResultSet
statement.execute();//可以执行任何sql
statement.executeUpdate();//更新 插入 删除都是用这个,返回受影响的行数

connection.prepareStatement()  // 执行SQL的对象
3.4、ResultSet 查询返回的结果集
  • 获得指定的数据类型
//不知道类型就用Object
resultSet.getObject();
//知道类型可以直接使用对应类型获取
resultSet.getString();
resultSet.getInt();
resultSet.getFloat();
resultSet.getDouble();
  • 遍历 指针
resultSet.next();//移动到下一行数据
resultSet.beforeFirst();//移动到最前
resultSet.afterLast();//移动到最后
resultSet.previous();//移动到前一行
resultSet.absolute(i);//移动到第i行
3.5、释放资源
resultSet.close();
statement.close();
connection.close(); // 耗资源,用完关掉

4、Statement对象详解

4.1、提取工具类
package utils;

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

public class JdbcUtils {

    private static String driver = null;
    private static String url = null;
    private static String username = null;
    private static String password = null;

    static {
        try {
            InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
            Properties properties = new Properties();
            properties.load(in);

            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");

            // 1、驱动只用加载一次
            Class.forName(driver);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

    // 释放资源
    public static void release(Connection conn, Statement st, ResultSet rs) throws SQLException {
        if (rs != null) {
            rs.close();
        }
        if (st != null) {
            st.close();
        }
        if (conn != null) {
            conn.close();
        }
    }
}
4.2、编写增删改查的方法
package Test;

import utils.JdbcUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class TestInsert {
    public static void main(String[] args) throws Exception {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection(); // 获取数据库对象
            st = conn.createStatement(); // 获得SQL对象
            String sql = "INSERT INTO `users` " +
                    "VALUES ('4','xiaoming','23456','xiaoming@qq.com','2020-02-02')";
            int line = st.executeUpdate(sql);
            if (line > 0) {
                System.out.println("插入成功~");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn, st, rs);
        }
    }
}
package Test;

import utils.JdbcUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class TestDelete {
    public static void main(String[] args) throws Exception {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection(); // 获取数据库对象
            st = conn.createStatement(); // 获得SQL对象
            String sql = "DELETE FROM `users` WHERE id = 4";
            int line = st.executeUpdate(sql);
            if (line > 0) {
                System.out.println("删除成功~");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn, st, rs);
        }
    }
}
package Test;

import utils.JdbcUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class TestUpdate {
    public static void main(String[] args) throws Exception{
        Connection coon = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            coon = JdbcUtils.getConnection(); // 获取数据库对象
            st = coon.createStatement(); // 获取SQL对象

            String sql = "UPDATE `users` SET `email` = 'ming@gmail.com' WHERE id = 4";
            int line = st.executeUpdate(sql); // 返回受影响的行数
            if (line > 0) {
                System.out.println("修改成功!!!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(coon, st, rs);
        }
    }
}
package Test;

import utils.JdbcUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestSelect {
    public static void main(String[] args) throws Exception {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection(); // 获得数据库对象
            st = conn.createStatement(); // 由数据库对象得到SQL对象

            String sql = "SELECT * FROM `users` WHERE `id` = 4;";
            rs = st.executeQuery(sql);
            while (rs.next()) {
                System.out.println("id = " + rs.getInt("id"));
                System.out.println("name = " + rs.getString("NAME"));
                System.out.println("pwd = " + rs.getString("PASSWORD"));
                System.out.println("email = " + rs.getString("email"));
                System.out.println("birth = " + rs.getDate("birthday"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn, st, rs);
        }
    }
}

5、事务

  1. 关闭自动提交conn.setAutoCommit(false)
  2. 业务完毕,开启提交conn.commit()
  3. 未提交,事务回滚comm.rollback()
package Test;

import utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TestTransaction1 {
    public static void main(String[] args) throws Exception{
        Connection conn = null;
        PreparedStatement st = null;
        try {
            conn = JdbcUtils.getConnection();
            // 关闭 数据库 自动提交机制  即 开启事务
            conn.setAutoCommit(false);

            String sql1 = "update account set money = money - 500 where name = ?";
            st = conn.prepareStatement(sql1);
            st.setString(1,"A");
            st.executeUpdate();
			// int x = 1 / 0; 报错回滚
            String sql2 = "update account set money = money + 500 where name = ?";
            st = conn.prepareStatement(sql2);
            st.setString(1, "B");
            st.executeUpdate();

            // 业务完毕,手动提交事务
            conn.commit();
        } catch (Exception e) {
            // 如果失败,回滚
            conn.rollback();
            e.printStackTrace();
        } finally {
            System.out.println("转账成功!!");
            JdbcUtils.release(conn, st, null);
        }
    }
}

参考博客:学JDBC,这一篇就够了
参考视频:【狂神说】JavaMySQL最新教程通俗易懂

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值