JavaWeb 之 JDBC

JDBC

1. 是什么

就是用java语言去操作数据库。

2. 使用说明

会使用的包 说明
java.sql 所有与 JDBC 访问数据库相关的接口和类
javax.sql 数据库扩展包,提供数据库额外的功能。如:连接池
数据库的驱动 由各大数据库厂商提供,需要额外去下载(驱动jar包),是对 JDBC 接口实现的类
  • 核心API

    接口或类 作用
    DriverManager 1) 管理和注册数据库驱动 2) 得到数据库连接对象
    Connection 接口 一个连接对象,可用于创建 Statement 和 PreparedStatement 对象
    Statement 接口 一个 SQL 语句对象,用于将 SQL 语句发送给数据库服务器。
    PreparedStatemen 接口 一个 SQL 语句对象,是 Statement 的子接口
    ResultSet 接口 用于封装数据库查询的结果集,返回给客户端 Java 程序
  • 访问过程

  1. 注册和加载驱动(可省略)

  2. 获取链接

  3. Connection 获取 Statement 对象

  4. 使用 Statement 对象执行 SQL 语句

  5. 返回结果集rs(始终记住,把关系型数据库想成一张表就可以了。)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WvX8Rd4W-1619002911406)(C:\Users\2020\AppData\Roaming\Typora\typora-user-images\image-20210421163713286.png)]

  6. 释放资源(先开的后关,后开的先关)

  • PreparedStatement 接口

    相比于Statement

    1. prepareStatement()会先将 SQL 语句发送给数据库预编译。PreparedStatement 会引用着预编译后的结果。可以多次传入不同的参数给 PreparedStatement 对象并执行。减少 SQL 编译次数,提高效率。
    2. 安全性更高,没有 SQL 注入的隐患。
    3. 提高了程序的可读性
  • JDBC 事务的处理

    Connection 接口中与事务有关的方法 说明
    void setAutoCommit(boolean autoCommit) 参数是 true 或 false如果设置为 false,表示关闭自动提交,相当于开启事务
    void commit() 提交事务
    void rollback() 回滚事务

