JDBC

本文详细介绍了Java JDBC的基本使用,包括注册驱动、建立连接、发送SQL请求、接收响应及关闭连接的步骤。提供了登录、查询、添加等实际操作案例,并展示了如何处理异常和防止SQL注入。同时,文章还给出了Userinfo和Student两个实体类的定义,用于数据封装。
摘要由CSDN通过智能技术生成

JDBC


是什么???

java database connectivity (java连接数据库)
通过java程序来直接访问数据库服务器。

JDBC

有什么用???

可以通过java程序直接发送SQL语句,与数据库进行交互。

怎么用???

步骤:
	1.注册管理驱动
	2.建立连接
	3.发送请求
	4.接受响应
	5.断开连接,释放资源。


准备工作:

1.将Driver jar 包复制到 java程序下 lib文件夹中 ,
2.右击BuildPath --> add to …  导入jar包 

案例1: 实现JDBC 基本连接 – 查询

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

/**
 * 实现JDBC 连接
 */

public class jdbc {

    // sql查询
    public static void main(String[] args) throws SQLException {  // 异常应该处理掉,而不应该抛掉
        // 1.实现对驱动注册管理
        DriverManager.registerDriver(new Driver());

        //2.建立连接
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/student?useSSL = true",    //jdbc协议:子协议mysql://IP(本地) :端口(3306)/ 数据库?加密传输
                "root",         // 数据库账号
                "root"     // 数据库密码
        );
        //3. 发送数据
        String sql = "select * from student";
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);    // rs 游标  箭头

        //4.返回响应
        while (rs.next()){      //循环遍历
            int sid  = rs.getInt("sid");
            String sname =  rs.getString("sname");
            System.out.printf("sid = %d,sname = %s\n",sid,sname);
        }

        //5.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}


/**
 * 改进点:
 *  1. 异常需要处理掉(不能随便抛出),可以添加自定义异常
 *  2. 获取到的数据不直接输出,把结果封装为一个实体类
 *
 */

案例2:实现登录、增加、查询


import com.mysql.jdbc.Driver;
import entity.Student;
import entity.Userinfo;
import javax.swing.plaf.synth.SynthDesktopIconUI;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 实现JDBC 连接
 *
 * 改进点:
 *  1. 异常需要处理掉(不能随便抛出),可以添加自定义异常
 *  2. 获取到的数据不直接输出,把结果封装为一个实体类
 */

public class jdbc2 {

    //登录
	//解决了异常的处理、传输的加密、新的注册管理, 建立了Userinfo实体类、空指针异常
	// 但存在SQL注入的问题 (login2 中将会解决)
	// 新建了Userinfo 实体类
    public static Userinfo login(String username,String password){
        Userinfo info = null;
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;


        try {
            //注册管理
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接

            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/student?useSSL = true",    //jdbc协议:子协议mysql://IP(本地) :端口(3306)/ 数据库?加密传输
                    "root",         // 数据库账号
                    "root" );  // 数据库密码
            // 发送请求
            stmt = conn.createStatement();  // 下面的SQL存储SQL注入的问题(需处理)
            String sql = "select * from userinfo where username ="+ username+"and password ='"+password+"' ";
            rs = stmt.executeQuery(sql);

            // 返回响应
            while(rs.next()){
                info = new Userinfo();
                info.setSid(rs.getInt("uid"));
                info.setSname(username);
                info.getPassword(password);
            }

        } catch (SQLException e) {
                e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            try{
                //5.释放资源
                if (rs != null){
                    rs.close();
                }
                if (stmt != null){
                    stmt.close();
                }
                if (conn != null){
                    conn.close();
                }
            }catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return info;
    }

    // 查询所有
    // 新建了student实体类
    public  static void queryAll(){
        // 构造list集合存储数据
        List<Student> stus = new ArrayList<>();

        Statement stmt = null;
        ResultSet rs = null;
        Connection conn = null;

        try {
            // 1.实现对驱动注册管理
            DriverManager.registerDriver(new Driver());

            //2.建立连接
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/student?useSSL = true",    //jdbc协议:子协议mysql://IP(本地) :端口(3306)/ 数据库?加密传输
                    "root",         // 数据库账号
                    "root"     // 数据库密码
            );
            //3. 发送数据
            String sql = "select * from student";
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);    // rs 游标  箭头

