JDBC-1

学习目标

  1. 能够理解JDBC的概念

  2. 能够使用Connection接口

  3. 能够使用Statement接口

  4. 能够使用ResultSet接口

  5. 能够使用JDBC实现对单表数据增、删、改、查

  6. 能够使用JDBC操作事务

  7. 能够编写JDBC工具类

  8. 能够完成JDBC实现登录案例

02.JDBC:介绍【理解】

引入

为什么学习JDBC?

jdbc就是使用java代码操作数据库

用户是浏览器访问的web服务器(web后端–java代码),java代码操作永久的数据与数据库打交道

目标

  1. 理解JDBC的介绍
  2. 理解JDBC的作用

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

mysql数据库服务器有哪些:

1、dos命令行客户端访问数据库

2、sqlYog图形界面客户端访问数据库

3、java代码客户端访问数据库服务器【重要】

java代码会将sql命令给到数据库去操作,sql命令不变的

JDBC介绍

Java Data Base Connectivity , java数据库连接技术。jdbc是一套接口规范,运行开发人员根据接口规范连接访问操作不同的数据库。

java的接口: public interface 接口名字{ //定义抽象方法 } 抽象方法由实现类去实现

JDBC的作用

就是java操作数据库的技术

JDBC的由来

  1. 古老的做法:java程序与数据库进行通信编程操作数据库的数据

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ibI9OTe7-1606227564242)(/image-20200517211306124.png)]

    缺点

    1、java程序要写很复杂的通信代码与数据库进行交互

    2、java程序要写不同的几套代码分别操作不同的数据库,操作一个数据库就要有一套不同的代码,非常麻烦

    3、数据库是别人的,如果数据库经常升级,那么java程序也要升级,维护成本相当高

  2. 现代做法:java使用jdbc(一套接口)操作数据库
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s9kz9Cfq-1606227564244)(/image-20200518014306809.png)]

    操作过程

    1、java提供了一套接口JDBC用于操作不同的数据库,JDBC接口的实现类是由数据库厂商提供,这些事项类有个专业名字数据库驱动,不同的数据库,有不同的驱动;

    2、开发人员操作JDBC接口即可就访问操作了不同的数据库,所有通信的底层都有数据库厂商实现。

JDBC的好处

1、使用一套接口可以操作不同的数据库,使用非常简单,不用关系底层网络编程通信

2、切换数据库非常方便,只需要修改很少的内容就可以完成数据库切换,比如:mysql数据库切换为oracle

小结

  1. 说出JDBC的概念?

    Java Data Base Connectivity java数据库连接技术

  2. 说出JDBC的作用?

    就是使用java代码客户端操作不同的数据库

03.JDBC:操作数据库步骤【理解】

目标

1、理解jdbc操作数据库步骤

2、能够理解JDBC四个核心接口

讲解

JDBC会用到的包

1、jdk包(提供JDBC接口)

java.sql包: jdk普通包, 比如使用其中的接口java.sql.Connection,数据库连接接口

javax.sql包 : jdk的扩展包, 比如使用其中的接口javax.sql.DataSource, 数据库连接池

2、数据库驱动包(实现JDBC接口的实现类)

各个数据库厂商提供,比如我们操作mysql数据库,就需要导入mysql的数据库驱动包

JDBC访问数据库的步骤

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7T9qlB59-1606227564246)(/image-20200518095144310.png)]

小结

jdbc操作数据库步骤?

1、导入mysql数据库驱动包

2、注册mysql数据库驱动(DriverManager)

3、使用驱动获取数据库连接(Connection)

4、使用数据库连接创建运输器(Statement)

5、使用运输器发送sql并获取返回的结果(ResultSet)

04.JDBC:注册mysql驱动【理解】

目标

能够导入mysql驱动Jar包

能够通过JDBC注册数据库驱动

为什么注册mysql驱动?

因为mysql驱动包有JDBC接口的实现类

导入mysql驱动包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-humeKNLq-1606227564248)(/image-20200518101045494.png)]

注册驱动代码

package _01_注册数据库驱动;

import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * @author 黑马程序员
 */
public class Demo1 {

