【Java基础之JDBC】一篇文章带你入门JDBCJDBC

博客主页:屠一乐的博客
发文时间:2022.4.27
Java网络编程
一定存在只有你才能做成的事
博主水平有限,如有错误,欢迎指正
欢迎各位收藏评论✉
【Java基础之JDBC】一篇文章带你入门JDBCJDBC_第1张图片

JDBC连接数据库

  • JDBC功能类详解
    • DriverManager
      • 如何添加jar包
    • Connection
    • Statement
    • JDBC案例
    • JDBC工具类
    • SQL注入攻击

JDBC功能类详解

JDBC是如何连接数据库的?看图看图
【Java基础之JDBC】一篇文章带你入门JDBCJDBC_第2张图片

【Java基础之JDBC】一篇文章带你入门JDBCJDBC_第3张图片

DriverManager

1.DriverManager驱动管理对象
①注册驱动
●注册给定的驱动程序:static void registerDriver(Driver driver);
●写代码使用:Class.forName(“com.mysql.jdbc.Driver”);
·在com.mysql.jdbc.Driver类中存在静态代码块

static{
try{
	java.sql.DriverManager.registerDriver(new Driver());
]catch (SQLException E){
	throw new RuntimeException("Can't register driver!");}}

注意
·我们不需要通过DriverManageri调用静态方法registerDriver(),因为只要Driver类被使用,则会执行其静态代码块完成注册驱动
·mysql5之后可以省略注驱动的步骤。在jar包中,存在一个java.sql.Driver配置文件,文件中指定了com.mysql.idbc.Driver

1.DriverManager驱动管理对象
获取数据库连接
获取数据库连接对象:static Connection getConnection(String url,String user,String password);
返回值:Connection数据库连接对象
参数

如何添加jar包

jar包是什么?
jar包就是 Java Archive File,顾名思义,它的应用是与 Java 息息相关的,是 Java 的一种文档格式,是一种与平台无关的文件格式,可将多个文件合成一个文件。jar 包与 zip 包非常相似——准确地说,它就是 zip 包,所以叫它文件包。jar 与 zip 唯一的区别就是在 jar 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,该文件是在生成 jar 文件的时候自动创建的,作为jar里面的"详情单",包含了该Jar包的版本、创建人和类搜索路径Class-Path等信息,当然如果是可执行Jar包,会包含Main-Class属性,表明Main方法入口,尤其是较为重要的Class-Path和Main-Class。

在数据库官网下载对应版本后不用解压,直接复制到lib包下然后【Java基础之JDBC】一篇文章带你入门JDBCJDBC_第4张图片
展开后像这样就导入成功了在这里插入图片描述

注意:若url出现异常com.mysql.cj.jdbc.Driver,看异常信息改

  • JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。
    详细问题请看com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定

  • JDBC URL的标准由三部分组成,各部分间用冒号分隔。

    • jdbc:子协议:子名称
    • 协议:JDBC URL中的协议总是jdbc
    • 子协议:子协议用于标识一个数据库驱动程序
    • 子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名
  • 举例:

【Java基础之JDBC】一篇文章带你入门JDBCJDBC_第5张图片

总的来说,关系是这鸭子的:

【Java基础之JDBC】一篇文章带你入门JDBCJDBC_第6张图片

Connection

1.Connection数据库连接对象
①获取执行者对象
获取普通执行者对象:Statement createStatement0;
获取预编译执行者对象:PreparedStatement prepareStatement(String sql);
②管理事务
开启事务:setAutoCommit(boolean autoCommit);
参数为false,则开启事务。
提交事务:commit():
回滚事务:rollbacko;
③释放资源
立即将数据库连接对象释放:void close0:

Statement

1.Statement执行sql语句的对象
①执行DML语句:int executeUpdate(String sql)
返回值int:返回影响的行数。
参数sql:可以执行insert、update、delete语句。
②执行DQL语句:ResultSet executeQuery(String sql)):
返回值ResultSet:封装查询的结果。
参数sql:可以执行selecti语句。
③释放资源
立即将执行者对象释放:void close();

