JDBC狂神说

news/2024/5/19 1:46:27 标签: 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最新教程通俗易懂


http://www.niftyadmin.cn/n/936668.html

相关文章

Struts2 Convention插件的使用

转自:http://chenjumin.iteye.com/blog/668389 1、常量说明 1 struts.convention.result.path"/WEB-INF/content/": 结果页面存放的根路径,必须以 "/" 开头。2 struts.convention.action.suffix"Action…

33 关于一些时间响应函数

http://blog.csdn.net/android_tutor/article/details/5568806转载于:https://www.cnblogs.com/cliffhuang/p/3727471.html

RedHat Enterprise Linux6.4 使用CentOS yum源

转载自 http://blog.csdn.net/zhngjan/article/details/20843465 略做修改。在使用redhat linux的yum来安装或者更新软件的时候会提示[plain] view plaincopyprint?[adminserver1 ~]$ sudo yum install gcc Loaded plugins: product-id, refresh-packagekit, security, subsc…

INI文件读写

我们在编写程序的过程中,有很多要用到出始化,但有很多都写进了注册表,而我们在想修改或者查看的时候必须到注册表里去修改,而不是直接到一个程序目录下的ini文件里查看或者修改,怎么使可以直接生成的ini文件能写进Debug 呢?而不写进注册表. 1 //初始化ini文件参数 2 typedef s…

评估前冲刺第一天

5月19号20点30,我们在寝室进行了站立会议,会议内容是讨论接下来一星期的任务与目标实现。 会议参与者:本小组所有成员 会议内容 1、在接下来的一星期内我们将逐步完成各自的任务,因为上次的失败,这次我们吸取教训&…

8.1.1 Service的生命周期

2010-06-21 16:57 李宁 中国水利水电出版社 字号:T | T《Android/OPhone开发完全讲义》第8章Android服务,本章主要介绍了Android系统 中的服务(Service)技术。Service是Android中4个应用程序组件之一。在Android系统内部提供了很多…

Word2003文档打不开怎么办?

在平常的工作当作,我们难免会遇上Word打不开的时候,那么我们应该如何解决这个问题呢?下面Word联盟就来给大家介绍两中最简单,而且非常使用的方法,快速的让大家恢复到以前正常的工作状态中。  Word打不开症状&#xf…

java中使用队列:java.util.Queue (转

2019独角兽企业重金招聘Python工程师标准>>> Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能…