    public static void main(String[] args) throws SQLException, ClassNotFoundException {

        /*
        * 目标:注册mysql数据库驱动
        * 注册数据库驱动语法:
        *   DriverManager.registerDriver(Driver driver);
        *   说明:Driver,英文“驱动”
        * mysql驱动类:com.mysql.jdbc.Driver
        * */

        //注册驱动
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());

        //认识com.mysql.jdbc.Driver的源码
        //源码分析结论:Driver类里面的静态代码块已经将驱动注册了

        //疑问:DriverManager.registerDriver(new com.mysql.jdbc.Driver());注册了几次驱动?
        //答:2次
        //new com.mysql.jdbc.Driver(): 内部注册了第一次驱动
        //DriverManager.registerDriver(上面的驱动对象):注册了第二次驱动

        /*
        * 注册驱动一次的方式:
        * 方式1:直接new对象,new com.mysql.jdbc.Driver()
        * 方式2:反射方式,Class.forName("com.mysql.jdbc.Driver"); 创建指定类的字节码对象Class
        *        说明:反射方式创建Class字节码对象的时候,就会运行Drive类里面的静态代码块,实现注册驱动
        *
        * 推荐:使用方式2反射方式注册驱动
        *       以后企业中的项目会连接不同的数据库,会将不同的数据库驱动类配置在配置文件中
        *       我们需要读取配置文件中的驱动类全名:"com.mysql.jdbc.Driver"给到java代码去注册驱动
        *       好处:便于切换数据库
        * */

        //验证创建Person类的字节码对象会不会运行里面的静态代码块
        //Class.forName("_01_注册数据库驱动.Person");
        //结论:会运行静态代码块

    }

}
class Person{
    static{
        System.out.println("运行了Person的静态代码块");
    }
}

运行效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZlVPJ8mq-1606227564251)(/image-20200518102634949.png)]

小结

  1. 为什么要导入数据库厂商的mysql驱动Jar包?

因为mysql驱动包实现了JDBC的接口

  1. JDBC注册数据库驱动代码推荐实现方式?

    Class.forName("com.jdbc.mysql.Driver");
    

05.JDBC:获取数据库连接【应用】

目标

能够通过JDBC获取数据库连接

为什么获取数据库连接

因为通过连接操作数据库

创建day23数据库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GgSHX2wT-1606227564252)(/image-20200518104935158.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RgwHXnA6-1606227564253)(/image-20200518104959732.png)]

目的是:通过jdbc连接这个数据库day23

获取数据库连接代码

package _02_获取数据库连接;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * @author 黑马程序员
 */
public class Demo2 {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {


        /*
        * 目标:使用JDBC接口获取数据库连接对象并打印出来
        * */

        //1、注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        //2、获取数据库连接
        // 获取连接的语法:
        //      Connection DriverManager.getConnection(String url,String user,String password);
        // 含义:根据连接数据库的连接字符串、用户名和密码获取一个mysql的数据库连接对象
        // 参数介绍:
        //  第一个参数:url
        //      url作用:用于设置数据库服务器连接字符串
        //      url格式:jdbc:mysql://主机名:端口号/数据库名?name1=value1&name2=value2...
        //               jdbc介绍:连接的主协议,连接任何数据库主协议固定值
        //               mysql介绍:连接的子协议,不同的数据库不一样,这里代表连接mysql数据库服务器
        //               主机名介绍:mysql数据库服务器的地址,本机是localhost,其他远程写ip就可以
        //               端口号介绍:3306,设置mysql数据库的端口号,不同数据库不一样
        //               数据库名介绍:指定要连接的具体数据库,例如:day23
        //               ?后面传递参数介绍:get方式传递请求参数数据
        //                      常用请求参数:characterEncoding=utf8
        //                      这个参数含义:设置客户端发送数据字符的码表
        //               完整格式:
        //                      jdbc:mysql://localhost:3306/day23?characterEncoding=utf8
        //               简写格式(如果是本机数据库服务器,简写方式):
        //                      jdbc:mysql:///day23?characterEncoding=utf8
        //  第二个参数:user, 用于设置数据库账号名,这里使用"root"
        //  第三个参数:password, 用于设置数据库账号的密码,这里使用"root"

        //代码
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql:///day23?characterEncoding=utf8",
                "root",
                "root"
        );

        System.out.println(connection);

        //注意:每个信息都不能错,否则会发生异常,比如密码写错了,就会发生如图效果
    }
}

