JDBC作用接口和创建的步骤详细解析

JDBC

1.DCL(介绍)

1.1创建用户:

CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; 关键字说明:
    1. `用户名`:将创建的用户名   

    2. `主机名`:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程 主机登陆,可以使用通配符%   

    3. `密码`:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器

具体的操作:

-- 1.创建用户 identified by 为用户设置密码
-- user1用户只能在localhost这个IP登录mysql服务器
CREATE USER 'user1'@'localhost' IDENTIFIED BY '123'; 
‐‐ user2用户可以在任何电脑上登录mysql服务器 
CREATE USER 'user2'@'%' IDENTIFIED BY '123';

1.2授权用户

授权格式:GRANT 权限1, 权限2... ON 数据库名.表名 TO '用户名'@'主机名'; 关键字说明.

  1. `GRANT` 授权关键字  

  2. 授予用户的权限,如`SELECT`,`INSERT`,`UPDATE`等。如果要授予所的权限则使用`ALL`   

  3. `数据库名.表名`:该用户可以操作哪个数据库的哪些表。如果要授予该用户对所有数据库和表的相应操作权限则 可用*表示,如`*.*`   

  4. `'用户名'@'主机名'`: 给哪个用户授权

具体的操作:

1.1给luliang用户分配对test这个数据库操作的权限

GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON test.* TO 'luliang'@'localhost';

1.2给luliang用户分配对所有的数据库操作的权限。

CRANT ALL ON *.* TO 'luliang'@'localhost';

1.3撤销授权

REVOKE ALL ON test.* FROM 'user1'@'localhost';

具体操作:

撤销luliang用户对test操作的权限。

REVOKE ALL ON test.*FROM 'luliang'@'localhost';

1.4查看权限

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

查看luiang用户的权限

SHOW GREATS FOR 'luliang'@'localhost';

1.5删除用户

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

具体的操作:

DROP USER 'luliang'@'localhost';

1.6修改用户名

修改管理员密码

mysqladmin -uroot -p password 新密码 -- 新密码不需要加上引号

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

具体操作:

mysqlamdin -uroot -p password 123456

输入老密码

1.7修改普通用户密码

set password for 'luliang'@'localhost'=password('666666');

JDBC处理MysSQL中的用户:

JDBC的概念:

JDBC:是有Sun公司提供的一套的规范的(接口),由一推数据。

客户端操作MySQL数据库的方式

1. 使用第三方客户端来访问MySQL:SQLyog、Navicat、SQLWave、MyDB Studio、EMS SQL Manager for MySQL

2. 使用MySQL自带的命令行方式

3. 通过Java来访问MySQL数据库,

什么是JDBCJava Data Base Connectivity (Java数据库连接) JDBC是Java访问数据库的 标准规范

JDBC的作用JDBC是用于执行SQL语句的Java API(Java语言通过JDBC可以操作数据库)

JDBC的由来:

jdbc的好处;

建立与数据库的连接。
向数据库发起查询请求。
处理数据库返回结果。 

JDBC的快速入门:

步骤:

1.注册驱动

2.获取连接

3.创建SQL执行平台

4.执行SQL语句

5.处理结果

6.释放资源

代码演示:

package com.luliang.JDBC;

import org.junit.Test;
import java.sql.*;
public class Demo01 {
    @Test
    public void select() throws Exception {
        //1.注册驱动
        /*
        1. 注册驱动
            任意数据库的类都是java.sql.Driver的实现类,要注册的也是接口的实现类
            记住:MySql的驱动类名是:com.mysql.jdbc.Driver
            如何注册:
                不推荐的方式:DriverManager.registerDriver(new com.mysql.jdbc.Driver());有问题:
                    注册了2次
                    硬编码问题
                推荐的方式:Class.forName("com.mysql.jdbc.Driver"); 把指定名称的类加载到JVM内存中
                    本质是使用了反射技术
         */
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        /*
         2.获取连接
            连接对象:java.sql.Connection
            如何获取连接对象:
                DriverManager.getConnection(url, username, password)
                    url:数据库连接地址。JDBC规定了url的写法 由三部分组成,三部分之间使用英文冒号连接
                        第一部分:协议名,固定值jdbc
                        第二部分:子协议,通常是数据库的类型,比如:MySql的写法是mysql
                        第三部分:数据库的具体地址,由数据库厂商自行决定的,不同数据库的写法不同。MySql的写法:
                            //数据库的ip:数据库的端口/database的名称 比如://192.168.18.18:3306/heima63
                            连接本机、默认端口的MySql,可以简写成:///heima63
                    username:数据库的登录名
                    password:数据库的密码
         */
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/lu", "root", "root");
        //3.创建SQL执行平台
        /*
        3.创建SQL执行平台
            SQL执行平台:是JDBC规范提供了,专门用来执行SQL语句的一个对象 java.sql.Statement
            获取的方式:connection.createStatement()
         */
        Statement statement = connection.createStatement();
        //4.执行SQL语句
        /*
        执行SQL语句
            执行DQL语句:statement.executeQuery(sql),返回:ResultSet,查询的结果集
            DQL:查询数据
            1.查询所有的数据:select*from 表明
            2.查询指定的列:select 字段1,字段2,..from 表名;
            3.查询处理null值:select if null (字段,默认值) from 表名;
            4.查询并计算:select 字段1+字段2,.....from 表面;
            执行DML语句:statement.executeUpdate(sql),返回:int,表示影响的行数
            执行任意语句:statement.execute(sql),返回:boolean, 如果执行的是查询,返回true;否则返回false
         */
        ResultSet resultSet = statement.executeQuery("SELECT *FROM emp ");
        //int resultSet = statement.executeUpdate("INSERT INTO student4(id,name,price) VALUES (NULL ,'luliang2',1000000)"); //返回值为:
        //5.处理结果
        while (resultSet.next()){
            String name = resultSet.getString("name");
            String gender = resultSet.getString("gender");
            double salary = resultSet.getDouble("salary");
            Date join_date = resultSet.getDate("join_date");
            int dept_id = resultSet.getInt("dept_id");
            System.out.println("姓名:"+name+", 工资:"+salary+", 年龄:"+join_date+", 学号:"+dept_id+",性别:"+gender);
        }
        //System.out.println("影响行数:" + resultSet);
        //6.释放资源
        //释放资源。顺序:ResultSet=>Statement=>Connection
        resultSet.close();
        statement.close();
        connection.close();
    }
}

