数据库权限&JDBC

权限&JDBC

1 DCL
进入公司后有专门的DBA管理和维护数据库,后期大家成为公司中间力量,参考文档、度娘 来对用户授权管理

1.1 创建用户
-- 格式
create user '用户名'@'主机名' identified by '密码';
主机名:
使用ip地址或主机名称 127.0.0.1 or localhost
任意主机名 % 【慎用】
密码可以为空 【不建议】
-- 创建用户
CREATE USER 'tom'@'127.0.0.1' IDENTIFIED BY '123';
CREATE USER 'jerry'@'%' IDENTIFIED BY '123';
1.2 用户授权
-- 格式
grant 权限1,权限2... on 数据库名.表名 to '用户名'@'主机名';
权限:
create alter drop select insert .....
所有权限使用 all
所有库所有表 . 经常使用: 数据库名.*
-- 用户授权
GRANT SELECT ON ee_day04.account TO 'tom'@'127.0.0.1';
1.3 查看权限

-- 格式
show grants for '用户名'@'主机名';
-- 查看权限
SHOW GRANTS FOR 'tom'@'127.0.0.1';
1.4 撤销授权

-- 格式
revoke 权限1,权限2.... on 数据库名.表名 from '用户名'@'主机名';
-- 撤销权限
REVOKE SELECT ON ee_day04.account FROM 'tom'@'127.0.0.1';
1.5 删除用户

-- 格式
drop user '用户名'@'主机名';
-- 删除用户
DROP USER 'tom'@'127.0.0.1';
1.6 密码管理

超级管理员

-- 修改密码 在dos命令窗口下
mysqladmin -u用户名 -p password 新密码
普通用户

-- 修改密码 登录mysql
set password for '用户名'@'主机名'=password('新密码');
2 JDBC

2.1 什么是JDBC
java database connectivity

通常说:java操作数据库

JDBC:是关系型数据库的一套规范(接口)

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

2.2 入门
需求

在控制台输出数据库表的信息

步骤分析

1 创建数据库和表

2 创建java工程

3 导入jar包

mysql驱动

4 编写代码

// 获取连接

// 编写sql

// 创建语句执行者

// 执行sql语句并返回结果

// 处理结果

// 释放资源

代码实现

数据库

CREATE DATABASE ...;
USE ...;
-- 创建表
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32),
PASSWORD VARCHAR(32)
);
-- 插入记录
INSERT INTO user VALUES(NULL,'tom','123');
INSERT INTO user VALUES(NULL,'jerry','123');
代码片段

