mysql:权限&JDBC

ctrl+alt+v:直接获取某个方法的返回值,并创建值接收

ctrl+alt+m:将java语句抽取成方法,只需要写入方法名

ctrl+alt+t:快速将选中语句加上try…catch

alt+鼠标下移:批量编辑

一 DCL(数据控制语言)

进入企业,一般有专门的DBA去负责管理数据库

1.1 创建用户

-- 格式
create user '用户名'@'主机地址' identified by '新密码';
-- 主机地址 localhost or 127.0.0.1 
-- % 代表任意主机地址【慎用】
-- 密码可以为空 【慎用】

1.2 用户授权

-- 格式
grant 权限1,权限2... on 数据库名.表名 to '用户名'@'主机地址';
权限:
create alter drop select update ....
all -- 代表所有的权限【慎用】
*.* -- 所有库.所有表 【慎用】
数据库名.* --该数据库中的所有表【经常使用】

1.3 查看授权

-- 格式
show grants for '用户名'@'主机地址';

1.4 撤销授权

-- 格式
revoke 权限1,权限2... on 数据库名.表名 from '用户名'@'主机地址';
权限:
create alter drop select update ....
all -- 代表所有的权限【慎用】
*.* -- 所有库.所有表 【慎用】
数据库名.* --该数据库中的所有表【经常使用】

1.5 删除用户

-- 格式
drop user '用户名'@'主机地址';

1.6 密码管理

a)超级管理员
-- 格式 在dos窗口下
mysqladmin -u用户名 -p password 新密码
b)普通用户
-- 格式
set password for '用户名'@'主机地址'=password('新密码');
-- 创建用户
CREATE USER 'tom'@'localhost' IDENTIFIED BY '123';-- 只有本机可以使用
CREATE USER 'jerry'@'%' IDENTIFIED BY '123';-- 任意主机都可以使用

-- 用户授权
GRANT SELECT ON db_day03.* TO 'tom'@'localhost';-- 授予用户查询权限

-- 查看权限
SHOW GRANTS FOR 'tom'@'localhost';

-- 撤销授权
REVOKE SELECT ON db_day03.* FROM 'tom'@'localhost';

-- 删除用户
DROP USER 'tom'@'localhost';

-- 修改普通用户密码
SET PASSWORD FOR 'jerry'@'%'=PASSWORD('789');

二 JDBC

2.1 概述

Java DataBase Connectivity: Java数据库连接

简单来说通过java代码操作数据库

JDBC:是关系型数据库的一套规范(接口),对我们只需要学习接口的方法即可

驱动:实现类由数据库厂商提供(jar)

在这里插入图片描述

JDBC规范:

  • DriverManager:用于注册驱动
  • Connection:表示与数据库创建的连接
  • Statement:操作数据库sql语句的对象
  • ResultSet:结果集或一张虚拟表

2.2 初体验

需求

在java控制台输出数据库查询的结果

步骤分析

1、创建数据库表和表记录

2、创建java工程

3、导入jar包

​ MySQL驱动

4、编写代码

​ // 连接数据库

​ // 编写sql

​ // 创建语句执行者(小货车)

​ // 执行sql并返回结果

​ // 处理结果

​ // 关闭资源

代码片段

@Test
public void test01() throws Exception {
    // 连接数据库
    // 1.1 注册驱动  mysql
    DriverManager.registerDriver(new Driver());
    // 1.2 获取连接
    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_day04", "root", "root");
    // 编写sql  注意 java字符串编写sql语句 分号可以省略
    String sql = "select * from user;";
    // 创建语句执行者(小货车)
    Statement statement = connection.createStatement();
    // 执行sql并返回结果
    ResultSet resultSet = statement.executeQuery(sql);
    // 处理结果
    while (resultSet.next()) {
        // 获取记录 根据key  获取value
        int id = resultSet.getInt("id");
        String username = resultSet.getString("username");
        String password = resultSet.getString("password");
        System.out.println("一条记录结果为:" + id + " " + username + " " + password);
    }
    // 关闭资源
    resultSet.close();
    statement.close();
    connection.close();
}

2.3 API详解

都是sun公司提供的规范 :java.sql.*

a)DriverManager

驱动管理器

确定java代码连接哪个数据库

// 注册驱动
// DriverManager.registerDriver(Driver mysql实现类); 【后续不用】
	通过翻看 com.mysql.jdbc 源码,知道在静态代码块已经实现类注册驱动的功能
	只需要把 com.mysql.jdbc 类,加载到JVM虚拟机内存并初始化 
