Java学习之JDBC基本使用

Java学习-13-韩顺平老师

Java-JDBC快速入门01

目录:

01-JDBC概述
02-ResultSet
03-Statement && PreparedStatement
04-封装JDBCUtils
05-事务
06-批处理

JDBC概述

基本介绍:

1.JDBC为访问不同数据库的提供了统一的接口,为使用者屏蔽了细节问题。
2.Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。
3.JDBC是Java提供一套用于数据库操作的API,Java程序员只需要面向这套接口即可,不同的数据厂商,需针对这套接口,提供不同的实现。

JDBC API:

JDBC API是一系列的接口,它同意和规范了应用程序与数据库连接、执行SQL语句,并返回结果等各类操作,相关类和接口都在java.sql和javax.sql。

JDBC的编写步骤: 注:先将驱动包放在了libs目录下,并且导入到了项目中。

1.注册驱动:加载Driver类
2.获取连接:得到Connection
3.执行增删改查:发送sql给mysql执行
4.释放资源:关闭连接

获取数据库连接的4种方式: 其中推荐使用第四种

public class JdbcConn {
    public static void main(String[] args) throws Exception {
        connect0102();
        connect03();
        connect04();
    }
    // 演示第一种和第二种,就是获取driver方法不同
    public static void connect0102() throws Exception{
        // 1.获取驱动的第一种方法,静态方法
        Driver driver1 = new Driver();
        // 2.获取驱动第二种方法,动态加载
        Class<?> cls = Class.forName("com.mysql.jdbc.Driver");
        // 创建驱动
        Driver driver = (Driver)cls.newInstance();
        // 加载登录信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        // url="jdbc:mysql://localhost:3306/zcc_test"
        // 创建连接,获得一个Connection 对象
        Connection connect = driver.connect("jdbc:mysql://localhost:3306/zcc_test", properties);
        System.out.println("成功");
        // 释放资源
        connect.close();
    }
    public static void connect03() throws Exception{
        // 3. 使用DriverManage 替换 Driver 来获取连接
        Class<?> cls = Class.forName("com.mysql.jdbc.Driver");
        Driver driver =(Driver) cls.newInstance();
        String user = "root";
        String password = "196174";
        String url = "jdbc:mysql://localhost:3306/zcc_test";

        DriverManager.registerDriver(driver);
        Connection connection = DriverManager.getConnection(url, user, password);

        System.out.println("成功");
        connection.close();
    }
    public static void connect04() throws Exception{
        // 4. 如果使用 DriverManage 可以直接省略实例化这一过程
        String user = "root";
        String password = "196174";
        String url = "jdbc:mysql://localhost:3306/zcc_test";

        DriverManager.getConnection(url,user,password);
        Connection connection = DriverManager.getConnection(url, user, password);

        System.out.println("成功");
        connection.close();
    }
}

ResultSet(结果集)

基本介绍:

1.表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
2.ResultSet对象保持一个光标执行其当前的行。最初,光标于第一行之前。
3.next方法可以使光标下移,并且当ResultSet没有下一行的时候返回false,通常使用while循环来遍历输出。

