数据库-DCL语句及JDBC

1. DCL语句

  • 根据不同项目建立不同的用户,分配不同的权限来管理和维护数据库

1.1 创建用户

- CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

其中:

用户名:创建的用户名;

主机名:指定该用户在哪个主机上可以登录。若本地用户用localhost,若可从任意远程主机登录则可使用通配符%;

密码:该用户的登录密码,可以为空

1.2 授权用户

用户在创建之后基本没有权限,需要授权:

- GRANT 权限1,权限2... ON 数据库名.表名 TO '用户名'@'主机名';

其中:

GRANT:授权关键字;

授予用户的权限:有SELECT(查看), INSERT(插入), UPDATE(修改)等。若授予全部权限使用ALL;

数据库名.表名:用户可操作哪个数据库的哪些表;全部的则用*

'用户名'@'主机名':给哪个用户授权。

1.3 撤销授权

- REVOKE 权限1,权限2... ON 数据库名.表名 TO '用户名'@'主机名';

其中:

GRANT:撤销授权关键字;其余含义与授权一致。

1.4 查看权限

- SHOW GRANTS FOR '用户名'@'主机名';

1.5 删除用户

- DROP USER '用户名'@'主机名';

1.6 修改用户密码

1.6.1 修改管理员密码

需要使用MySQL自带的工具mysqladmin

mysqladmin -uroot -p password 新密码
#回车后输入老密码

注意:需要在未登录MySQL的情况下操作

另外这是在命令行中操作

1.6.2 修改普通用户密码

- set password for '用户名'@'主机名' = password('新密码');

注意:1、需要登录MySQL的情况下操作;2、新密码要用引号括住

另外这是在命令行中操作

2. JDBC的概念及由来

2.1 JDBC概念

  • JDBC(Java数据库连接):是Java访问数据库的标准规范
  • 作用:用于执行SQL语句的Java API(Java语言通过JDBC可操作数据库)

2.2 JDBC由来

JDBC规范定义接口,数据库驱动由数据库厂商提供。
  • 好处

    • 调用JDBC接口中的方法即可
    • 使用同一套Java代码,进行少了修改即可访问其他数据库
  • JDBC会用到的包:java.sql、javax.sql、数据库驱动

  • JDBC四个核心对象

    • DriverManager:用于注册驱动,获得连接
    • Connection:表示与数据库创建的连接
    • Statement:执行SQL语句,并返回相应的结果对象
    • ResultSet:结果集/虚拟表

3. JDBC获取连接

  • 获取连接步骤:1.导入驱动Jar包,2.注册驱动,3.获取连接

3.1 导入驱动包

步骤:

  1. 下载数据库对应驱动jar包;
  2. 在当前模块新建文件夹(lib),复制jar进去
  3. 在IDEA的界面找到该jar包,右键选择add as library,让模块关联jar包(选择model library,但智能在当前jar包中使用)

3.2 注册/加载驱动类

- static void registerDriver(Driver driver);    向Driver driver注册指定驱动程序

两种注册方式:

  • 静态方法注册
DriverManager.registerDriver(new com.mysql.jdbc.Driver());

不足:

1、硬编码,后期不易于程序扩展和维护

2、驱动被注册两次

3、更换驱动类的时候不好更换,需要修改源代码
  • 类加载(推荐使用)
Class.forName("com.mysql.jdbc.Driver");

特点:

1、使用forName()方法加载,走Driver类的静态代码块

2、驱动仅注册一次

3、虽然在JDK1.5后可以省略该语句,但是建议不省略,以防不兼容问题

3.3 获取连接

- static Connection getConnection(String url, String user, String password);    //连接到给定数据库URL并返回连接

其中:

String url:连接数据库的URL,格式为`协议名:自协议://服务器名或IP地址:端口号/数据库名?参数=参数值`,比如`jdbc:mysql://localhost:3306/test`

String user:数据库的账号

String password:数据库的密码

注意:

1、如果数据出现乱码需加上参数?characterEncoding=utf8

2、Connection实现类对象导包时要导sun公司的包

4. JDBC实现对单表数据操作

4.1 JDBC实现对单表数据增删改

4.1.1 使用方法:

java.sql.Connection接口中获得statement对象:

- Statement createStatement();
    创建一个Statement对象来将SQL语句发送到数据库
  • Statement的方法:

    1. 执行增删表的SQL语句的方法:
- boolean execute(String sql);执行任意SQL语句。
    返回值表示是否有返回ResultSet结果集。仅当执行select语句且有返回结果时返回true,其它语句返回false
2. 执行增删改SQL语句的方法:
- int executeUpdate(String sql);
    根据执行的DML(INSERT、UPDATE、DELETE)语句,返回受影响的行数
  1. 关闭资源
- void close(); 关闭并释放资源

4.1.2 疑问与解答

Q:statement对象使用完之后需要关闭,为何?它关闭了什么?

A:因为statement对象会占用数据库连接个数,而该连接数的数量是有限的,需要关闭该对象与数据库的连接,释放该连接数。