//使用反射
Class.forName("com.mysql.jdbc.Driver");
//获取连接
Connection conn =DriverManager.getConnection(String 数据库地址,String 用户名,String 密码);
	数据库地址:格式非常固定
		jdbc:mysql://主机地址:端口号/数据库名
		例如:
			jdbc:mysql://127.0.0.1:3306/db_day04
			jdbc:mysql:///db_day04
			jdbc:mysql:///db_day04?characterEncoding=utf-8
b)Connection

static Connection getConnection(String url, String user, String password) :试图建立到给定数据库 URL的连接。
参数说明:

  • url:需要连接数据库的位置(网址)最后为数据库名
  • user:用户名
  • password:密码

例如: getConnection("jdbc:mysql://localhost:3306/day04", "root", "root");

让java代码与数据库建立通道

// 创建语句执行者(小货车),后续不用  有bug
public Statement createStatement();
// 创建预编译语句执行者(高铁) 今后使用,很重要
public PreparedStatement prepareStatement(String sql);
// 事务安全
c)Statement

把java代码编写sql传递给数据库,并返回数据库的结果

// 执行sql语句 【了解】
public boolean execute(String sql);//执行dml(增删改)语句返回false,执行dql(查)语句返回true
// 执行dml语句
public int executeUpdate(String dml);//返回结果为影响行数
// 执行dql语句
public ResultSet executeQuery(String dql);//返回结果虚拟表
d)ResultSet

用于接收数据库查询的虚拟表结果集

// 指针下移
public boolean next(); 若有记录返回true,若没有记录返回false
// 获取记录
public T getXxx(int 第几列 | String 列名);

// 特殊
getString 可以获得全部类型  底层进行转换(数值、日期)

在这里插入图片描述

e)流程图

在这里插入图片描述

2.4 实现增删改查

新增

// 新增
@Test
public void test01() throws Exception {
    // 连接数据库
    // 1.1 注册驱动
    Class.forName("com.mysql.jdbc.Driver");
    // 1.2 获取连接
    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_day04", "root", "root");
    // 编写sql
    String sql = "insert into user values(null,'jerry','321')";
    // 创建语句执行者(小货车)
    Statement statement = connection.createStatement();
    // 执行sql并返回结果
    int i = statement.executeUpdate(sql);
    // 处理结果
    if (i > 0) {
        System.out.println("新增成功!");
    } else {
        System.out.println("新增失败!");
    }
    // 关闭资源
    statement.close();
    connection.close();
}

修改

// 修改
@Test
public void test02() throws Exception {
	// 连接数据库
	// 1.1 注册驱动
	Class.forName("com.mysql.jdbc.Driver");
	// 1.2 获取连接
	Connection connection = 			DriverManager.getConnection("jdbc:mysql://localhost:3306/db_day04", "root", "root");
	// 编写sql
	String sql = "update user set password = '456' where id = 4";
	// 创建语句执行者(小货车)
	Statement statement = connection.createStatement();
	// 执行sql并返回结果
	int i = statement.executeUpdate(sql);
	// 处理结果
	if (i>0) {
	System.out.println("修改成功!");
	}else{
	System.out.println("修改失败!");
	}
	// 关闭资源
	statement.close();
	connection.close();
}

删除

// 删除
@Test
public void test03() throws Exception {
    // 连接数据库
    // 1.1 注册驱动
    Class.forName("com.mysql.jdbc.Driver");
    // 1.2 获取连接
    Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db_day04", "root", "root");
    // 编写sql
    String sql = "delete from user where id = 4";
    // 创建语句执行者(小货车)
    Statement statement = connection.createStatement();
    // 执行sql并返回结果
    int i = statement.executeUpdate(sql);
    // 处理结果
    if (i>0) {
        System.out.println("删除成功!");
    }else{
        System.out.println("删除失败!");
    }
    // 关闭资源
    statement.close();
    connection.close();
}

查询

//查询
@Test
public void test04() throws Exception{
    // 连接数据库
    // 1.1 注册驱动
    Class.forName("com.mysql.jdbc.Driver");
    // 1.2 获取连接
    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/lv","root","syr19950111");
    // 编写sql
    String str = "select * from user";
    // 创建语句执行者(小货车)
    Statement statement = connection.createStatement();
    // 执行sql并返回结果
    ResultSet resultSet = statement.executeQuery(str);
    // 处理结果
    while (resultSet.next()){
        int id = resultSet.getInt("id");
        String username = resultSet.getString("name");
        System.out.println(id+" "+username);
    }
    // 关闭资源
    resultSet.close();
    statement.close();
    connection.close();
}

2.5 工具类

我们在操作JDBC时发现,获取连接、关闭资源等代码属于公共部分,抽取到工具类,简化代码,提高效率

步骤分析

// 提供获取连接的方法