public class ResultSet_ {
    public static void main(String[] args) throws Exception{
        // 加载 Driver
        Class.forName("com.mysql.jdbc.Driver");
        // 拿到登入数据库对应信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        System.out.println(url);
        // 创建连接
        Connection connection = DriverManager.getConnection(url, user, password);
        // 定义sql语句
        String sql = "select * from student";
        // 这里使用 preparedStatement 来执行sql语句,这里需要填入sql
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        // 循环取出 resultSet
        while (resultSet.next()){
            String name = resultSet.getString("name");
            String english = resultSet.getString("english");
            String math = resultSet.getString("math");
            String chinese = resultSet.getString("chinese");
            System.out.println(name + "\t" + english + "\t" + chinese + "\t" + math);
        }
        // 释放相关资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}

Statement && PreparedStatement

Statement:

1.Statement对象 用于执行静态SQL语句并返回其生成的结果的对象

2.在连接建立后,需要对数据库进行访问,执行 命名或是SQL 语句,可以通过
Statement
PreparedStatement
CallableStatement
3.Statement对象执行SQL 语句,存在SQL注入风险SQL Injection
4.SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输
入数据中注入非法的 SQL 语句段或命令,恶意攻击数据库。sql injection.sql
5.要防范 SQL 注入,只要用 PreparedStatement(从Statement扩展而来)取
代 Statement 就可以了
注:由于这个不太使用,就不演示代码了

PreparedStatement:

1.PreparedStatement 执行的 SQL 语句中的参数用问号(?)来表示,调用PreparedStatement对象的setxxx(0方法来设置这些参数.setxxx()方法有两个参数,第一个参数是要设置的SQL句中的参数的索引(从1开始),第二个是设置的 SQL 语句中的参数的值。
2.调用 executeQuery(),返回 Resultset 对象
3.调用 execute Update():执行更新,包括增、删、修改

public class ResultSet_ {
    public static void main(String[] args) throws Exception{
        // 加载 Driver
        Class.forName("com.mysql.jdbc.Driver");
        // 拿到登入数据库对应信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        System.out.println(url);
        // 创建连接
        Connection connection = DriverManager.getConnection(url, user, password);
        // 定义sql语句,使用?作为占位符
        String sql = "insert into student values(?,?,?,?,?)";
        // 这里使用 preparedStatement 来执行sql语句,这里需要填入sql
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,9);
        preparedStatement.setString(2,"tom");
        preparedStatement.setInt(3,88);
        preparedStatement.setInt(4,99);
        preparedStatement.setInt(5,90);
        preparedStatement.executeUpdate();
        System.out.println("更新成功");

        preparedStatement.close();
        connection.close();
    }
}

封装JDBCUtils

因为每次连接和关闭连接都是一些重复的操作,所以可以封装一个工具类来完成这些工作.

package com.zcc.Utils_;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Driver;

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

/**
 * @author 安逸i
 * @version 1.0
 */
public class JDBCUtils {
    public static String user;
    public static String password;
    public static String url;
    public static Driver driver;

    // 在静态代码块种初始化变量
    static {
        try {
            Properties properties = new Properties();
            properties.load(new FileInputStream("src\\mysql.properties"));
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            url = properties.getProperty("url");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnect(){
        Connection connection = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
             connection = (Connection) DriverManager.getConnection(url, user, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
    public static void close(ResultSet resultSet, Statement statement, Connection connection){
        try {
            if(resultSet != null){
                resultSet.close();
            }
            if(statement !=null){
                statement.close();
            }
            if(connection != null){
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

事务

基本介绍:

1.JDBC程序中当一个Connection对象创建时,默认情况下是自动提交事务:每
次执行一个SQL语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
2.JDBC程序中为了让多个 SQL 语句作为一个整体执行,需要使用事务。
3.调用 Connection 的 setAutoCommit(false)可以取消自动提交事务
4.在所有的 SQL 语包都成功执行后,调用 commitO:方法提交事务
5.在其中某个操作失败或出现异常时,调用 rollback0;方法回滚事务

public class Transaction_ {
    public static void main(String[] args)  {
        Connection connect =null;
        try {
            connect = JDBCUtils.getConnect();
            // 表示事务开始
            connect.setAutoCommit(false);
            // 马云给马化腾转账100
            String sql = "update table account set money-100 where `name` = ?";
            PreparedStatement preparedStatement = connect.prepareStatement(sql);
            preparedStatement.setString(1,"马云");

            // 但是中间有一个错误,如不适用事务,将会导致 马云钱少了100,但是马化腾没有收到100
            int num = 10/0;

            String sql1 = "update table account set money+100 where `name` = ?"
            preparedStatement = connect.prepareStatement(sql1);
            preparedStatement.setString(1,"马化腾");
            // 如果没有问题,就会在这里提交
            connect.commit();
        } catch (SQLException e) {
            try {
                // 出现错误回滚到开始事务的地方
                // 这样就可以让马云的钱不减少
                connect.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } finally {
        }
    }
}

批处理

基本介绍:

1.当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情況下比单独提交处理更有效率。
2.JDBC的批量处理语句包括下面方法:
addBatch():添加需要批量处理的SQL语句或参数;
executeBatch():执行批量处理语句;
clearBatch():清空批处理包的语句;
3.JDBC连接MySQL时,如果要使用批处理功能,请再url中加参数?rewriteBatchedStatements=true
4.批处理往往和PreparedStatement一起搭配使用,可以既减少编译次数,又减少运行次数,效率大大提高.

public class Batch_ {
    public static void main(String[] args) throws SQLException {
        Connection connect = JDBCUtils.getConnect();
        PreparedStatement preparedStatement = null;
        for (int i = 0; i < 5000; i++) {
            String sql = "insert into students values(?,?)";
            preparedStatement = connect.prepareStatement(sql);
            preparedStatement.setInt(1,i);
            preparedStatement.setString(2,"jack" + i);
            // 添加需要批量处理的sql语句
            preparedStatement.addBatch();
            // 当达到1000条操作时,就把sql语句一次性发给mysql来执行
            // 减少了网络传输的时间,大大的提高了效率
            if((i+1) %1000 == 0){
                // 发给mysql执行
                preparedStatement.executeBatch();
                // mysql 执行完之后,要把原来的清楚,再装下一批需要处理的sql
                preparedStatement.clearBatch();
            }
        }
        // 释放资源
        JDBCUtils.close(null,preparedStatement,connect);
    }
}

JDBC基本入门第一小结,欢迎大家交流学习!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值