效果

1.连接成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mBTtCNV2-1606227564254)(/image-20200518105610705.png)]
2.连接失败
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gB53DWFX-1606227564255)(/jdbc15.png)]

小结

  1. JDBC获取数据库连接使用哪个API?

    DriverManager.getConnection(url,user,password)
    
  2. 访问本机数据库连接字符串URL推荐写法?

    jdbc:mysql:///数据库名?characterEncoding=utf8
    

06.JDBC:增加-删除-修改操作【应用】

目标

通过JDBC实现对数据增、删、改

案例效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pC160ue3-1606227564256)(/image-20200518113207769.png)]

1、插入数据:手机

2、修改cid=2的类别名称为“化妆品”

3、将cid=1的数据删除

准备数据

-- 创建分类表
CREATE TABLE category (
  cid INT PRIMARY KEY AUTO_INCREMENT,
  cname VARCHAR(100)
);
-- 初始化数据
INSERT INTO category (cname) VALUES('家电');
INSERT INTO category (cname) VALUES('服饰');
INSERT INTO category (cname) VALUES('化妆品');

案例代码

package _03_使用Statement进行增删改数据;

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

/**
 * @author 黑马程序员
 */
public class Demo3 {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        /*
         目标:使用Statement操作增、删、改
        *   1、插入数据:手机
            2、修改cid=2的类别名称为“化妆品”
            3、将cid=1的数据删除
        * */

        //1、注册数据库驱动
        Class.forName("com.mysql.jdbc.Driver");

        //2、获取数据库连接
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql:///day23?characterEncoding=utf8",
                "root",
                "root"
        );

        //3、根据连接创建运输器Statement
        //创建语法:Statement connection.createStatement();
        Statement stmt = connection.createStatement();

        //4、发送sql命令给数据库服务器去执行
        /*
        * Statement接口的方法1【推荐】:
        *       int executeUpdate(String sql);
        *       含义:发送DML(增、删、改)命令的sql语句给数据库去执行并返回影响的行数int
        * Statement接口的方法2【推荐】:
        *       ResultSet executeQuery(String sql);
        *       含义:发送DQL(查询)命令的sql语句给数据库去执行并返回数据集ResultSet对象
        * Statement接口的方法3【了解】:
        *       boolean execute(String sql);
        *       含义:发送DQL(查询)/DML(增、删、改)命令的sql语句给数据库去执行并返回boolean数据
        *       返回true: 代表执行的是DQL语句, 里面会判断是否有ResultSet返回,有就会返回true
        *       返回false: 代表执行的是DML语句
        * */

        //命令1:插入数据:手机
        String sql1 = "insert into category(cname) values('手机')";
        int count = stmt.executeUpdate(sql1);
        System.out.println("插入影响的行数:"+count);

        //命令2:修改cid=2的类别名称为“化妆品”
        String sql2="update category set cname='化妆品' where cid=2;";
        //说明:在java代码中写sql语句命令结尾的分号,可有可无,推荐不用写
        count = stmt.executeUpdate(sql2);
        System.out.println("修改影响的行数:"+count);

        //命令3:将cid=1的数据删除
        String sql3 = "delete from category where cid=1";
        count = stmt.executeUpdate(sql3);
        System.out.println("删除影响的行数:"+count);

        //5、释放资源
        //分析:connection是连接资源需要释放,Statement是运输器也是资源需要释放
        stmt.close();
        connection.close();

    }
}

小结

  1. 如何获取执行数据操作命令的对象Statement?

    connection.createStatement();
    
  2. 执行增删改的sql语句命令的方法?

int stmt.executeUpdate(sql语句);

07.JDBC:查询数据【应用】

目标

能够掌握JDBC实现对数据查询

案例效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B0o6A6pe-1606227564257)(/image-20200518120448342.png)]

查询过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P4TavP6i-1606227564258)(/1554738711124.png)]

ResultSet的原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AX3egUt6-1606227564259)(/image-20200518115746964.png)]

ResultSet获取数据的API

其实ResultSet获取数据的API是有规律的get后面加数据类型。我们统称getXXX()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NWPaHMK4-1606227564260)(/jdbc19.png)]