// 提供关闭资源的方法 【方法重载】

代码片段

package cn.khd.utils;

import java.sql.*;

public class JDBCUtils3 {
    // 注册驱动
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    // 提供获取连接的方法
    public static Connection getConnection() throws SQLException {
        // 获取连接
        return  DriverManager.getConnection("jdbc:mysql://localhost:3306/lv", "root", "syr19950111");
    }

    // 提供关闭资源的方法(方法重载) 3个参数
    public static void closeResource(ResultSet resultSet, Statement statement, Connection connection) {
        // ctrl + alt + m
        closeResutSet(resultSet);

        closeStatement(statement);

        closeConnection(connection);
    }

    // 提供关闭资源的方法(方法重载) 2个参数
    public static void closeResource(Statement statement, Connection connection) {
        closeStatement(statement);

        closeConnection(connection);
    }

    private static void closeConnection(Connection connection) {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    private static void closeStatement(Statement statement) {
        if (statement != null) {
            try {
                // 空指针异常
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    private static void closeResutSet(ResultSet resultSet) {

        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

2.6 事务安全

需求

雨琦给巴元转账

技术分析

通过Connection操作事务

// 开启事务 关闭自动提交时
public void setAutoCommit(boolean false);
// 提交事务
public void commit();
// 回滚事务
public void rollback()

步骤分析

1 准备表记录

2 编写代码(jdbc)

​ // 获取连接

​ // 开启事务

​ // 创建语句执行者(小货车)

​ // 雨琦扣钱

​ // 巴元加钱

​ // 提交事务

​ // 回滚事务

​ // 关闭资源

代码片段

public static void main(String[] args) {
    // 声明变量
    Connection connection = null;
    Statement statement = null;
    try {
        // 获取连接
        connection = JDBCUtils2.getConnection();
        // 开启事务
        connection.setAutoCommit(false);
        // 创建语句执行者(小货车)
        statement = connection.createStatement();

        // 雨琦扣钱
        String sql = "update account set balance = balance -100 where id = 1;";
        // 执行雨琦扣钱
        int i = statement.executeUpdate(sql);
        if (i > 0) {
            System.out.println("雨琦扣钱成功");
        } else {
            System.out.println("雨琦扣钱失败");
        }
        // 模拟错误
        int a = 1 / 0;
        // 巴元加钱
        String sql2 = "update account set balance = balance +100 where id = 2;";
        // 执行巴元加钱
        int i2 = statement.executeUpdate(sql2);
        if (i2 > 0) {
            System.out.println("巴元加钱成功");
        } else {
            System.out.println("巴元加钱失败");
        }
        // 提交事务
        connection.commit();
    } catch (SQLException e) {
        e.printStackTrace();
        // 回滚事务
        try {
            connection.rollback();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
    } finally {
        // 关闭资源
        JDBCUtils2.closeResource(statement, connection);
    }
}

2.7 案例:用户登录

需求

模拟用户登录

需求分析

在控制台输入用户名和密码,根据用户名和密码查询数据库,根据数据库返回结果判断用户是否登录成功

步骤分析

// 在控制台输入用户名和密码 scanner技术

// 根据用户名和密码查询数据库 jdbc技术

// 根据数据库返回结果判断用户是否登录成功 if else技术

代码片段

// idea 中使用@Test 结合scanner 会有bug
public static void main(String[] args) throws Exception {
    // 在控制台输入用户名和密码 scanner技术
    Scanner scanner = new Scanner(System.in);
    System.out.println("欢迎来到德莱联盟");
    System.out.println("请输入用户名:");
    String username = scanner.nextLine();
    System.out.println("请输入密码:");
    String password = scanner.nextLine();

    // 根据用户名和密码查询数据库 jdbc技术(6步)
    Connection connection = JDBCUtils2.getConnection();
    // 使用sql字符串进行拼接 是非常繁琐的 代码不方便阅读
    String sql = "select * from user where username = '" + username + "' and password = '" + password + "'";
    System.out.println(sql);
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery(sql);
    // 根据数据库返回结果判断用户是否登录成功 if else技术
    // 我们确定了返回结果集最多为一条记录 可以使用 if判断
    if (resultSet.next()) {
        System.out.println("登录成功");
    } else {
        System.out.println("用户名或密码错误");
    }

    // 关闭资源
    JDBCUtils2.closeResource(resultSet, statement, connection);
}

复习

  • 能够使用内连接进行多表查询
  • 能够使用外连接进行多表查询
  • 能够使用子查询进行多表查询
  • 能够理解JDBC的概念
  • 能够使用DriverManager类
  • 能够使用Connection接口
  • 能够使用Statement接口
  • 能够使用ResultSet接口
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值