权限&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);
}