Java JDBC入门

目录

1.JDBC 概述​

1.1 JDBC原理

2. JDBC 入门

2.1 导入MySQL JDBC 驱动,并注册

2.2 获取连接对象Connection

2.3 通过Connection对象获取Statement对象

2.4 使用Statement执行SQL语句

2.5 遍历返回的结果集

2.6 关闭资源

2.7 完整代码

 3. JDBC 类介绍

3.1 Driver接口

 ​​​​​3.2 DriverManger类

3.3 Connection接口

​​​​​​​3.4 Statement 接口

4.JDBC增删改查操作

4.1 查询

4.1.1查询全部

​​​​​​​4.1.2 根据ID查询

​​​​​​​4.2 添加数据​​​​​​​​​​​​​​

4.3 修改数据

​​​​​​​4.4 删除数据

4.5 封装数据

4.6 SQL 安全问题   SQL注入

4.7 JDBC工具类

5.JDBC批量处理​​​​​​​

1.JDBC 概述

        JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。之前操作数据库是在控制台使用SQL语句来操作数据库的,JDBC是用Java语言向数据库发送SQL语句,来达到操作数据库的效果。

1.1 JDBC原理

        JDBC由SUN提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范,提供一套访问自己公司的数据库服务器的API。SUN提供的规范命名为JDBC,而各个厂商提供的,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动

DBC 实现细节:JDBC主要分为三部分

  1. JDBC驱动管理器:负责注册特定的JDBC驱动器,主要通过java.sql. DriverManager实现。
  2. JDBC驱动器API:由Sun公司负责制定,其中最主要的接口是java.sql. Driver
  3. JDBC驱动器:是一种数据库驱动,由数据库厂商创建和维护,也称为JDBC驱动, 是实现了JDBC驱动器API,负责与特定的数据库连接,以及处理通信细节。

2. JDBC 入门

JDBC开发步骤

  1. 注册驱动
  2. 获取连接对象Connection
  3. 通过Connection对象获取Statement对象
  4. 使用Statement执行SQL语句
  5. 遍历返回的结果集
  6. 关闭资源

准备数据

 

2.1 导入MySQL JDBC 驱动,并注册

MySQL JDBC驱动下载链接

  1. 在项目根目录创建lib目录,用于存放当前项目所需的jar包,并将驱动jar复制到该目录下
  2. 选择jar包,右键执行build path - Add to Build Path(添加到编译目录)

加载并注册数据库驱动

DriverManager.registerDriver(new Driver());

2.2 获取连接对象Connection

String url = "jdbc:mysql://localhost:3306/mydb1";

Connection conn = DriverManager.getConnection(url, "root", "123456");

2.3 通过Connection对象获取Statement对象

Statement st = conn.createStatement();

2.4 使用Statement执行SQL语句

String sql = "SELECT * FROM user";

ResultSet rs = st.executeQuery(sql);

2.5 遍历返回结果集

//获取一个值

boolean flag = rs.next();//向下移动,true 代表有下一个记录

System.out.println(flag);

//循环获取所有的数据

while(rs.next()){

        int id = rs.getInt("id");

        String username = rs.getString("username");

        String password = rs.getString("password");

        System.out.println("id" + id + "  " + username +" " + password);

}

2.6 关闭资源

//释放资源 后打开的先关闭

rs.close();

st.close();

conn.close();

2.7 完整代码


import com.mysql.jdbc.Driver;
import java.sql.*;

/**
 * 1. 注册驱动
 *      驱动从哪里来? 框架开发者会将代码封装成jar包
 *      项目根目录新建lib文件夹,拷贝驱动到此目录下
 *      将驱动进行编译,将驱动文件右键 -- ADD as Library
 *      使用java代码加载驱动器
 * 2.获取数据库连接对象
 * 3.通通过Connection对象获取Statement对象
 * 4.使用Statement执行SQL语句
 * 5.遍历返回的结果集
 * 6.关闭资源
 *
 */
public class Demo01 {
    public static void main(String[] args) throws SQLException {
        // 1. 注册驱动
        DriverManager.registerDriver(new Driver());
        // 2.获取数据库连接对象
        String url = "jdbc:mysql://localhost:3306/test2";
        Connection connection = DriverManager.getConnection(url,"root","root");
        // 3.通通过Connection对象获取Statement对象
        Statement st = connection.createStatement();
        // 4.使用Statement执行SQL语句
        String sql = "SELECT * FROM user";
        ResultSet rs = st.executeQuery(sql);
        // 5.遍历返回的结果集
        while (rs.next()) {
            int id = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            System.out.println("id" + id + "  " + username + " " + password);

        }
        // 6.关闭资源
        rs.close();
        st.close();
        connection.close();
    }
}

