我是靠谱客的博主 大力芒果,最近开发中收集的这篇文章主要介绍一文带你了解JDBC前言JDBC,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 前言
  • JDBC
    • JDBC是什么
    • JDBC的本质
    • JDBC编程六步
    • SQL注入
    • Statement和PrepareStatement

前言

虽然现在已经不在使用JDBC了,一般都是Mybatis或者Spring Data JPA,但是不管使用什么ORM框架,都是在JDBC上封装了一层或几层,再者技多不压身,学习JDBC还是很有必要的。

JDBC

在web开发中,不可避免的要使用数据库来存储和管理数据。为了在java语言中提供数据库访问的支持,Sun公司在1996年提供了一套访问数据的标准Java类库,也称JDBC。

JDBC是什么

JDBC的全称为Java DataBase Connectivity(Java语言连接数据库),它是一套用于执行SQL语句的JavaAPI,也就是使用Java语言来操作数据库的一种API。

JDBC的本质

JDBC的本质是Sun公司提供的一套接口,有调用者和使用者,面向接口调用、面向接口写实现类,这都属于面向接口编程。

为什么要面向接口编程:降低程序之间的耦合度,避免修改一处代码而牵动别处代码的改动,提高程序的扩展力,多态就是一种面向接口编程的思想

	//推荐使用
	Animal c = new Cat();
	Animal d = new Dog();
	//不推荐使用
	Cat c = new Cat();
	Dog d = new Dog();

JDBC编程六步

  1. 注册驱动(告诉Java程序需要连接的数据库是MySQL、Oracle…)
  2. 获取连接(JVM和数据库之间进程的通道打开)
  3. 获取数据库操作对象(专门执行SQL语句的对象)
  4. 执行SQL语句(crud语句)
  5. 处理查询结果集(收集执行完SQL语句的结果)
  6. 释放资源(将Java和数据库之间进程的通道关闭)
package com.bjpowernode.jdbc;

import java.sql.*;

public class JDBC {
    public static void main(String[] args) throws SQLException {
        Statement stmt = null;
        Connection conn = null;
        ResultSet rs = null;
        try {
            //1.注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取连接
            //数据库中表的位置,数据库名,数据库密码
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode", "root", "111");
            //3.获取数据库操作对象
            stmt = conn.createStatement();
            //4.执行sql语句
            String sql = "update dept1 set dname = 'RENSHIBU',loc = 'SHANGHAI' where deptno = 20";
            String sql1 = "select * from dept1";
            int count = stmt.executeUpdate(sql);//count 表示被影响的行数
            rs = stmt.executeQuery(sql1);// stmt.executeQuery()方法返回的是一个集合
            //5.处理查询结果集
            System.out.println(count == 2 ? "修改成功" : "修改失败");
            //rs.next()方法返回的是一个boolean值
            while (rs.next()) {
                int deptno = rs.getInt("deptno");
                String dname = rs.getString("dname");
                String loc = rs.getString("loc");
                System.out.println(deptno + " " + dname + " " + loc);
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            //6.释放资源
            rs.close();
            stmt.close();
            conn.close();
        }
    }
}

SQL注入

所谓的SQL注入就是通过某种方式将恶意的SQL代码添加到输入参数中,传递到SQL服务器使其解析并执行的一种攻击方法

解决SQL注入问题
使用java.sql.PreparedStatement,PreparedStatement接口继承了java.sql.Statement,属于预编译数据库操作对象,预先对SQL语句进行编译,然后再给SQL语句传值

package com.bjpowernode.jdbc;

import java.sql.*;

public class JDBC {
    public static void main(String[] args) throws SQLException {
    	String loginName = "zhangsan";
    	String loginPwd = "123456";
    	boolean flag = false;
        Statement stmt = null;
        Connection conn = null;
        ResultSet rs = null;
        try {
       		//1.注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取连接
          	//数据库中表的位置,数据库名,数据库密码
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode", "root", "111");
            //3.获取预编译的数据库操作对象
            //sql语句的框架.其中一个?表示一个占位符.一个?将来接收一个"值", 占位符不能使用单引号括起来
            String sql = "select * from t_user where username =? and password=?";
            //程序执行到此处,会发送SQL语句框子给DBMS.然后DBMS进行sql语句的预先编译.
            ps = conn.prepareStatement(sql);
            //给占位符?传值(第一个问号下标是1,第二个下标是2,JDBC中所有下标从1开始)
            //setString(xxx,yyy)方法会自动给yyy添加单引号
            ps.setString(1,loginName);
            ps.setString(2,loginPwd);
            //4.执行sql
            rs = ps.executeQuery();
            //5.处理结果集
            if (rs.next()) {
                flag = true;
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            //6.释放资源
            rs.close();
            stmt.close();
            conn.close();
        }
    }
}

Statement和PrepareStatement

  • Statement的使用存在SQL注入问题,而PrepareStatement解决了SQL注入的问题
  • Statement是编译一次执行一次,PrepareStatement是编译一次,可执行多次,后者的效率更高一些
  • PrepareStatement更常用一些,但有些情况也会使用Statement

最后

以上就是大力芒果为你收集整理的一文带你了解JDBC前言JDBC的全部内容,希望文章能够帮你解决一文带你了解JDBC前言JDBC所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部