文章目录
- DCL语句
- 创建用户
- 授权用户
- 撤销授权
- 查看权限
- 删除用户
- 修改用户密码
- 修改普通用户密码
- JDBC
- jdbc介绍
- JDBC准备
- JDBC开发步骤以及详解
- JDBC注册驱动
- JDBC获取连接
- JDBC实现增删改操作
- JDBC 工具类的使用
DCL语句
我们现在默认使用的都是root用户,超级管理源,拥有全部权限。但是,一个公司的数据库服务器上面可能同时运行着很多个项目的数据库。所以,我们应该根据不同的项目建立不用的用户,分配不同的权限来管理和维护数据库。
创建用户
CREATE USER ‘用户名’ @ ‘主机名’ IDENTIFIED BY ‘密码’;
关键字说明
1.用户名:创建的用户名
2.主机名:指定改用户再哪个主机上可以登录,如果是本地用户可用用’localhost’,如果是想让该用户可以任意远程登陆主机,可以使用通配符%
3.密码:该用户登录的密码,密码可以为空,改用户可以不输入密码就可以登录mysql
注意:创建用户是 可能会报错误
[Err] 1819 - Your password does not satisfy the current policy requirements
原因分析 你的密码不符合当前策略要求
输入代码查看当前数据库新建密码谣言策略,命令
SHOW VARIABLES LIKE 'validate_password%'
主要关注 vaildate_password_length 为8
vaildate_password_policy 密码强度
validate_password_policy 为密码强度检测
0 or LOW Length
1 or MEDIUM Length; numeric, lowercase/uppercase, and special characters
2 or STRONG Length; numeric, lowercase/uppercase, and special characters; dictionary file
默认是1,即MEDIUM,设置的密码必须符合长度,且必须含有数字,小写或大写字母,特殊字符。
我们设置
密码检测强度为0
set global validate_password_policy=0;
具体操作
user1用户只能再localhost这个IP登录mysql服务器
CREATE USER ‘user1’ @ ‘localhost’ IDENTIFIED BY ‘12345678’;
user2用户可以在任何电脑上登录mysql服务器
CREATE USER ‘user2’ @ ‘%’ IDENTIFIED BY ‘12345678’;
授权用户
用户创建之后,基本没什么权限!需要给用户授权
授权格式:
GRANT 权限1,权限2. … ON 数据库名.表名 TO ‘用户名’ @ ‘主机名’
关键字说明
a.GRANT: 授权关键字
b.授予用户的权限:比如 ‘select’ ‘insert’ ‘update’等,如果要授予所有的权限,使用ALL
c.数据库名.表名: 该用户操作哪个数据库的哪些表,如果要授予该用户对所有数据库和表的相关操作权限,就可以用*表示
d.‘用户名’ @ ‘主机名’ :给那个用户分配权限
具体操作
1、给user1用户分配对test这个数据库的操作权限
GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON bigdata.* TO 'user1'@'localhost';
如果报错,可以查看自己的root用户是否有权限,如果没有权限,需要手动增加权限
#数据库中有一张user表记录所有用户,以下命令就是查看所有用户及其访问权限
SELECT user,host FROM mysql.user;
#查询用户权限表
SELECT host,user,Grant_priv,Super_priv FROM mysql.user;
可以看到我们的root用户,拥有其相应的权限
2.给user2用户分配对所有数据库操作的权限
GRANT ALL ON *.* TO 'user2'@'%';
撤销授权
REVOKE 权限1,权限2 … ON 数据库.表名 FROM ‘用户名’ @ ‘主机名’
具体操作
撤销user1用户对数据库bigdata操作的权限
REVOKE ALL ON bigdata.* FROM 'user1'@'localhost';
查看权限
SHOW GRANTS FOR ‘用户名’@‘l主机名’;
具体操作 查看user1用户的权限
## 查看权限
SHOW GRANTS FOR 'user1'@'localhost';
删除用户
DROP USER ‘用户名’@‘l主机名’;
删除USER2
DROP USER 'user2'@'%';
1.创建新用户->分配一个用户名和密码进行mysql登录
CREATE USER ‘用户名’@‘主机名’ IDENTIFIED BY ‘密码’;
a.用户名:创建的用户名
b.主机名:指定该用户在哪个主机上可以登录,如果是本地用户,可以用’localhost’,
如果想让该用户可以任意远程主机登录,可以使用通配符%
c.密码:该用户登录的密码,密码可以为空,如果为空,该用户可以不输入密码就可以登录mysql
– user1用户只能在localhost这个IP登录mysql服务器
CREATE USER ‘user1’@‘localhost’ IDENTIFIED BY ‘123’;
– user2用户可以在任何电脑上登录mysql服务器
CREATE USER ‘user2’@‘%’ IDENTIFIED BY ‘123’;
2.给新分配的用户分配权限->让用户能操作哪些库,以及对数据可以进行哪些操作
GRANT 权限1, 权限2… ON 数据库名.表名 TO ‘用户名’@‘主机名’;
a.GRANT:授权关键字
b.授予用户的权限,比如 ‘select’ ‘insert’ 'update’等,如果要授予所有的权限,使用 ‘ALL’
c.数据库名.表名:该用户操作哪个数据库的哪些表,如果要授予该用户对所有数据库和表的相关操作权限,就可以用表示: .
d.‘用户名’@‘主机名’:给哪个用户分配权限
– 给用户1分配权限
GRANT SELECT ON 220706_mysql03
. TO ‘user1’@‘localhost’;
– 给用户2分配权限
GRANT ALL ON . TO ‘user2’@‘%’;
3.删除用户
DROP USER ‘用户名’@‘主机名’;
用户名和主机名要和创建时的保持一致
修改用户密码
mysqladmin -u root - p password 新密码 – 新密码不需要加上引号
注意:需要在未登录mysql的情况下操作
具体操作
mysqladmin -u root - p password root
输入 老密码
修改普通用户密码
set password for ‘用户名’@‘主机名’ = password(‘新密码’);
注意:需要在登录MySQL的情况下操作
具体操作
SET password for 'user1'@'localhost' = password('66666666');
JDBC
jdbc介绍
1.问题描述:
如果开发一个功能,我们不可能直接在mysql工具中写sql语句,我们需要将sql语句写道逻辑代码中,利用APU让sql语句执行起来,从而操作数据库中的数据,我们可以利用java代码中的API ----- JDBC
2.JDBC:是一套操作数据库的API,是一种标准
JDBC准备
1.导jar包:
mysql-connector-java-8.0.25.jar
2.4大核心对象
a.DriverManager 类:注册驱动 ---- 指明操作的是哪个数据库
b.Connection接口:连接数据库 — 数据库密码,账号,指明操作哪个库
c.Satement接口:执行平台,用于执行sql语句
d.ResultSet接口:用于处理数据集
针对于增删改操作,不用处理结果集
针对于查询操作,需要处理结果集
JDBC开发步骤以及详解
1.注册驱动:指明操作的是哪款数据库
DriverManager类
2.获取连接:要连接数据库
a.Connection接口
b.获取:DriverManager中的静态方法
static Connection getConnection(String url, String user, String password)
3.准备sql语句:
写sql语句,写在String中
4.获取执行平台:执行sql语句
a.Statement接口
b.获取:Connection中的方法
Statement createStatement()
5.执行sql:
a.执行 Statement接口中的方法
int executeUpdate(String sql) — 针对于增删改sql操作的
ResultSet executeQuery(String sql) ---- 针对于查询操作的
6.处理结果集:ResultSet接口
a.方法:
boolean next() ---- 判断结果集中有没有下一个结果
getxxx()------ 获取结果集中的数据
7.关闭资源:
close()
结果集需要关闭:ResultSet
执行平台需要关闭:Statement
连接对象需要关闭:Connection
JDBC注册驱动
CREATE TABLE `user`(
uid INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10),
`password` VARCHAR(20)
);
1.类:DriverManager类
2.方法:
static void registerDriver(Driver driver)
3.参数:Driver是一个接口,所以需要传递实现类
com.mysql.cj.jdbc.Driver
4.使用
DriverManager.registerDriver(new Driver());
5.小问题
a.我们使用的是DriverManager.registerDriver注册驱动
b.当我们进入到 com,mysql.cj.jdbc.Driver类中看源码,我们会发现一个问题:
Driver类中有一个静态代码块,在静态代码块中也写一个:
DriverManager.registerDriver(new Driver());
c.所以,如果我们要使用DriverManger,regiseterDriver(new Driver()) 注册驱动,挥着注册两次
d.问题解决:
我们只需要让Driver类中记载到内存,其中的静态代码块会自动执行
可以使用反射:Class.forName(“com.mysql.cj.jdbc.Driver”)
注册驱动:
Class.forName(“com.mysql.cj.jdbc.Driver”);
public class test02 {
public static void main(String[] args) throws ClassNotFoundException {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
}
}
JDBC获取连接
1.获取:DriverManager中的静态方法:
Connection getConnection(String url,String username,String password)
2.参数说明
url:数据库连接地址
a.jdbc:mysql://localhost:3306/数据库名称?参数&参数
b.此参数是一个请求参数:
?前面的叫做请求路径
?后米娜的叫做请求路径上携带的参数数据
服务器主机地址:端口号/部署时写的项目名/请求资源?请求参数&请求参数
c.请求参数:
key = value形式
username:mysql用户名
password:MySQL密码
public class test03 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接,连接数据库
String url = "jdbc:mysql://192.168.10.100:3306/bigdata";
String username = "root";
String password = "12345678";
final Connection connection = DriverManager.getConnection(url, username, password);
System.out.println("connection = " + connection);
}
}
JDBC实现增删改操作
代码实例
package JDBC_EXC;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class test03 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接,连接数据库,注意需要指定插入的数据使用什么数据集,否则会出现乱码??
String url = "jdbc:mysql://192.168.10.100:3306/bigdata?useUnicode=true&characterEncoding=utf8";
String username = "root";
String password = "12345678";
final Connection connection = DriverManager.getConnection(url, username, password);
//System.out.println("connection = " + connection);
//准备sql语句
//插入数据
String sql_in = "INSERT INTO `user` VALUES(010,'大勇','6666');";
//删除数据
String sql_del = "DELETE FROM `user` WHERE uid = 2;";
//修改数据
String sql_update = "UPDATE `user` SET username = \"丁伟\" WHERE uid = 4;";
//获取执行平台
final Statement st = connection.createStatement();
//执行sql语句:statement中的方法
/*int executeUpdate(sql) --- 针对增删改操作
* ResultSet executQuer(sql) 针对查询操作
* */
st.executeUpdate(sql_in);
st.executeUpdate(sql_del);
st.executeUpdate(sql_update);
//处理结果集 ---- 操作为增删改时候,不用操作,此步略过
//关闭资源
st.close();
connection.close();
}
}
实现查询操作的代码实例
package JDBC_EXC;
import java.sql.*;
public class test04 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//引入驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接,连接数据库,注意需要指定插入的数据使用什么数据集,否则会出现乱码??
String url = "jdbc:mysql://192.168.10.100:3306/bigdata?useUnicode=true&characterEncoding=utf8";
String username = "root";
String password = "12345678";
final Connection connection = DriverManager.getConnection(url, username, password);
//System.out.println("connection = " + connection);
//准备sql语句
//插入数据
String sql = "select * from `user`;";
//获取执行平台
final Statement st = connection.createStatement();
//执行sql语句:statement中的方法
/*int executeUpdate(sql) --- 针对增删改操作
* ResultSet executQuer(sql) 针对查询操作
* */
final ResultSet resultSet = st.executeQuery(sql);
//处理结果集 ---- 操作为增删改时候,不用操作,此步略过
while(resultSet.next()){
final Object uid = resultSet.getObject("uid");
final Object username1 = resultSet.getObject("username");
final Object password1 = resultSet.getObject("password");
System.out.println(uid+"....."+username1+"...."+password);
}
//关闭资源
st.close();
connection.close();
}
}
JDBC 工具类的使用
自定义工具类代码块
import java.sql.*;
public class JDBCUtils {
private static String url = null;
private static String username = null;
private static String password = null;
/*
* 注册驱动,数据库url,用户名,密码
* 这四大参数应该上来就先初始化
* 而且只需要初始化一次即可
* 所以我们应该放到静态代码中
* */
static {
try {
//注册驱动,数据库url,用户名,密码
//这四大参数应该上来就初始化
//而且只需要初始话一次即可
//所以需要放在静态代码块中
Class.forName("com.mysql.cj.jdbc.Driver");
username = "root";
password = "12345678";
url = "jdbc:mysql://192.168.10.100:3306/bigdata?useUnicode=true&characterEncoding=utf8";
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConn(){
Connection conn = null;
try {
conn = DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//关闭资源
public static void close(Connection conn, Statement st, ResultSet rs){
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
进行测试,注意使用@Test前,需要先导包
import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo02JDBC {
@Test
public void insert() throws SQLException {
/*
* 获取连接 由于连接方法在工具类中是静态的,我们调用静态成员,所在的类会自动加载
* 静态代码块也就会自动执行
* */
final Connection conn = JDBCUtils.getConn();
//获取执行平台
final Statement statement = conn.createStatement();
//执行sql
statement.executeUpdate("insert into user values(null,'楚云飞','8888');");
//关闭资源
JDBCUtils.close(conn,statement,null);
}
}
public void select() throws SQLException {
/*
* 获取连接 由于连接方法在工具类中是静态的,我们调用静态成员,所在的类会自动加载
* 静态代码块也就会自动执行
* */
final Connection conn = JDBCUtils.getConn();
//获取执行平台
final Statement statement = conn.createStatement();
//执行sql
final ResultSet resultSet = statement.executeQuery("select * from `user`;");
//处理结果集
while (resultSet.next()){
final Object uid = resultSet.getObject("uid");
final Object username = resultSet.getObject("username");
final Object password = resultSet.getObject("password");
System.out.println(uid+"....."+username+"....."+password);
}
//关闭资源
JDBCUtils.close(conn,statement,resultSet);
}
}