            //4.返回响应
            while (rs.next()){      //循环遍历
                int sid  = rs.getInt("sid");
                String sname =  rs.getString("sname");
                Student stu = new Student(sid,sname);
                stus.add(stu);      // 将获取到的每条student数据存储到列表中
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try{
                //5.释放资源
                if (rs != null){
                    rs.close();
                }
                if (stmt != null){
                    stmt.close();
                }
                if (conn != null){
                    conn.close();
                }
            }catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    // 添加
    public static  int insert(Student stu){
        //  记录影响的行数
        int rows = 0;
        Connection conn = null;
        Statement stmt = null;

        try {
            // 注册驱动(更好)
            Class.forName("com.mysql.jdbc.Driver");   // 静态块中执行DriverManager.registerDriver(new Driver())

            // 获取连接
                conn = DriverManager.getConnection( //localhost:3306     则 IP(本地)和端口(3306)可以省略
                    "jdbc:mysql:///student?useSSL = true",    //jdbc协议:子协议mysql://IP(本地) :端口(3306)/ 数据库?加密传输
                    "root",         // 数据库账号
                    "root");   // 数据库密码

            // 发送SQL
            stmt = conn.createStatement();
            String sql = "insert into student values("+stu.getsid()+",+'"+ stu.getSname()+"')";   //静态SQL(会发生SQL注入)
            rows = stmt.executeUpdate(sql);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try{
                //5.释放资源
                if (stmt != null){  // 防止stmt 为空,(空指针异常)
                    stmt.close();
                }
                if (conn != null){
                    conn.close();
                }
            }catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return  rows;

    }


    //登录2 
    // 解决了SQL注入问题,采用PrepareStatement 
    public static Userinfo login2(String username,String password){
        Userinfo info = null;   
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;


        try {
            //注册管理
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接

            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/student?useSSL = true",    //jdbc协议:子协议mysql://IP(本地) :端口(3306)/ 数据库?加密传输
                    "root",         // 数据库账号
                    "root" );  // 数据库密码
            // 发送请求
            String sql = "select * from userinfo where username =? and password =?";
            //创建ps对象并且对SQL执行预编译
            ps = conn.prepareStatement(sql);  // 下面的SQL存储SQL注入的问题(需处理)
            // 赋值
            ps.setString(1,username);
            ps.setString(2,password);
            // 发送SQL
            rs = ps.executeQuery();

            // 返回响应
            while(rs.next()){
                info = new Userinfo();
                info.setSid(rs.getInt("uid"));
                info.setSname(username);
                info.getPassword(password);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            try{
                //5.释放资源
                if (rs != null){
                    rs.close();
                }
                if (ps != null){
                    ps.close();
                }
                if (conn != null){
                    conn.close();
                }
            }catch (SQLException e) {
                e.printStackTrace();
            }
        }


        return info;
    }



    public static void main(String[] args){
        // 测试查询
        Student stu  = new Student(2,"zs");
        // 测试添加
        System.out.println(insert(stu));
        // 测试登录
        System.out.println(login("zs","123"));

        if(login("ww","566") == null){
            System.out.println("登录失败");
        }else {
            System.out.println("登录成功");
        }

        // 测试登录(防SQL注入)

        if(login2("ww","566") == null){
            System.out.println("登录失败");
        }else {
            System.out.println("登录成功");
        }
    }

}

Userinfo 实体类

package entity;

/**
 * userinfo 实体类
 */
public class Userinfo {

    private int sid;
    private String username;
    private  String password;

    public Userinfo(){

    }

    public Userinfo(int sid,String username,String password){
        super();
        this.sid = sid;
        this.username = username;
        this.password = password;
    }

    public int getSid(){
        return  sid;
    }

    public String getsname(){
        return  username;
    }

    public  String getPassword(String password){
        return this.password;
    }

    public void setSid(int sid){
        this.sid = sid;
    }

    public  void setSname(String username){
        this.username = username;
    }

    public void setPassword(String password){
        this.password = password;
    }
}

Student 实体类

package entity;

// 实体类

/**
 * student 表对应的类
 */
public class Student {

    private int sid;
    private String sname;

    public Student(){

    }

    public Student(int sid,String sname){
        super();
        this.sid = sid;
        this.sname = sname;
    }

    // get 、set
    public int getsid(){
        return sid;
    }
    public void setSid(int sid){
        this.sid = sid;
    }

    public String getSname(){
        return sname;
    }

    public void setSname(String sname){
        this.sname = sname;
    }

    @Override
    public String toString(){
        return "Student [sid="+ sid +",sname="+ sname +"]";
    }
}

jDBC原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值