next用法:

JDBC常用的API

Connection接口:

package com.luliang.lianxi;

import com.luliang.JDBCbao.JdbcUtils;
import com.luliang.JDBCbao.JdbcUtils1;

import java.sql.Connection;
import java.sql.Statement;

/*
面试题: 什么时候,需要把 setAtuoCommit设为 false?
答: 当有多个dml 同时执行,将其看做一个整体提交,则使用 事务管理 ,
则需要把 setAutoCommit 设为false;
 */
public class Demo05 {
    public static void main(String[] args) throws Exception{
        //1.加载驱动,获取连接
        Connection connection = JdbcUtils1.getConnection();
        //2.开启事务把事务设置不自动提交
        connection.setAutoCommit(true);//设置这个不自动提交事务就是数据库的数据没有影响
        //3.创建sql对象(Statement / PreparedStatement /CallableStatement)
        Statement statement = connection.createStatement();
        //4.通过statement向数据库发出sql命令
        //对emp表进行操作: 把SMITH 的sal -10 给 KING sal+10
        int i = statement.executeUpdate("UPDATE emp SET salary=salary+10000 WHERE NAME ='孙悟空'");
        System.out.println("影响的行数:"+i);
        //5.关闭资源
         statement.close();
         connection.close();
    }
}

当有多个dml 同时执行,将其看做一个整体提交,则使用 事务管理 ,则需要把 setAutoCommit 设为false;

Statement接口和PreparedStatement的区别

后者的效率比前者高,在使用PreparedStatement对象执行SQL命令时,命令被数据库进行编译和解析,然后被放到命令缓冲区,然后,每当执行同一个PreparedStatement对象时,它就会被解析一次,但不会被再次编译。在缓冲区中可以返现预编译的命令,并且可以重新使用。如果insert、update、delete ,最好使用PreparedStatement,在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。

ResuilSet接口:

说明:在默认的情况下,我们的rs结果集,只能向前移动,这样rs结果就不能复用,如果希望复用,则可以这样做:

package com.luliang.lianxi;

import com.luliang.JDBCbao.JdbcUtils1;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

/*
ResultSet 的可选项有:
resultSetType - 结果集类型,
它是 ResultSet.TYPE_FORWARD_ONLY、
ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE 之一
resultSetConcurrency - 并发类型;
它是 ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE 之一
 */
public class Demo07 {
    public static void main(String[] args) throws Exception{
    //查询
        //1.注册驱动,获取连接
        Connection connection = JdbcUtils1.getConnection();
        //2,创建SQL执行平台
        Statement statement = connection.createStatement();
        //执行SQL语句
        //假设我们希望resultSet结果,可以滚动(可以向前,也可以向后)
        ResultSet resultSet = statement.executeQuery("SELECT *FROM emp");
        while (resultSet.next()){
            System.out.println(resultSet.getString("name"));
        }
        System.out.println("---------------");
        resultSet.beforeFirst();
        while (resultSet.next()){
            System.out.println(resultSet.getString("name"));
        }
    }
}

JDBC的增删改查:

增:代码演示

package com.luliang.lianxi;