4.2 JDBC实现对单表数据查询

  • ResultSet(结果集)用于保存执行查询SQL语句的结果。只能一行行取出,不能一次性取出所有数据。

  • 执行查询SQL语句的方法

- ResultSet executeWQuery(String sql);
    根据查询语句返回结果集,只能执行SELECT语句
  • ResultSet需要使用到的方法:

    - boolean next(); 将结果集的指针从当前位置下移一个单元,如可移动返回true,否则false
    - xxx getXxx(String columnLabel);通过字段名获得对应的数据(columnLabel列名)
    - xxx getXxx(int columnIndex);通过字段序号获得对应的数据(columnIndex列序号)

    其中xxx指数据类型,有boolean、byte、short、long、float、double、String等

注意:ResultSet使用完毕后必须要关流

JDBC对单表数据增删改查步骤

  1. 注册驱动;
  2. 获取连接;
  3. 准备SQL执行语句;
  4. 获取到Statement;
  5. 使用Statement执行SQL;
  6. ResultSet处理结果;
  7. 关闭资源。

4.3 JDBC实现单表操作示例代码

需求:对单表数据增删改及查询操作

public class Notes01 {
    public static void main(String[] args) throws Exception {
        //加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接
        String url = "jdbc:mysql:///test";
        String user = "root";
        String password = "root";
        Connection connection = DriverManager.getConnection(url, user, password);
        //获得sql运输器
        Statement st = connection.createStatement();

        //创建新表的SQL语句
        String sql1 = "create table student(id int primary key,name varchar(10))";
        boolean bo = st.execute(sql1);
        System.out.println("sql1语句执行后返回值=" + bo);

        //对数据库的表添加数据:
        String sql2 = "insert into student(name) values('小明','小黄')";
        int num2 = st.executeUpdate(sql2);
        System.out.println("影响的行数:" + num2);

        //对数据库的表删除数据
        String sql3 = "delete from student where name = '小明'";
        int num3 = st.executeUpdate(sql3);
        System.out.println("影响的行数:" + num3);

        //更新表中的数据
        String sql4 = "update student set name = '小明' where name = '小黄'";
        int num4 = st.executeUpdate(sql4);
        System.out.println("影响的行数:" + num4);

        //查询表中数据并返回
        String sql5 = "select * from student;";
        //获得结果集
        ResultSet rs = st.executeQuery(sql5);
        while (rs.next()) {
            //取出数据
            int id = rs.getInt("id");
            String name = rs.getString("name");
            System.out.println(id + "=" + name);
        }

        //关闭资源,先开后关,后开先关
        rs.close();
        st.close();
        connection.close();
    }
}

4.4 JDBC获取连接与关闭连接工具类实现

  • 可自定义一个工具类,将经常重复的代码(注册驱动、获取连接,得到Statement和释放资源)放在这个类的方法中。然后可直接调用其中方法完成重复代码。
/*
自定义JDBC工具类
 */
public class JDBCUtils {
    /*
    之后会从配置文件读取信息,现在先用常量表示
     */
    public static final String DRIVERCLASS = "com.mysql.jdbc.Driver";

    public static final String URL = "jdbc:mysql:///test";

    public static final String USER = "root";

    public static final String PASSWORD = "root";

    /*
    由于每个人获取连接时都要加载驱动类,但驱动类只要加载一次便可,故使用静态代码块
     */
    static {
        try {
            Class.forName(DRIVERCLASS);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //获取连接
    public static Connection getConnection() {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(URL, USER, PASSWORD);
            return connection;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    //获取Statement
    public static Statement getStatement(Connection connection) {
        Statement statement = null;
        try {
            statement = connection.createStatement();
            return statement;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return statement;
    }

    //释放资源
    public static void close(ResultSet rs , Statement st , Connection con) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

5. JDBC事务

  • Connection接口中与事务有关的方法
- void setAutoCommit(boolean autoCommit) throws SQLException;
    false:开启事务,true:关闭事务
- void commit() throws SQLException;    提交事务
- void rollback() throws SQLException;  回滚事务
  • 操作步骤
    1. 注册驱动;
    2. 获取连接;
    3. 获取到Statement;
    4. 开启事务;
    5. 使用Statement执行SQL;
    6. 提交或回滚事务;
    7. 关闭资源。
public class Notes02 {
    public static void main(String[] args) throws SQLException {
        Connection con = null;
        try {
            //获取连接
            Class.forName("com.mysql.jdbc.Driver");
            con= DriverManager.getConnection("jdbc:mysql:///test","root","root");
            //开启事务
            con.setAutoCommit(false);
            //获得sql运输器
            Statement st = con.createStatement();
            //执行事务
            String sql1 = "update account set money = money+500 where name ='小明';";
            String sql2 = "update account set money = money-500 where name ='小黄';";
            //提交语句
            st.executeUpdate(sql1);
            st.executeUpdate(sql2);
            System.out.println("已成功执行事务");
        } catch (Exception e) {
            System.out.println("事务执行失败");
            con.rollback();
        }

    }
}

猜你喜欢

转载自blog.csdn.net/KeepStruggling/article/details/82143668