JAVAWEB-NOTE04-JDBC

简介

快速入门

快速用JAVA操作MDBS的方法:
第0步:创建工程,导入驱动的jar包(也就是实现jdbc的接口)

第一步:注册驱动

Class.forName()

第二步:获取连接

Connection conn = DriverManager.getConnection(url,username,password);

第三步:定义SQL语句

String sql = "语句"

第四步:获取执行SQL对象

Statement stmt = conn.createStatement();

第五步:执行SQL

stmt.executeUpdate(sql);

第六步:处理返回结果
第七步:释放资源

eg:现在我想用Java去操作我本地的db1这个数据库,将张三的金额改为5000:
第0步:将驱动jar复制到工程的Lib中,还要让这个工程识别Jar包:

package com.jdbclearn;
/*
* JDBC快速入门
* */

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

public class JDBCDemo {
    public static void main(String[] args) throws Exception {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1";
        String username = "root";
        String password = "1234";
        //IDEA快速生成返回值:ctrl+alt+v
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义sql
        String sql = "UPDATE trans_money SET trans_money.money = 5000 WHERE trans_money.name = \"张三\";";
        //4.获取执行sql的对象statement
        Statement stmt = conn.createStatement();
        //5.执行sql
        int i = stmt.executeUpdate(sql);//此处的i就是mysql返回的成功操作的行row数
        //6.处理返回参数
        System.out.println(i);
        //7.释放资源
        stmt.close();
        conn.close();
    }
}

IDEA运行结果:

mysql中数据结果被java代码改变:

API详解

DriverManager

两个作用:
1.注册驱动(mysql 5 之后可以省略此步)

2.获取数据库连接

Connection

两个作用:
1.获取执行SQL对象

2.管理事务

java里面如何管理事务?使用try catch:
eg:

try {
            //手动开启事务
            conn.setAutoCommit(false);
            //3.定义sql
            String sql1 = "UPDATE trans_money SET trans_money.money = 5000 WHERE trans_money.name = \"张三\";";
            String sql2 = "UPDATE trans_money SET trans_money.money = 5000 WHERE trans_money.name = \"李四\";";
            //4.获取执行sql的对象statement
            stmt = conn.createStatement();
            //5.执行sql
            int i1 = stmt.executeUpdate(sql1);//此处的i就是mysql返回的成功操作的行row数
            int i2 = stmt.executeUpdate(sql2);
            //6.处理返回参数
            System.out.println(i1);
            System.out.println(i2);
            //没有问题就commit
            conn.commit();
        } catch (Exception e) {
            //在catch中进行回滚操作
            conn.rollback();
            e.printStackTrace();
        }

没有开启事务时:
开启事务后:

Statement

ResultSet


 //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
        String username = "root";
        String password = "1234";
        //IDEA快速生成返回值:ctrl+alt+v
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义一个SQL
        String sql = "SELECT * FROM trans_money;";
        //4.操作sql对象
        Statement stmt = conn.createStatement();
        //5.查询的结果返回一个ResultSet对象
        ResultSet res = stmt.executeQuery(sql);
        //6.遍历出res的内容
        while(res.next()){
            String name = res.getString("name");
            int money = res.getInt("money");

            //打印内容
            System.out.println(name);
            System.out.println(money);
            System.out.println("------------");
        }
        res.close();
        stmt.close();
        conn.close();

ResultSet案例

需求:查询account账号表的数据,封装到Account对象中,并且存储到ArrayList集合中
这是一个常见的业务需求,网页前端展示页面的时候就需要遍历这个集合来展示数据。

第一步先创建一个Account类:

public class Account {
    //创建一个Account实体类
    /*
    * 对java实体类的众多理解:

    A .就是属性类,通常定义在model层里面

    B. 一般的实体类对应一个数据表,其中的属性对应数据表中的字段。
    好处:
    1.对对象实体的封装,体现OO思想。
    2.属性可以对字段定义和状态进行判断和过滤
    3.把相关信息用一个实体类封装后,我们在程序中可以把实体类作为参数传递,更加方便。

    C. 说白了就是为了让程序员在对数据库操作的时候不用写SQL语句

    D. 就是一个数据库表生成一个类
    这样做对数据库操作起来方便
    编写代码较少 提高效率 可以使程序员专注逻辑关系

    E. 实体类就是把对某一个表的操作全写在一个类中.
    */
    private String name;
    private int money;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

第二步,将查询的值封装到Account对象中,并添加到list:

 //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
        String username = "root";
        String password = "1234";
        //IDEA快速生成返回值:ctrl+alt+v
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义一个SQL
        String sql = "SELECT * FROM account;";
        //4.操作sql对象
        Statement stmt = conn.createStatement();
        //5.查询的结果返回一个ResultSet对象
        ResultSet res = stmt.executeQuery(sql);
        //6.遍历出res的内容
        List <Account> list = new ArrayList<>();
        while(res.next()){
            Account account = new Account();

            String name = res.getString("name");
            int money = res.getInt("money");

            account.setName(name);
            account.setMoney(money);

            list.add(account);
        }
        System.out.println(list);
        res.close();
        stmt.close();
        conn.close();

运行后完成需求:

PreparedStatemet

作用:

演示SQL注入

假设现在存在这样一个登录界面,我们在登录界面输入的用户名和密码会去到用户表中查询,如果有对应的用户和正确的密码就能成功登录

现在先演示一下正确的操作:

  //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
        String username = "root";
        String password = "1234";
        //IDEA快速生成返回值:ctrl+alt+v
        Connection conn = DriverManager.getConnection(url, username, password);

        //接受用户的输入
        String name = "jack";
        String pwd = "654321";

        //定义SQL语句
        String sql = "SELECT * FROM user_info WHERE username = '"+name+"' AND passcode = '"+pwd+"'";

        //定义执行sql对象
        Statement stmt = conn.createStatement();

        ResultSet res = stmt.executeQuery(sql);

        if (res.next()){
                System.out.println("log success~");
        }else {
                System.out.println("log failed!");
        }

        res.close();
        stmt.close();
        conn.close();

可以看到登录成功:

这时我们去修改用户的输入:

 //接受用户的输入
        String name = "sss";
        String pwd = "' or '1' = '1";

        //定义SQL语句
        String sql = "SELECT * FROM user_info WHERE username = '"+name+"' AND passcode = '"+pwd+"'";

可以看到完全不正确的用户名和密码也登录成功了:

这就是sql注入的危害,因为以上的改了pwd的sql语句其实是这样的:

SELECT * FROM user_info WHERE username = 'sss' AND passcode = '' or '1' = '1'

解决sql注入

//接受用户的输入
        String name = "sss";
        String pwd = "' or '1' = '1";

        //定义SQL语句
        String sql = "SELECT * FROM user_info WHERE username = ? AND passcode = ?";

        //定义执行sql对象
        PreparedStatement preparedStatement = conn.prepareStatement(sql);

        //给参数赋值
        preparedStatement.setString(1,name);
        preparedStatement.setString(2,pwd);

        ResultSet res = preparedStatement.executeQuery();

        if (res.next()){
                System.out.println("log success~");
        }else {
                System.out.println("log failed!");
        }

        res.close();
        preparedStatement.close();
        conn.close();

运行结果登录失败:

原理

数据库连接池

简介


Druid数据库连接池

使用步骤

1.导入jar包druid-1.1.12jar
2.定义配置文件
3.加载配置文件
4.获取数据库连接池对象
5.获取连接

posted @ 2023-02-26 14:13  男人的浪漫  阅读(22)  评论(0)    收藏  举报