import com.luliang.JDBCbao.JdbcUtils;
import com.luliang.JDBCbao.JdbcUtils1;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
//插入
public class Demo02 {
    public static void main(String[] args) {
        Connection connertion = null;
        try {
            connertion = JdbcUtils1.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //创建SQL执行的平台
        Statement statement = null;
        try {
            statement = connertion.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //执行SQL语句
        //执行DML语句:statement.executeUpdate(sql),返回值:int,表示影响的行数
        try {
            int i = statement.executeUpdate("INSERT INTO product1(id,pname,price)VALUES (null,'陆良1',100000.00)");
            System.out.println("处理结果:"+i);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            connertion.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

删:代码演示

package com.luliang.lianxi;

import com.luliang.JDBCbao.JdbcUtils;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

//删除
public class Demo04 {
    public static void main(String[] args) {
        Connection connertion = JdbcUtils.getConnertion();
        //创建SQL执行平台
        Statement statement=null;
        try {
           statement = connertion.createStatement();
           //执行SQL语句
            // 执行DML语句:statement.executeUpdate(sql),返回值:int,表示影响的行数
            int i = statement.executeUpdate("DELETE FROM product1 WHERE id=5");
            //处理SQL语句
            System.out.println("执行后的结果:"+i);
            //关闭资源流
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                connertion.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

改:代码演示

package com.luliang.lianxi;

import com.luliang.JDBCbao.JdbcUtils;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

//修改
public class Demo03 {
    public static void main(String[] args) {
        Connection connertion = JdbcUtils.getConnertion();
        Statement statement = null;
        //创建SQL平台
        try {
             statement = connertion.createStatement();
            //执行SQL语句
            int i = statement.executeUpdate("UPDATE product1 SET price=price+10000 WHERE id=1 ");
            System.out.println("执行影响后的:"+i);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                connertion.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

查:

package com.luliang.lianxi;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

//查询
public class Demo01 {
    public static void main(String[] args) throws Exception{
        //注册驱动
         Class.forName("com.mysql.jdbc.Driver");
        //获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee","root","root");
        //创建SQL执行平台
        Statement statement = connection.createStatement();
        //执行SQL语句
        //执行DQL语句:statement.executeQuery(sql),返回值:ResultSet,是查询的结果集对象
        ResultSet resultSet = statement.executeQuery("SELECT *FROM  employee");
        //处理结果
        while (resultSet.next()){
            System.out.println("id:"+resultSet.getInt("id")+
            ",姓名:"+resultSet.getString("name")+", 密码:"+resultSet.getString("PASSWORD")
            );
        }
        //释放资源
          resultSet.close();
          statement.close();
          connection.close();
    }
}

JDBC的工具类封装:

==JDBC的事务管理==

 事务管理相关的API

 事务管理的方法,都是由Connection对象提供的:

  • 开启事务:connection.setAutoCommit(false)

  • 提交事务:connection.commit()

  • 回滚事务:connection.rollback()

事务管理的步骤:

try{
    //1.注册驱动
    //2.获取连接
    //===开启事务=== 只要在执行SQL之前开启即可
    //3.创建SQL执行平台
    //4.执行SQL语句
    //5.处理结果
    //===关闭事务:提交事务=== 只要在释放资源之前,关闭事务即可
}catch(Exception e){
    //===关闭事务:回滚事务===
}finally{
    //6.释放资源
}

JDBC的实现登录案例:

分析:

1.使用数据库保存的用户的账号和密码

2.让用户输入账号和密码

3.使用SQL根据用户的账号和密码去数据库查询数据

4.如果查询到数据,说明登录失败。

代码演示:

package com.luliang.DengLu;
import com.luliang.JDBCbao.JdbcUtils1;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
/*
1. 使用数据库保存用户的账号和密码
2. 让用户输入账号和密码
3. 使用SQL根据用户的账号和密码去数据库查询数据
4. 如果查询到数据,说明登录成功
5. 如果查询不到数据,说明登录失败
 */
public class Demo01 {
    public static void main(String[] args) throws Exception{
        //1.编写代码让用户输入
        Scanner scanner = new Scanner(System.in);
        System.out.println("请你输入用户名:");
        String name = scanner.nextLine();
        System.out.println("请你输入密码:");
        String password=scanner.nextLine();
        //2.使用SQL根据用户的账号和密码去数据库查询数据
        //2.1注册驱动,获取连接
        Connection connection = JdbcUtils1.getConnection();
        //2.2创建SQL执行平台
        Statement statement = connection.createStatement();
        //2.3执行SQL语句
        String resultSet1="SELECT *FROM user WHERE name='"+name+"' AND password='"+password+"'";
        // 如果查询到数据,说明登录成功,如果查询不到数据,说明登录失败
        ResultSet resultSet = statement.executeQuery(resultSet1);
        //判断
        if(resultSet.next()){
            //能进来查询到了数据
            String  pname = resultSet.getString("name");
            System.out.println("欢迎你登陆:"+pname);
        }else {
            //查询不到数据,说明登陆失败
            System.out.println("账号密码错误....");
        }
        //关闭资源流
        resultSet.close();
        statement.close();
        connection.close();
    }
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值