使用JDBC执行查询数据的步骤

  1. 注册驱动
  2. 获取连接
  3. Statement执行sql命令
  4. 释放资源

实现代码

package _04_使用Statement进行查询数据;

import java.sql.*;

/**
 * @author 黑马程序员
 */
public class Demo4 {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        /*
         目标:使用Statement操作查询分类表所有数据
        * */

        //1、注册数据库驱动
        Class.forName("com.mysql.jdbc.Driver");

        //2、获取数据库连接
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql:///day23?characterEncoding=utf8",
                "root",
                "root"
        );

        //3、根据连接创建运输器Statement
        Statement stmt = connection.createStatement();

        //4、发送查询sql命令给数据库服务器去执行
        /*
        * Statement接口的查询方法:
        *       ResultSet executeQuery(String sql);
        *       含义:发送DQL(查询)命令的sql语句给数据库去执行并返回数据集ResultSet对象
        * */
        String sql = "select * from category";
        ResultSet rs = stmt.executeQuery(sql);
        //解析ResultSet获取里面的数据
        while(rs.next()){
            //读取cid,根据位置获取
            int cid = rs.getInt(1);//位置从1开始
            //读取cname,根据字段名获取
            String cname = rs.getString("cname");
            //打印
            System.out.println(cid+"===》"+cname);
        }

        //5、释放资源
        //分析:connection需要释放,statement需要释放,resultSet是游标指针是一条一条从数据库获取需要释放资源
        rs.close();
        stmt.close();
        connection.close();

    }
}

注意:

  1. 如果光标在第一行之前,使用rs.getXXX()获取列值,报错:Before start of result set
  2. 如果光标在最后一行之后,使用rs.getXXX()获取列值,报错:After end of result set

小结

  • jdbc执行查询命令的方法?

    ResultSet stmt.executeQuery(sql);
    
  • 获取查询返回结果集类与如何读取及结果集数据?

    while(rs.next){
        rs.getXxxx(位置)/rs.getXxxx(字段名)   位置从1开始
    }
    

08.BUG:经验分享【应用】

Bug1:没有导入驱动包的异常

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UtfoylOo-1606227564261)(/image-20200518141139978.png)]

运行程序就会报错

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UyaqTavo-1606227564262)(/image-20200518141314362.png)]

如何解决?

答:将mysql驱动包导入即可

为什么编译时不会发生错误?

答:编译时idea语法检查都是检查JDBC接口类型,由于已导入jdk包所以不会报错,但是运行程序的时候需要

JDBC接口实现类数据库驱动包,由于没有导入所以运行时是报错的

Bug2:执行增删改的错误使用

描述

初学者就会executeUpdate与executeQuery使用时混淆,执行增删改时使用了executeQuery

代码操作与异常信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xaej3Q9P-1606227564263)(/image-20200518141926290.png)]

如何解决

查询使用:executeQuery();

增删改使用:executeUpdate();

不能混淆

09.JDBC:手动事务【应用】

目标

能够掌握JDBC操作事务

讲解

之前我们是使用MySQL的命令来操作事务。接下来我们使用JDBC来操作银行转账的事务。

准备数据
CREATE TABLE account (
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(10),
	balance DOUBLE
);
-- 添加数据
INSERT INTO account (NAME, balance) VALUES ('张三', 1000), ('李四', 1000);
API介绍

Connection接口中与事务有关的方法

  1. void setAutoCommit(boolean autoCommit) throws SQLException;
    //autoCommit取值,false:不自动提交事务, ture:自动提交事务
    
  2. void commit() throws SQLException;
    //提交事务
    
  3. void rollback() throws SQLException;
    //回滚事务
    

手动事务的使用代码

try{
    //开启手动事务
    connection.setAutoCommit(false);
    
    //执行业务操作
    //执行第一条sql命令
    //执行第二条sql命令
    //执行第n条sql命令
    
    //上面的命令没有发生错误,提交事务
    connection.commit();
}catch(Exception e){
    //如果上面某一条sql命令发生异常或错误就会来到这里,回滚事务
    connection.rollback();
}
案例效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ugsBnhqz-1606227564264)(/image-20200518022035094.png)]

第一次成功转账案例代码
package _05_使用JDBC事务进行转账业务;

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

/**
 * @author 黑马程序员
 */
