• JDBC入门


    JDBC

    1.什么是jdbc?

    1.1jdbc是什么

    JDBC :java database connection

    讲到什么是jdbc,我们就要追的根溯源到jdbc的应用场景

    应用场景:在客户端和服务器通信的过程中

    1.而客户端与服务器的通信本质上就行基于tcp/ip协议的连接,但是如果我们基于tcp/ip去编程就会显得很麻烦和繁琐。

    而java就是把基于底层的tcp/ip封装起来,形成了一个新的协议这个协议就叫做jdbc,如果我们要写通信,就可以用jdbc封装好的功能,而不用去管用tcp了

    2.有类和接口组成的一个API

    在这里插入图片描述

    本质上是有个底层封装了tcp/ip协议的javaAPI,由类和接口组成。

    1.2 jdbc核心原理

    那问题来了,jdbc是针对java语言和服务器来的,服务器可以简单理解为数据库

    数据库有很多,比如Oracle、mysql、SQL serber…等,每个数据库的底层实现肯定不同,怎么样只用一个jdbc就能连接大多数数据库呢?

    在这里插入图片描述

    sun公司想编写一套jdk,能连接所有数据库------>但数据库众多,不可能更新到连接所有数据库;甚至很多数据库不开源,无法编写jdbc

    那么,sun公司只提供一套接口,而具体实现是由不同数据库厂家自己提供的(java语言使用人数众多,可以做到让数据库厂商来对接它

    -------->而这个根据这一套接口土体实现的API,就叫做数据库驱动

    在这里插入图片描述

    这样只写一个jdbc接口,然后由底下分层实现,就达到了只关注最上层就能实现连接所有数据库的功能,有效的避免了差异化。(分层概念:具体实现下层完成,具体应用只用关注上层的思想

    1.3JDBC核心接口

    jdbc有3个核心接口和一个类3

    工厂到厂库的过程中
    
    1.首先需要修路
    
    2.需要有车子运送物资
    
    3.从仓库拿到原材料
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    三个接口:

    1.Connection:连接对象

    形象的可以理解为道路

    2.Statement:发送sql,通知数据库执行

    可以理解为运送的车子

    3.ResultSet:对应查询的结果集

    可以理解为原材料,后续需要进行加工解析

    一个类:

    DriverManger:驱动管理器,管理项目

    用于加载驱动,让用户知道是哪个驱动,并且可以用它与服务器建立Connection对象,即连接通路对象

    2.搭建环境

    3.1导入第三方jar包

    使用idea导入第三方jar包,=

    在idea中导入mysql的驱动jar: mysql-connector-java-5.1.47.jar

    3.1.1创建lib目录

    在这里插入图片描述

    在这里插入图片描述

    3.1.2.将驱动即jar包复制到lib文件下

    (驱动需要单独去下载复制进lib目录下)

    在这里插入图片描述

    3.1.3将lib添加到项目中,作为第三方的库

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    3.jdbc入门程序

    3.1 加载驱动类

    Class.forName("com.mysql.jdbc.Connection");
    
    • 1

    加载mysqljdbc驱动

    3.2. 获取链接Connection

    Connection conn = DriverManager.getConnection(url,username,password)
    
    • 1

    通过驱动管理器创建连接对象;

    url:访问数据库服务网址
    username:用户名

    password:密码

    在这里插入图片描述

    3.3. 编写sql

    String sql = "SELECT * FROM emp";
    
    • 1

    3.4. 创建Statment对象

    smt = conn.createStatement();
    
    • 1

    由Connection连接对象创建Statment对象,用来发送sql语句,像车子

    3.5. 发送sql,通知数据库执行,接收结果

    //Statement对象有两个方法
    int executeUpdate(sql)  //执行增删该sql,返回受影响行数
    ResultSet executeQuery(sql) //执行查询的sql  返回查询结果集
    
    • 1
    • 2
    • 3
    • int executeUpdate(sql)

    当们的sql语句是增、删、该操作是就是executeUpdate(sql),返回的是一个int类型的数据,表示的是此次受影响的行数,成功以后不需要解析

    • ResultSet executeQuery(sql)

    当sql语句是查询语句的时候,就会返回一个ResultSet对象,表示一个结果集,就需要在第6部去把结果集解析出来

    3.6 如果是查询,结果是ResultSet,解析ResultSet

    ResultSet rs = smt.executeQuery(sql);
    
    rs.next();
    
    int i=1;
    //循环,当rs.next()值为false就代表下一行没有值,遍历了整个行了
    while(rs.next()){
        System.out.println(rs.getInt(1)+"\t"+rs.getString(2).......);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    ResultSet表示结果集对象

    • 在ResulSet结果集里面可以想象是有一个指针指向当前行的,然后在根据当前的行去获取具体的字段信息

      有一个next()方法为行指针,判断是否有下一行并把指针移到下一行,这样就实现了行遍历

    • 获取对应行的每一列的值

      • Xxx getXxx(int i),根据索引获取列值

        int getInt(1)

        long getLong(2)

      • Xxx getXxx(String name )根据列名获取列值,这种方式可读性高

    在这里插入图片描述

    3.7.都是资源要关闭

                //一定要注意,倒叙关(先开后关):Connection conn,Statment smt,ResultSet res
                //要抛异常,全选然后快捷键ctrl+Alt+t+6
                try {
                    if(res !=null) res.close();
                    if( smt !=null)  smt.close();
                    if(conn != null)    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    完整代码示例:

    public class Demo2 {
        public static void main(String[] args) {
            Connection conn = null;
            Statement state = null;
            ResultSet resultSet = null;
            try {
                //1、获取驱动
                Class.forName("com.mysql.jdbc.Driver");
    
                //2、建立连接
                conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf8&useSSL=false", "root", "123456");
    
                //3、创建Statement对象,像一个车一样用来运输sql语句到mysql服务器
                state = conn.createStatement();
    
                //4.编写sql语句
                String sql = "SELECT * FROM emp";
    
                //5.将sql语句运送到服务器,并接收服务器返回过来的值或数据集
                resultSet = state.executeQuery(sql);
    
                //6.读取返回的ResultSet类型的数据集
                while (resultSet.next()){
                    System.out.println(resultSet.getInt("empno")+"\t\t"+resultSet.getString("ename")+"\t\t"+resultSet.getString("job")+"\t\t"+resultSet.getInt("mgr")+"\t\t"+resultSet.getDate("hiredate")+"\t\t"+resultSet.getDouble("sal")+"\t\t"+resultSet.getDouble("comm")+"\t\t"+resultSet.getInt("deptno"));
                }
    
    
            } catch (ClassNotFoundException | SQLException e) {
                e.printStackTrace();
            }finally {
                //7、关闭流,先用后关
                try {
                    resultSet.close();
                    state.close();
                    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
    
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    在这里插入图片描述

    4.JDBC核心API(未完成)

    4.4创建Statement对象(车对象)

    Statement:

    sql语句只能拼接,

    1. 容易出错
    2. 可读性差

    dbc有3个核心接口和一个类3

    Connection:连接对象

    • 创建Stament对象
    • 创建PreparedStatement:执行sql
    • 创建CallableStatement:执行数据库的存储过程
    • 关于事物相关的方法

    Statement:发送sql,通知数据库执行

    两个子接口

    • PreparedStatemaent:不需要拼接sql,以后使用它
    • CallableStatement:调用存储过程

    方法

    • int executeUpdate(sql) ,执行增删改sql

    • ResultSet executeQuery(sql) ,执行查询sql

    • boolean excute(sql) ,可执行增删改查

    返回值表示是否有结果集

    true,有:获取结果集

    ResultSet getResultSet()

    false,没有

    int

    getUpdateCount()

    • 批处理相关的方法

    ResultSet:对应查询的结果集

  • 相关阅读:
    STM32CubeMX驱动INA226芯片
    腾讯云16核服务器配置大全_16核CPU型号性能测评
    24、wpf之布局(二)
    VMware设置Linux网络
    实际工作项目中搭配git托管代码的流程
    Thread的常用方法
    极简OpenFoam编程
    C语言:用函数指针实现加减乘除的应用
    数据结构与算法04:队列
    MyBatis的缓存
  • 原文地址:https://blog.csdn.net/qq_63196986/article/details/126756440