@Test
public void test() throws Exception {

// 获取连接
// 1.1 注册驱动
DriverManager.registerDriver(new Driver());
// 1.2 获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/...", "root", "root");
// 编写sql
String sql = "select * from user;";
// 创建语句执行者
Statement statement = connection.createStatement();
// 执行sql语句并返回结果
ResultSet resultSet = statement.executeQuery(sql);
// 处理结果
while (resultSet.next()) {
    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详解
DriverManager

// 注册驱动
public static void registerDriver(Driver mysql驱动实现);
通过翻看 com.mysql.jdbc.Driver 源码,看到静态代码块实现了注册驱动操作
只需要将 com.mysql.jdbc.Driver 加载JVM虚拟机并且初始化操作即可
Class.forName("com.mysql.jdbc.Driver");
// 获取连接
public static Connection getConnection(String 数据库地址,String 用户名,String 密码);
数据库地址:固定格式
jdbc:mysql://主机地址:端口号/数据库名
例如:
jdbc:mysql://localhost:3306/...;
// 升级版 连接自己电脑 默认端口的 mysql数据库
jdbc:mysql:///ee_day05;
jdbc:mysql://192.168.200.128:3307/...;
Connection

// 创建语句执行者
public Statement createStatement();
// 创建预编译语句执行者
public PreparedStatement prepareStatement(String sql);
// 事务安全
Statement

// 执行SQL
public boolean execute(String sql); 执行DML 返回 false 执行DQL 返回 true
// 执行DML
public int executeUpdate(String 增删改语句); 返回结果为影响行数
// 执行DQL
public ResultSet executeQuery(String 查询语句); 返回结果集
ResultSet

// 判断是否有记录
public boolean next(); 指针下移;判断是否有记录 若有记录返回 true 若没有记录返回 false
// 获取指定列信息
public T getXxx(int 第几列 | String 列名);
int
double
String
Object

2.4 JDBC实现增删改查
新增

@Test
public void test() throws Exception {

// 获取连接
// 1.1 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 1.2 获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql:///...", "root", "root");
// 编写sql ; 可写可不写 不写 数据库会帮你自动加上
String sql = "insert into user values(null,'jack','123');";
// 创建语句执行者
Statement statement = connection.createStatement();
// 执行sql并返回结果
int i = statement.executeUpdate(sql);
// 处理结果
if (i > 0) {
    System.out.println(i);
    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/...", "root", "root");
// 编写sql
String sql = "update user set password = '123456' where id = 5";
// 创建语句执行者
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:///...", "root", "root");
// 编写sql
String sql = "delete from user where id = 3";
// 创建语句执行者
Statement statement = connection.createStatement();
// 执行sql并返回结果
int i = statement.executeUpdate(sql);
// 处理结果
if (i>0) {
    System.out.println("删除成功");
}else{
    System.out.println("删除失败");
}
// 释放资源
statement.close();
connection.close();

}
2.5 JDBC工具类
我们在编写JDBC操作数据库时,发现获取连接、释放资源属于公共部分,把这部分代码抽取到工具类,简化代码,提高效率

步骤分析

提供获取连接的方法

提供释放资源的方法

public class JDBCUtils {

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

}

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

//提供释放资源的方法
public static void closeResource(Connection connection, Statement statement, ResultSet resultSet) {
    // 释放结果集 ctrl + alt + m
    closeResultSet(resultSet);
    // 释放语句执行者
    closeStatement(statement);
    // 释放连接
    closeConnection(connection);
}

// 方法重载
public static void closeResource(Connection connection, Statement statement) {
    // 释放语句执行者
    closeStatement(statement);
    // 释放连接
    closeConnection(connection);
}

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

private static void closeStatement(Statement statement) {
    if (statement != null) {
        try {
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        statement = null;
    }
}

private static void closeResultSet(ResultSet resultSet) {
    if (resultSet != null) {
        try {
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        resultSet = null; // java垃圾回收  GC
    }
}

}
2.6 JDBC事务安全
通过 Connection 获取事务API

// 开启手动提交事务
public void setAutoCommit(boolean false);
// 回滚事务
public void rollback();
// 提交事务
public void commit();
转账演示

// 获取连接

// 开启事务

// 乃亮扣钱

// 小路加钱

// 提交事务

// 回滚事务

// 释放资源

代码片段

public static void main(String[] args) {

// ctrl + alt +t
Connection connection = null;
Statement statement = null;
try {
    // 获取连接
    connection = JDBCUtils.getConnection();
    // 开启事务
    connection.setAutoCommit(false);
    // 创建语句执行者
    statement = connection.createStatement();
    // 乃亮扣钱
    String sql1 = "update account set balance=balance-100 where id = 1";
    int i1 = statement.executeUpdate(sql1);
    if (i1 > 0) {
        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("小路加钱成功");
    }
    // 提交事务
    connection.commit();

} catch (Exception e) {
    // 回滚事务
    try {
        connection.rollback();
    } catch (SQLException e1) {
        e1.printStackTrace();
    }
    e.printStackTrace();
} finally {
    // 释放资源
    JDBCUtils.closeResource(connection, statement);
}

}
2.7 JDBC实现用户登录
需求

模拟用户登录

需求分析

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

步骤分析

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

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

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

代码实现

// 课下练习 使用 try catch
public static void main(String[] args) throws Exception {

// 在控制台输入用户名和密码 scanner
// 1.1 创建scanner对象
Scanner scanner = new Scanner(System.in);
// 1.2 控制台录入
System.out.println("欢迎来到德莱联盟...");
System.out.println("请输入用户名:");
String username = scanner.nextLine();
System.out.println("请输入密码:");
String password = scanner.nextLine();
// 根据用户名和密码查询数据库 jdbc
// 2.1 获取连接
Connection connection = JDBCUtils.getConnection();
// 2.2 编写sql
//String sql ="select * from user where username = 'admin' and password = '123'";
String sql = "select * from user where username = '" + username + "' and password = '" + password + "'";
System.out.println(sql);
// 2.3 创建语句执行者
Statement statement = connection.createStatement();
// 2.4 执行sql返回结果
ResultSet resultSet = statement.executeQuery(sql);
// 根据返回结果判断用户是否登录成功 if else
// 2.5 处理结果
if (resultSet.next()) {
    String u = resultSet.getString("username");
    System.out.println("登录成功,欢迎:" + u);
} else {
    System.out.println("用户名密码错误....");
}
// 2.7 释放资源
JDBCUtils.closeResource(connection, statement, resultSet);

}

Last modification:July 29th, 2019 at 05:39 pm

Leave a Comment