运行结果:

 3. JDBC 类介绍

3.1 ​​​​​​​Driver接口

该接口是所有JDBC程序必须实现的接口,该接口专门提供给数据库产商使用。

com.mysql.jdbc.Driver 实现了java.sql.Driver接口
java.sql.Driver接口是所有JDBC程序必须实现的接口,该接口专门提供给数据库产商使用。

 ​​​​​3.2 DriverManger类

该类用于加载JDBC驱动并创建数据库的连接

static ConnectiongetConnection(String url, String user, String password)
          试图建立到给定数据库 URL 的连接。

语法:

1. url:

jdbc:mysql://ip地址:端口号/数据库名称
        细节:如果连接的是本机数据库,数据库的默认端口号为3306

        jdbc.mysql:/localhost:3306/test1可写为:jdbc:mysql:///test1

2.user:数据库用户名
3.password :数据库密码

​​​​​​​3.3 Connection接口

Connection接口代表Java程序和数据库的连接

普通方法
        createStatement():获取Statement(执行sql语句)

        prepareStatement():获取PrepareStatement对象

voidclose()
          立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。
 StatementcreateStatement()
          创建一个 Statement 对象来将 SQL 语句发送到数据库。
 PreparedStatementprepareStatement(String sql)
          创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。

管理事务的方法
        开启事务
                setAutoCommit()

 voidsetAutoCommit(boolean autoCommit)
          将此连接的自动提交模式设置为给定状态。

        提交事务
                commit()

 voidcommit()
          使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁。

        回滚事务
                rollback()

 voidrollback()
          取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。

​​​​​​​3.4 Statement 接口

用于向数据库发送SQL语句

1.bealoon execute(): 用于向数据库发送任意sql
2.int executeUpdate(): 利用返回值判断非0来确定sql语句是否执行成功。

                                [执行DML(insert update delete) DDL(create alter drop)]

3.ResultSet  executeQuery(): 可以通过execute方法来执行任何sql语句.

4.JDBC增删改查操作

4.1 查询

查询数据

Resultset类:封装了结果集的对象
用到方法:
        ResutSet executeQuery (string sql)
        Resultset的方法
                next():将游标下移,判断是否还有数据
                getXXX(int columnIndex)获取指定列的类型数据
                        columnIndex:代表列的编号(从1开始)
                        XXX:为数据类型
                getXXX(String name):获取指定列的类型数据

                        name: 为列名(如id)

使用步骤:

     在执行SQL语句操作中
        1.获取ResultSet对象

      在返回结果中
        2.调用rs.next(),判断是否有下一行,因为数据的个数不确定,所以使用while循环来操作调

        3.用getXX()获取数据

4.1.1查询全部

public static void main(String[] args) throws SQLException {
        selectAll();
    }

    /**
     * 查询所有数据
     *
     * @throws SQLException
     */
    public static void selectAll() throws SQLException {
        // 1.注册驱动
        DriverManager.registerDriver(new Driver());
        // 2.获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "root");
        // 3.通通过Connection对象获取Statement对象
        Statement st = conn.createStatement();
        // 4.执行SQL语句
        String sql = "select * from user";
        ResultSet rs = st.executeQuery(sql);
        // 5.返回的结果集
        System.out.println("id  username    password    email");
        while (rs.next()) {
            int id = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            String email = rs.getString("email");
            System.out.println(id + "    " + username + "    " + password + "    " + email);
        }
        //关闭资源
        rs.close();
        st.close();
        conn.close();
    }

​​​​​​​4.1.2 根据ID查询

运行结果:

​​​​​​​4.2 添加数据​​​​​​​​​​​​​​

public static void main(String[] args) throws SQLException {
        insert();
        selectAll();
    }

    public static void insert() throws SQLException {
        // 1.注册驱动
        DriverManager.registerDriver(new Driver());
        // 2.获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "root");
        // 3.获取Statement对象
        Statement st = conn.createStatement();
        // 4.执行sql语句
        String sql = "insert into user (id,username,password,email) values (NULL,'wangwu','123','123@qq.com')";
        int i = st.executeUpdate(sql);
        // 5.返回结果
        if(i >0){
            System.out.println("数据插入成功。");
        }else{
            System.out.println("数据插入失败。");
        }
        // 6.关闭资源
        st.close();
        conn.close();
    }

运行结果:

4.3 修改数据