public class Demo5_COMMIT {

    public static void main(String[] args) throws SQLException {
        /*
        * 目标:使用JDBC事务实现张三给李四转500元
        * 分析:2条sql命令
        *       转出sql、转入sql
        * */

        //1、定义使用的对象
        Connection conn = null;
        Statement stmt = null;


        try {
            //2、加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            //3.获取连接
            conn = DriverManager.getConnection(
                    "jdbc:mysql:///day23?characterEncoding=utf8",
                    "root",
                    "root"
            );

            //4、开启手动事务
            conn.setAutoCommit(false);

            //5、获取运输器
            stmt = conn.createStatement();

            //6、执行业务命令
            //命令1:张三转出500
            String sql = "update account set balance=balance-500 where name='张三'";
            stmt.executeUpdate(sql);

            //命令2:李四转入500
            sql = "update account set balance=balance+500 where name='李四'";
            stmt.executeUpdate(sql);

            //7.运行到这里说明上面命令全部执行成功, 提交事务
            conn.commit();

        } catch (Exception e) {
            e.printStackTrace();

            //8.上面命令有错误会来到这里,回滚事务
            conn.rollback();
        }finally {
            //无论是否发送异常,都要释放资源
            if(stmt!=null){
                stmt.close();
            }
            if(conn!=null){
                conn.close();
            }
        }

    }
}

第二次失败转账案例代码

package _05_使用JDBC事务进行转账业务;

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

/**
 * @author 黑马程序员
 */
public class Demo6_ROLLBACK {

    public static void main(String[] args) throws SQLException {
        /*
        * 目标:使用JDBC事务实现张三给李四转500元(让其发生错误回滚事务)
        * 分析:2条sql命令
        *       转出sql、转入sql
        * */

        //1、定义使用的对象
        Connection conn = null;
        Statement stmt = null;


        try {
            //2、加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            //3.获取连接
            conn = DriverManager.getConnection(
                    "jdbc:mysql:///day23?characterEncoding=utf8",
                    "root",
                    "root"
            );

            //4、开启手动事务
            conn.setAutoCommit(false);

            //5、获取运输器
            stmt = conn.createStatement();

            //6、执行业务命令
            //命令1:张三转出500
            String sql = "update account set balance=balance-500 where name='张三'";
            stmt.executeUpdate(sql);

            //发生异常错误
            int a = 1/0; //自己模拟错误

            //命令2:李四转入500
            sql = "update account set balance=balance+500 where name='李四'";
            stmt.executeUpdate(sql);

            //7.运行到这里说明上面命令全部执行成功, 提交事务
            conn.commit();

        } catch (Exception e) {
            e.printStackTrace();

            //8.上面命令有错误会来到这里,回滚事务
            conn.rollback();
        }finally {
            //无论是否发送异常,都要释放资源
            if(stmt!=null){
                stmt.close();
            }
            if(conn!=null){
                conn.close();
            }
        }

    }
}

小结

  • JDBC中手动控制事务代码?

    connection.setAutoCommit(fasle);//手动提交事务
    connection.commit();//不发生异常,提交事务
    connection.rollback();//发生异常,回滚事务
    

10.JDBC工具类:编写【应用】

目标

能够编写JDBC获取连接与关闭资源的工具类

分析

每次使用JDBC操作数据库都要获取连接、并且释放资源,做着重复的事情,怎么办?

答:将获取连接与释放资源抽取到一个工具类中,之后就可以重用

JDBC工具类代码

JDBCUtils.java

package _06_编写JDBC工具类;

import java.sql.*;

/**
 * @author 黑马程序员
 */
public class JdbcUtils {

    //定义使用的信息
    private static String URL = "jdbc:mysql:///day23?characterEncoding=utf8";
    private static String Driver = "com.mysql.jdbc.Driver";
    private static String USER = "root";
    private static String PASSWORD = "root";

    //1、对外提供获取数据库连接的方法
    public static Connection getConnection() throws Exception {
        //加载驱动
        Class.forName(Driver);

        //获取连接返回
        return DriverManager.getConnection(URL,USER,PASSWORD);
    }

