JDBC快速入门+详解JDBC各个对象+SQL注入问题+JDBC工具类

JDBC概念

Java DataBase Connectivity,Java 数据库连接, Java语言操作数据库;
JDBC是Sun公司定义的一套操作所有关系型数据库的规范;各个数据库厂商去实现这套接口,提供数据库驱动jar包;程序员可以使用这套接口编程,真正执行的代码是驱动jar包中的实现类。

JDBC快速入门

  1. 导入驱动jar包
    mysql-connector-java-5.1.37-bin.jar
  2. 注册和加载驱动
  3. 获取数据库连接对象
  4. 定义SQL语句
  5. 获取执行SQL的对象
  6. 执行SQL语句
  7. 返回结果集
  8. 释放资源
    ResultSet-->Statement-->Connection
package com.jdbc.demo;

import com.utils.JDBCUtils;

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

public class JDBCDemo {
    public static void main(String[] args) throws SQLException {
        Connection conn = null;
        Statement stmt = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");            
            conn = DriverManager.getConnection("jdbc:mysql:///school", "root", "123456");
            String sql = "insert into student values ('08005','孙七','男','18')";
            stmt = conn.createStatement();
            int count = stmt.executeUpdate(sql);
            if (count > 0) {
                System.out.println("添加成功!");
            } else {
                System.out.println("添加失败!");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

详解JDBC各个对象

DriverManager 驱动管理对象
  • 注册驱动
    告诉程序该使用哪一个数据库驱动jar包
    static void registerDriver(Driver driver)
    源码中在com.mysql.jdbc .Driver类中存在静态代码块;
    写代码直接使用: Class.forName("com.mysql.jdbc.Driver");
    注意:mysql 5 之后的驱动 jar包可以省略注册驱动的步骤;
  • 获取数据库连接
    static Connection getConnection(String url, String user, String password)
    user:用户名,password:密码,url:指定连接的路径
    协议名:子协议://服务器名或ip地址:端口号/数据库名[?参数=参数值]
    注意:简写 jdbc:mysql:///数据库名 必须是本地服务器,端口号是3306;
    如果数据库出现乱码,可以指定参数:?characterEncoding=utf8
Connection 数据库连接对象
  • 获取执行SQL的对象
    Statement createStatement()
    PreparedStatement prepareStatement(String sql)
  • 管理事务
    开启事务:setAutoCommit(boolean autoCommit)
    提交事务:commit()
    回滚事务:rollback()
Statement 执行SQL的对象
  • 用于执行不带输入参数的简单的SQL语句;
  • 用于执行静态SQL语句并返回它所生成结果的对象;
    boolean execute(String sql):可以执行任意的SQL语句;
    int executeUpdate(String sql):用于执行DDL和DML语句,返回对数据库影响的行数;
    ResultSet executeQuery(String sql):用于执行DQL语句,返回值查询的结果集;
ResultSet 结果集对象
  • 封装数据库查询的结果集,对结果集进行遍历,取出每一条记录;
    ① 游标向下移动一行 boolean next(),判断当前指向的记录是否还有下一条记录
    ② 取出每一条记录 getXxx(参数),Xxx:代表数据类型,String getString()
    通过列号取记录,参数为int类型,从1开始,getInt(1)
    通过字段名取记录,参数为String类型,getString(“id”)
PreparedStatement 执行SQL的对象
  • 用于执行带或不带输入参数的预编译SQL语句;
  • 用于执行预编译的SQL语句,防止SQL注入问题;
    定义预编译的SQL语句,SQL的参数使用?作为占位符
    select * from user where username = ? and password = ?;
    获取执行预编译的SQL语句的对象
    PreparedStatement prepareStatement(String sql)
    设置实际参数给?赋值 setXxx(参数1,参数2)
    参数1为?的位置编号从1开始,参数2为?的值
    执行参数化的SQL语句,接收返回结果,不需要再传递SQL语句

SQL注入问题

在这里插入图片描述

package com.jdbc.demo;

import com.utils.JDBCUtils;

import java.sql.*;
import java.util.Scanner;

public class JDBCDemo {
    public static void main(String[] args) {
        // 键盘录入用户名和密码
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.nextLine();
        System.out.println("请输入密码:");
        String password = sc.nextLine();
        
        // 调用登录方法
        boolean flag = new JDBCDemo().login(username, password);
        
        // 判断用户是否登录成功
        if(flag){
            System.out.println("登录成功!");
        }else{
            System.out.println("用户名或密码错误!");
        }
    }
    
    // 登录方法,使用PreparedStatement实现
    public boolean login(String username ,String password){
        if(username == null || password == null){
            return false;
        }
        
        Connection conn = null;
        PreparedStatement pstmt =  null;
        ResultSet rs = null;
        
        try {
            // 获取数据库连接对象
            conn =  JDBCUtils.getConnection();
            // 定义预编译的SQL语句
            String sql = "select * from user where username = ? and password = ?";
            // 获取执行预编译的SQL语句的对象
            pstmt = conn.prepareStatement(sql);
            // 设置实际参数给`?`赋值 
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            // 执行参数化的SQL语句,接收返回结果,不需要再传递SQL语句
            rs = pstmt.executeQuery();
            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            // 释放资源,子接口直接给父接口
            JDBCUtils.close(rs, pstmt, conn);
        }
        return false;
    }
}

JDBC工具类

导入jar包
mysql-connector-java-5.1.37-bin.jar
定义配置文件
jdbc.properties

url=jdbc:mysql:///school
user=root
password=123456
driver=com.mysql.jdbc.Driver

JDBC工具类
JDBCUtils.java

package com.utils;

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 {
            // 加载配置文件
            Properties pro = new Properties();
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL res = classLoader.getResource("jdbc.properties");
            String path = res.getPath();
            pro.load(new FileReader(path));
            // 获取数据赋值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
            // 注册驱动
            Class.forName(driver);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    // 获取连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }
    
    // 释放资源
    public static void close(Statement stmt, Connection conn) {
        close(null,stmt,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();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值