ResultSet
1.ResultSet结果集对象
①判断结果集中是否还有数据:boolean next()
有数据返回true,并将索引向下移动一行,没有数据返回false。
②获取结果集中的数据:XXX getXxx(“列名");
XXX代表数据类型(要获取某列数据,这一列的数据类型)。
例如:String getString(“name”) ;int getInt(“age”);
③释放资源
立即将结果集对象释放:void close();

JDBC案例

数据准备

1.创建数据库和数据表
-- 创建db14数据库
CREATE DATABASE db14;
-- 使用db14数据库
USE db14;
-- 创建student表
CREATE TABLE student(
    sid INT PRIMARY KEY AUTO_INCREMENT,-- 学生id
    NAME VARCHAR(20),-- 学生姓名
    age INT,-- 学生年龄
    birthday DATE,-- 学生生日
);
-- 添加数据
INSERT INT0 studer VALUES(NULL,'张三',23,'1999-09-23'),
                        (NULL,'李四',24,'1998-08-10'),
                        (NULL,'王五',25,'1996-06-06'),
                        (NULL,'赵六',26,'1994-10-20');

2.创建Student类

public class student{
    private Integer sid;
    private String name;
    private Integer age;
    private Data birthday;

注意:
自定义类的功能是为了封装表中每列数据,成员变量和列保持一致
所有基本数据类型需要使用对应包装类,以免表中url值无法赋值

需求实现
1.需求一:查询所有学生信息
2.需求二:根据id查询学生信息
3.需求三:新增学生信息
4.需求四:修改学生信息
5.需求五:删除学生信息


import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class StuDaoImp implements StuDao{


    @Override
    public ArrayList<Student> findAll() {
        ArrayList<Student> students = new ArrayList<>();
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            connection = Jutils.getCon();
            statement = connection.createStatement();
            resultSet = statement.executeQuery("SELECT * From student");

            while (resultSet.next()){
                Integer id = resultSet.getInt("id");
                Integer age = resultSet.getInt("age");
                String name = resultSet.getString("name");
                Integer score = resultSet.getInt("socre");

                Student student = new Student(id,name,age,score);
                System.out.println(student);
                students.add(student);
            }
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            Jutils.close(statement,resultSet,connection);
        }
        return students;
    }


    @Override
    public int insert(Student student) {
        return 0;
    }

    @Override
    public int update(small_program.linksql.text.Student student) {
        return 0;
    }

    @Override
    public int del(Integer id) {
        return 0;
    }
}

JDBC工具类

抽取工具类
1.编写配置文件
在src目录下创建config.properties配置文件

driverclass=com.mysql.jdbc.Driver
url=jdbc:mysq1://localhost:3306/db14
username=root
password=你的数据库密码

4.Student表的CRUD操作整合页面
①用户表的数据准备

-- 创健用户表
CREATE TABLE USER(
    uid VARCHAR(50)PRIMARY KEY,-- 用户id
    ucode VARCHAR(50),-- 用户标识
    loginname VARCHAR(100),-- 登录用户名
    PASSWORD VARCHAR(100),-- 登录密码
    username VARCHAR(100),-- 用户名
    gender VARCHAR(10),-- 用户性别
    birthday DATE,-- 出生日期
    dutydate DATE-- 入职日期
);
-- 添加一条测试数据
INSERT INTO 'user'VALUES ('11111111','zhangsan001','zhangsan','1234','男''2008-10-28''2018-10-28');

import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;

public class Jutils {
    public Jutils() {
    }

    private static String driverClass;
    private static String url;
    private static String username;
    private static String password;
    private static Connection connection;

    static {
        try {
            Properties properties = new Properties();
            properties.load(new FileInputStream("src\\stu.properties"));
            driverClass = properties.getProperty("driverClass");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");


        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static Connection getCon() {
        try {
            connection = DriverManager.getConnection(url, username, password);

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    public static void close(Statement statement, ResultSet resultSet, Connection connection) {
        try {
            if (statement != null) {
                statement.close();
            }
            if (resultSet != null) {
                resultSet.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

SQL注入攻击

1.什么是SQL注入攻击
●就是利用sq语句的漏洞来对系统进行攻击
2.SQL注入攻击场所

即在密码处加入SQL语句

3.SQL注入攻击的原理
●按照正常道理来说,我们在密码处输入的所有内容,都应该认为是密码的组成
●但是现在Statement对像在执行sql语句时,将密码的一部分内容当做查询条件来执行了
4.SQL注入攻击的解决
●PreparedStatement预编译执行者对象
·在执行Sq语句之前,将sq语句进行提前编译。明确sq语句的格式后,就不会改变了。剩余的内容都会认为是参数
·SQL语句中的参数使用?作为占位符
●为?占位符赋值的方法:setXxx(参数1,参数2);
·Xxx代表:数据类型
·参数1:?的位置编号(编号从1开始)
·参数2:?的实际参数

String sql "DELETE FROM user WHERE name=?";
pstm conn.preparestatement(sq1);
pstm.setstring(1,"张三")

你可能感兴趣的:(数据库,Java项目,java,intellij-idea)