    //2、对外提供释放资源的方法
    //2.1 提供查询释放3个资源的方法
    public static void close(Connection conn, Statement stmt, ResultSet rs) throws Exception {
        if(rs!=null){
            rs.close();
        }
        if(stmt!=null){
            stmt.close();
        }
        if(conn!=null){
            conn.close();
        }
    }

    //2.2 提供增删改释放2个资源的方法
    public static void close(Connection conn, Statement stmt) throws Exception {
        close(conn,stmt,null);
    }
}

案例:使用jdbc工具类进行如下操作数据库

案例需求
  1. 创建一张员工表,包含id,name,age,address字段.
  2. 添加员工数据
  3. 修改员工数据
  4. 删除员工数据。
案例效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v0JF4dPW-1606227564265)(/jdbc22.png)]

案例代码
package _07_使用jdbc工具类实现增删改;

import _06_编写JDBC工具类.JdbcUtils;

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

/**
 * @author 黑马程序员
 */
public class Demo7 {


    public static void main(String[] args) throws Exception {
        //createTable();

        //addEmployee();

        //updateEmployee();

        deteleEmployee();
    }

    //执行创建表的命令
    private static void createTable() throws Exception {

        //1、定义sql命令
        String sql = "create table emp(\n" +
                "id int primary key auto_increment,\n" +
                "name varchar(200),\n" +
                "age int,\n" +
                "address varchar(50)\n" +
                ")";

        //2、获取数据库连接
        Connection conn = JdbcUtils.getConnection();

        //3、获取运输器
        Statement stmt = conn.createStatement();

        //4、执行命令
        stmt.executeUpdate(sql);//只要不是查询就使用这个执行sql命令

        //5、释放资源
        JdbcUtils.close(conn,stmt);

        System.out.println("创建表成功");
    }

    //执行4个员工
    private static void addEmployee() throws Exception {

        //1、定义sql命令
        String sql = "insert into emp \n" +
                "values(null,'张三4',20,'北京'),\n" +
                "      (null,'李四4',21,'南京'),\n" +
                "      (null,'王五4',18,'东京'),\n" +
                "      (null,'赵六4',17,'西安')";

        //2、获取数据库连接
        Connection conn = JdbcUtils.getConnection();

        //3、获取运输器
        Statement stmt = conn.createStatement();

        //4、执行命令
        stmt.executeUpdate(sql);//只要不是查询就使用这个执行sql命令

        //5、释放资源
        JdbcUtils.close(conn,stmt);

        System.out.println("插入表成功");
    }

    //更新id=3的员工姓名为田七,地址为天津
    private static void updateEmployee() throws Exception {

        //1、定义sql命令
        String sql = "update emp set name='田七',address='天津' where id=3";

        //2、获取数据库连接
        Connection conn = JdbcUtils.getConnection();

        //3、获取运输器
        Statement stmt = conn.createStatement();

        //4、执行命令
        stmt.executeUpdate(sql);//只要不是查询就使用这个执行sql命令

        //5、释放资源
        JdbcUtils.close(conn,stmt);

        System.out.println("更新成功");
    }


    //删除id=3
    private static void deteleEmployee() throws Exception {

        //1、定义sql命令
        String sql = "delete from emp where id=3";

        //2、获取数据库连接
        Connection conn = JdbcUtils.getConnection();

        //3、获取运输器
        Statement stmt = conn.createStatement();

        //4、执行命令
        stmt.executeUpdate(sql);//只要不是查询就使用这个执行sql命令

        //5、释放资源
        JdbcUtils.close(conn,stmt);

        System.out.println("删除成功");
    }
}

小结

  • jdbc操作工具类提供哪些功能?

    获取数据库连接的方法

    释放资源的方法

11.JDBC工具类:配置文件优化【应用】

目标

优化工具类,将配置数据放入到配置文件中

为什么将配置数据放入到配置文件中?

以后企业会切换数据库,切换数据库主要是4个配置参数,如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RGvbryd8-1606227564267)(/image-20200518153714286.png)]

上面的参数需要修改,最后不要写死在代码里面,应该放入到配置文件中,让企业的工作人员可以做出对应的修改

操作步骤

1、在src目录下新建一个文件jdbc.properties,配置4个参数的信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bIP10714-1606227564268)(/image-20200518154120356.png)]

jdbc.properties代码

URL=jdbc:mysql:///day23?characterEncoding=utf8
Driver=com.mysql.jdbc.Driver
USER=root
PASSWORD=root