public static void main(String[] args) throws SQLException {
        System.out.println("更新前的数据");
        selectAll();
        update();
        System.out.println("更新后的数据");
        selectAll();
    }

    /**
     * 修改数据(使用铺货异常)
     */
    public static void update(){
        Connection conn = null;
        Statement st = null;
        try {
            // 1.注册驱动
            DriverManager.registerDriver(new Driver());
            // 2.获取数据库连接对象
            conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "root");
            // 3.获取Statement对象
            st = conn.createStatement();
            // 4.执行sql语句
            String sql = "update user set password = '12345' where id = 3;";
            int i = st.executeUpdate(sql);
            // 5.返回结果
            if(i >0){
                System.out.println("数据更新成功。");
            }else{
                System.out.println("数据更新失败。");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            // 6.关闭资源(无论如何都要关闭资源)
            if(st != null){
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 插入数据
     * @throws SQLException
     */
    public static void insert() throws SQLException {
        // 1.注册驱动
        DriverManager.registerDriver(new Driver());
        // 2.获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "2633683194a");
        // 3.获取Statement对象
        Statement st = conn.createStatement();
        // 4.执行sql语句
        String sql = "insert into user (id,username,password,email) values (NULL,'wangwu','123','123@qq.com')";
        int i = st.executeUpdate(sql);
        // 5.返回结果
        if(i >0){
            System.out.println("数据插入成功。");
        }else{
            System.out.println("数据插入失败。");
        }
        // 6.关闭资源
        st.close();
        conn.close();
    }

    /**
     * 查询所有数据
     *
     * @throws SQLException
     */
    public static void selectAll() throws SQLException {
        // 1.注册驱动
        DriverManager.registerDriver(new Driver());
        // 2.获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "2633683194a");
        // 3.通通过Connection对象获取Statement对象
        Statement st = conn.createStatement();
        // 4.执行SQL语句
        String sql = "select * from user";
        ResultSet rs = st.executeQuery(sql);
        // 5.返回的结果集
        System.out.println("id  username    password    email");
        while (rs.next()) {
            int id = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            String email = rs.getString("email");
            System.out.println(id + "    " + username + "    " + password + "    " + email);
        }
        //关闭资源
        rs.close();
        st.close();
        conn.close();
    }

运行结果:

​​​​​​​4.4 删除数据

public static void main(String[] args) throws SQLException {
        System.out.println("删除前的数据");
        selectAll();
        delete();
        System.out.println("删除后的数据");
        selectAll();
    }

    /**
     * 删除数据
     */
    public static void delete() {
        Connection conn = null;
        Statement st = null;
        try {
            // 1.注册驱动
            DriverManager.registerDriver(new Driver());
            // 2.连接数据库对象
            conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "root");
            // 3.获取Statement对象
            st = conn.createStatement();
            // 4.执行功能sql语句
            String sql = "delete from user where id = 1";
            int i = st.executeUpdate(sql);
            // 5.返回结果
            if (i > 0) {
                System.out.println("数据删除成功。");
            } else {
                System.out.println("数据删除失败。");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6.关闭资源(无论如何都要关闭资源)
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 修改数据(使用铺货异常)
     */
    public static void update() {
        Connection conn = null;
        Statement st = null;
        try {
            // 1.注册驱动
            DriverManager.registerDriver(new Driver());
            // 2.获取数据库连接对象
            conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "2633683194a");
            // 3.获取Statement对象
            st = conn.createStatement();
            // 4.执行sql语句
            String sql = "update user set password = '12345' where id = 3;";
            int i = st.executeUpdate(sql);
            // 5.返回结果
            if (i > 0) {
                System.out.println("数据更新成功。");
            } else {
                System.out.println("数据更新失败。");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6.关闭资源(无论如何都要关闭资源)
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    /**
     * 插入数据
     *
     * @throws SQLException
     */
    public static void insert() throws SQLException {
        // 1.注册驱动
        DriverManager.registerDriver(new Driver());
        // 2.获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "2633683194a");
        // 3.获取Statement对象
        Statement st = conn.createStatement();
        // 4.执行sql语句
        String sql = "insert into user (id,username,password,email) values (NULL,'wangwu','123','123@qq.com')";
        int i = st.executeUpdate(sql);
        // 5.返回结果
        if (i > 0) {
            System.out.println("数据插入成功。");
        } else {
            System.out.println("数据插入失败。");
        }
        // 6.关闭资源
        st.close();
        conn.close();
    }

    /**
     * 查询所有数据
     *
     * @throws SQLException
     */
    public static void selectAll() throws SQLException {
        // 1.注册驱动
        DriverManager.registerDriver(new Driver());
        // 2.获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "2633683194a");
        // 3.通通过Connection对象获取Statement对象
        Statement st = conn.createStatement();
        // 4.执行SQL语句
        String sql = "select * from user";
        ResultSet rs = st.executeQuery(sql);
        // 5.返回的结果集
        System.out.println("id  username    password    email");
        while (rs.next()) {
            int id = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            String email = rs.getString("email");
            System.out.println(id + "    " + username + "    " + password + "    " + email);
        }
        //关闭资源
        rs.close();
        st.close();
        conn.close();
    }

运行结果:

4.5 封装数据

        将获取到的数据封装到对象中((User),然后将所有的User对象存入List集合
新建一个方法,将查询到的数据装到对象中(User),并将所有的User对象存入List集合,并返回
1.新建User类
        User类里面的属性有什么?
        类的属性和表的列相同
        表中的列数据类型怎么和Java的数据类型对应?
                类型对应表
                如:varchar 对应String
2.定义方法:
        public (static) List<User> findAllUser()

public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;

    public User() {
    }

    public User(Integer id, String username, String password, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
    }

    @Override
    public String toString() {
        return "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' + "\r\n";
    }
}
public static void main(String[] args) throws SQLException {
        System.out.println(findAllUser());
    }

    /**
     * 封装数据
     * @return
     */
    public static List<User> findAllUser() {
        List<User> users = new ArrayList<>();
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            DriverManager.registerDriver(new Driver());
            conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "root");
            st = conn.createStatement();
            String sql = "select * from user";
            rs = st.executeQuery(sql);
            while (rs.next()) {
                int id = rs.getInt("id");
                String username = rs.getString("username");
                String password = rs.getString("password");
                String email = rs.getString("email");
                User user = new User(id, username, password, email);
                users.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

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

运行结果:

4.6 SQL 安全问题   SQL注入

编写代码模拟登陆功能

        添加完成登陆功能的方法, 返回是否登陆成功

方法:

​    public boolean login(String username,String password){}

具体实现:

​    根据用户名和密码查询数据库

​    select * from user where username ='" + username + "'and password = '" + password+"'"

public static void main(String[] args) throws SQLException {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.next();
        System.out.println("请输入密码:");
        String password = sc.next();
        if (login(username, password)){
            System.out.println("登入成功");
        }else{
            System.out.println("登入失败");
        }
    }

    private static boolean login(String username, String password) throws SQLException {

        DriverManager.registerDriver(new Driver());
        Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "2633683194a");
        String sql = "select * from user where username = ? and password = ? ";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1,username);
        ps.setString(2,password);
        ResultSet rs = ps.executeQuery();
        if (rs.next()) {
            rs.close();
            ps.close();
            conn.close();
            return true;
        } else {
            rs.close();
            ps.close();
            conn.close();
            return false;
        }
    }

运行结果:

SQL 安全问题   SQL注入

​    利用特殊的字符或关键字参与sql字符串的拼接   会造成安全问题

> 用户名密码都输入:    a' or 'a' = 'a
> 用户名密码都输入:      a' or 'a' = 'a' --

问题出现的原因:

​    sql拼接问题

       SELECT * FROM user WHERE username = 'a' or 'a' = 'a' AND password = 'a' or 'a' = 'a'

解决SQL 安全问题

预编译sql:
        获取PreparedStatement
            PreparedStatement ps = conn.prepareStatement(sql);

        定义sql
                参数使用?作为占位符
                    SELECT * FROM user WHERE username = ? AND password = ?
                设置参数,给?赋值
                    void setXXX(int parameterIndex, String x):

                        XXX为数据类型
                        参数1 : ?号的编号 从1开始
                        参数2 : ? 具体的值

代码演示:

public static void main(String[] args) throws SQLException {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.next();
        System.out.println("请输入密码:");
        String password = sc.next();
        if (login(username, password)) {
            System.out.println("登入成功");
        } else {
            System.out.println("登入失败");
        }
    }

    private static boolean login(String username, String password) throws SQLException {

        DriverManager.registerDriver(new Driver());
        Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "root");
        Statement st = conn.createStatement();
        String sql = "select * from user where username = ? and password = ? ";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1,username);
        ps.setString(2,password);
        ResultSet rs = ps.executeQuery();
        if (rs.next()) {
            rs.close();
            st.close();
            conn.close();
            return true;
        } else {
            rs.close();
            st.close();
            conn.close();
            return false;
        }
    }

运行结果:

 4.7 JDBC工具类

        基于上面的增删改查示例,每次进行操作都需要【获取连接】【释放资源】,这两部分代码重复了,那么可以考虑对其进行优化,将【获取连接】和【释放资源】的代码抽取到单独的类中

        编写JDBC工具类方式一:

import com.mysql.jdbc.Driver;

import java.sql.*;

public class JDBCUtil {

    /**
     * 获取连接方法
     *
     * @return Connection
     */
    public static Connection getConnection() {
        Connection conn = null;
        try {
            DriverManager.registerDriver(new Driver());
            conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "root");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 关闭资源
     *
     * @param conn
     * @param st
     * @param rs
     */
    public static void close(Connection conn, Statement st, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

将JDBCUtil 工具类应用到登入案例中

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.next();
        System.out.println("请输入密码:");
        String password = sc.next();
        if (login(username, password)) {
            System.out.println("登入成功");
        } else {
            System.out.println("登入失败");
        }
    }

    private static boolean login(String username, String password) {
        Connection conn = JDBCUtil.getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            String sql = "select * from user where username = ? and password = ? ";
            ps = conn.prepareStatement(sql);
            ps.setString(1,username);
            ps.setString(2,password);
            rs = ps.executeQuery();
            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.close(conn,ps,rs);
        }
        return false;
    }

编写JDBC工具类方式二:

        上部分代码写好后,基本的JDBC工具类已经完成了,但是有时候我们需要考虑程序灵活性问题,比如获取连接的代码,目前连接数据库的用户名和密码是以硬编码方式传入的,那么是否可以使用配置文件的方式呢?代码如下,将数据库的连接信息写入配置文件中,使用是直接读取配置文件即可。

        

Properties介绍

        Properties继承自Hashtable,说明其是以键与值的方式存在的,只是Properties的键与值都是必须是字符串类型的数据。Properties常被用于配置文件的写入与读取,配置文件中记录着程序的各项参数信息,使用程序的用户可以自定义某些参数,以达到软件的个性化。

配置文件:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

public class JDBCUtil2 {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    /**
     * 静态代码块加载配置文件信息
     */
    static {
        FileReader in = null;
        Properties pro = new Properties();
        try {
            in = new FileReader("jdbc.properties");
            pro.load(in);// 加载配置信息
            driver = pro.getProperty("driverClassName");
            url = pro.getProperty("url");
            username = pro.getProperty("username");
            password = pro.getProperty("password");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 获取连接方法
     * @return Connection
     */
    public static Connection getConnection() {
        Connection conn = null;
        try {
            //通过反射方式注册驱动
            //反射会直接执行Driver类中的静态代码块
            Class.forName(driver);
            conn = DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
    /**
     * 关闭资源
     *
     * @param conn
     * @param st
     * @param rs
     */
    public static void close(Connection conn, Statement st, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

将JDBCUtil2工具类应用到登入案例中

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.next();
        System.out.println("请输入密码:");
        String password = sc.next();
        if (login(username, password)) {
            System.out.println("登入成功");
        } else {
            System.out.println("登入失败");
        }
    }

    private static boolean login(String username, String password) {
        Connection conn = JDBCUtil2.getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            String sql = "select * from user where username = ? and password = ? ";
            ps = conn.prepareStatement(sql);
            ps.setString(1,username);
            ps.setString(2,password);
            rs = ps.executeQuery();
            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil2.close(conn,ps,rs);
        }
        return false;
    }

运行结果:

5.JDBC批量处理

        当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。

        实现批处理方式:如果有100条sql语句,调用addBatch(sql)方法时,就会把sql语句加到list集合里去

        Statement.addBatch(sql)

执行批处理SQL语句:

        executeBatch()方法:执行批处理命令

        clearBatch()方法:清除批处理命令

代码示例:

public static void main(String[] args) throws SQLException {
        System.out.println("批量处理前的数据");
        selectAll();
        System.out.println("批量处理后的数据");
        executeBatch();
        selectAll();
    }

    public static void executeBatch() throws SQLException {
        Connection con = JDBCUtil.getConnection();
        String sql = "INSERT INTO user VALUES(?,?,?,?)";
        PreparedStatement pstmt = con.prepareStatement(sql);
        for (int i = 4; i < 11; i++) {
            pstmt.setInt(1, i);
            pstmt.setString(2, "stu_" + i);
            pstmt.setString(3, "123" + i);
            pstmt.setString(4, i + "@qq.com");
            pstmt.addBatch();
        }
        pstmt.executeBatch();
    }

    public static void selectAll() throws SQLException {
        Connection con = JDBCUtil.getConnection();
        Statement st = con.createStatement();
        String sql = "select * from user;";
        ResultSet rs = st.executeQuery(sql);
        System.out.println("id    username    password");
        while (rs.next()) {
            int id = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            System.out.println(id + "    " + username + "    " + password);
        }

    }

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值