3. 一个具体的例子

  • 项目结构:
  1. 将驱动jar包导入libs里面。
  2. 写一个JDBCUtils工具类,将一些重复性的操作打包。
  3. 编写登录案例代码。
  • 代码

    1. 工具类
      • 完成注册驱动
      • 提供获取连接对象的方法
      • 提供释放资源的方法
    package cn.itcast.util;
    
    import java.io.FileReader;
    import java.io.IOException;
    import java.net.URL;
    import java.sql.*;
    import java.util.Properties;
    
    /**
     * JDBC工具类
     */
    public class JDBCUtils {
          
          
        private static String url;
        private static String user;
        private static String password;
        private static String driver;
        /**
         * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
         */
        static{
          
          //静态代码块,在类加载的时候执行。
            //读取资源文件,获取值。
    
            try {
          
          
                //1. 创建Properties集合类。
                Properties pro = new Properties();
    
                //获取src路径下的文件的方式--->ClassLoader 类加载器
                ClassLoader classLoader = JDBCUtils.class.getClassLoader();
                URL res  = classLoader.getResource("jdbc.properties");
                String path = res.getPath();
               // System.out.println(path);///D:/IdeaProjects/itcast/out/production/day04_jdbc/jdbc.properties
                //2. 加载文件
               // pro.load(new FileReader("D:\\IdeaProjects\\itcast\\day04_jdbc\\src\\jdbc.properties"));
                pro.load(new FileReader(path));
    
                //3. 获取数据,赋值
                url = pro.getProperty("url");
                user = pro.getProperty("user");
                password = pro.getProperty("password");
                driver = pro.getProperty("driver");
                //4. 注册驱动
                Class.forName(driver);
            } catch (IOException e) {
          
          
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
          
          
                e.printStackTrace();
            }
        }
    
    
        /**
         * 获取连接
         * @return 连接对象
         */
        public static Connection getConnection() throws SQLException {
          
          
    
            return DriverManager.getConnection(url, user, password);//DriverManager类的静态方法
        }
    
        /**
         * 释放资源
         * @param stmt
         * @param conn
         */
        public static void close(Statement stmt,Connection conn){
          
          
            if( stmt != null){
          
          
                try {
          
          
                    stmt.close();
                } catch (SQLException e) {
          
          
                    e.printStackTrace();
                }
            }
    
            if( conn != null){
          
          
                try {
          
          
                    conn.close();
                } catch (SQLException e) {
          
          
                    e.printStackTrace();
                }
            }
        }
    
    
        /**
         * 释放资源
         * @param stmt
         * @param conn
         */
        public static void close(ResultSet rs,Statement stmt, Connection conn){
          
          
            if( rs != null){
          
          
                try {
          
          
                    rs.close();
                } catch (SQLException e) {
          
          
                    e.printStackTrace();
                }
            }
    
            if( stmt != null){
          
          
                try {
          
          
                    stmt.close();
                } catch (SQLException e) {
          
          
                    e.printStackTrace();
                }
            }
    
            if( conn != null){
          
          
                try {
          
          
                    conn.close();
                } catch (SQLException e) {
          
          
                    e.printStackTrace();
                }
            }
        }
    
    }
    
    
    1. 登录案例
    package cn.itcast.jdbc;
    
    import cn.itcast.util.JDBCUtils;
    
    import java.sql.*;
    import java.util.Scanner;
    
    /**
     * 练习:
     * 		* 需求:
     * 			1. 通过键盘录入用户名和密码
     * 			2. 判断用户是否登录成功
     */
    public class JDBCDemo9 {
          
          
    
        public static void main(String[] args) {
          
          
            //1.键盘录入,接受用户名和密码
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入用户名:");
            String username = sc.nextLine();
            System.out.println("请输入密码:");
            String password = sc.nextLine();
            //2.调用方法
            boolean flag = new JDBCDemo9().login(username, password);
            //3.判断结果,输出不同语句
            if(flag){
          
          
                //登录成功
                System.out.println("登录成功!");
            }else{
          
          
                System.out.println("用户名或密码错误!");
            }
    
    
        }
    
    
    
        /**
         * Statement执行登录方法
         */
        public boolean login(String username ,String password){
          
          
            if(username == null || password == null){
          
          
                return false;
            }
            //连接数据库判断是否登录成功
            Connection conn = null;
            Statement stmt =  null;
            ResultSet rs = null;
            //1.获取连接
            try {
          
          
                conn =  JDBCUtils.getConnection();
                //2.定义sql
                String sql = "select * from user where username = '"+username+"' and password = '"+password+"' ";
                System.out.println(sql);
                //3.获取执行sql的对象
                stmt = conn.createStatement();
                //4.执行查询
                rs = stmt.executeQuery(sql);
                //5.判断
               /* if(rs.next()){//如果有下一行,则返回true
                    return true;
                }else{
                    return false;
                }*/
               return rs.next();//如果有下一行,则返回true
    
            } catch (SQLException e) {
          
          
                e.printStackTrace();
            }finally {
          
          
                JDBCUtils.close(rs,stmt,conn);
            }
    
    
            return false;
        }
    
        /**
         * 登录方法,使用PreparedStatement实现
         */
        public boolean login2(String username ,String password){
          
          
            if(username == null || password == null){
          
          
                return false;
            }
            //连接数据库判断是否登录成功
            Connection conn = null;
            PreparedStatement pstmt =  null;
            ResultSet rs = null;
            //1.获取连接
            try {
          
          
                conn =  JDBCUtils.getConnection();
                //2.定义sql
                String sql = "select * from user where username = ? and password = ?";
                //3.获取执行sql的对象
                pstmt = conn.prepareStatement(sql);
                //给?赋值,将指定参数设置为给定 Java 类型 值
                pstmt.setString(1,username);
                pstmt.setString(2,password);
                //4.执行查询,不需要传递sql
                rs = pstmt.executeQuery();//执行查询语句
                //5.判断
               /* if(rs.next()){//如果有下一行,则返回true
                    return true;
                }else{
                    return false;
                }*/
                return rs.next();//如果有下一行,则返回true
    
            } catch (SQLException e) {
          
          
                e.printStackTrace();
            }finally {
          
          
                JDBCUtils.close(rs,pstmt,conn);
            }
    
    
            return false;
        }
    
    
    }
    
    

    总结:

    1. JDBC提供的是一系列操作数据库的接口,具体的实现类由各个数据库生产厂家去实现。
    2. 我们要在意的是代码逻辑的编写,而不是对各个执行对象的细节。所以了解这个过程就行了,没有必要将所有东西搞清楚。
    3. 总之,我们可以用代码实现对存放在数据库中的数据的管理,认识到以后干的最多的就是将数据取出来展示,或收集数据入库,这才是重点。

猜你喜欢

转载自blog.csdn.net/qq_37795916/article/details/115971941