2、在JdbcUtils.java工具类中读取配置文件设置参数

实现代码

JdbcUtils工具类代码

package _06_编写JDBC工具类;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/**
 * @author 黑马程序员
 */
public class JdbcUtils {

    //定义使用的信息
/*  private static String URL = "jdbc:mysql:///day23?characterEncoding=utf8";
    private static String Driver = "com.mysql.jdbc.Driver";
    private static String USER = "root";
    private static String PASSWORD = "root";
*/

    private static String URL;
    private static String Driver;
    private static String USER;
    private static String PASSWORD;

    static {
        try {
            //在静态代码块中初始化上面的参数
            //1、获取配置文件jdbc.properties文件的输入流(获取类路径下的资源输入流)
            InputStream inputStream = JdbcUtils.class.getResourceAsStream("/jdbc.properties");

            //2、解析properties文件内容使用Properties类
            Properties properties = new Properties();
            properties.load(inputStream);

            //3.读取配置文件的数据给参数初始化
            URL = properties.getProperty("URL");
            Driver = properties.getProperty("Driver");
            USER = properties.getProperty("USER");
            PASSWORD = properties.getProperty("PASSWORD");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }



    //1、对外提供获取数据库连接的方法
    public static Connection getConnection() throws Exception {
        //加载驱动
        Class.forName(Driver);

        //获取连接返回
        return DriverManager.getConnection(URL,USER,PASSWORD);
    }

    //2、对外提供释放资源的方法
    //2.1 提供查询释放3个资源的方法
    public static void close(Connection conn, Statement stmt, ResultSet rs) throws Exception {
        if(rs!=null){
            rs.close();
        }
        if(stmt!=null){
            stmt.close();
        }
        if(conn!=null){
            conn.close();
        }
    }

    //2.2 提供增删改释放2个资源的方法
    public static void close(Connection conn, Statement stmt) throws Exception {
        close(conn,stmt,null);
    }
}

小结

  • 为什么将配置数据放入到配置文件中?

    以后企业会切换数据库,企业的工作人员只要修改配置文件就可以切换数据库

12.JDBC:登录案例【应用】

目标

模拟用户输入账号和密码登录网站

  1. 输入正确的账号,密码,显示登录成功
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4n30Ieyf-1606227564270)(/登录案例01.png)]
  2. 输入错误的账号,密码,显示登录失败
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SGMEQbXi-1606227564271)(/登录案例02.png)]

数据准备

CREATE TABLE USER (
  id INT AUTO_INCREMENT PRIMARY KEY,
  NAME VARCHAR(50),
  PASSWORD VARCHAR(50)
);
INSERT INTO USER (NAME, PASSWORD) VALUES('admin', '123'), ('test', '123'), ('gm', '123');
案例分析
  • 如何知道用户名与密码是否正确呢?

​ 根据控制台获取输入的用户名与密码查询数据库,如果有就代表登录成功,否则登录失败

  select * from user where name='输入的用户名' and password='输入的密码'
实现代码
package _08_登录案例;

import _06_编写JDBC工具类.JdbcUtils;

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

/**
 * @author 黑马程序员
 */
public class LoginTest {

    public static void main(String[] args) throws Exception {

        /*
        * 目标:模拟用户登录案例
        * */

        //1、创建控制台输入流
        Scanner sc = new Scanner(System.in);

        //2、进行输出与获取用户名与密码
        System.out.println("请输入账号:");
        String name = sc.nextLine();
        System.out.println("请输入密码:");
        String password = sc.nextLine();

        //3、执行数据库操作查询数据
        String sql = "select * from user where name='"+name+"' and password='"+password+"'";
        Connection conn = JdbcUtils.getConnection();
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        //4、校验登录结果
        //分析:rs移动一次游标指针如果有数据就代表用户名与密码正确
        if(rs.next()){
            //登录成功
            System.out.println("欢迎您,"+name);
        }else{
            //登录失败
            System.out.println("账号或密码错误...");
        }

        //5、释放资源
        JdbcUtils.close(conn,stmt,rs);
    }
}

小结

  1. 如何知道用户登录成功?

    根据输入的用户名与密码查询数据库,有数据代表登录成功,否则登录失败

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值