学习大数据之JDBC(使用JAVA语句进行SQL操作)

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值