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.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");

加载mysqljdbc驱动

3.2. 获取链接Connection

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

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

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

password:密码

在这里插入图片描述

3.3. 编写sql

String sql = "SELECT * FROM emp";

3.4. 创建Statment对象

smt = conn.createStatement();

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

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

//Statement对象有两个方法
int executeUpdate(sql)  //执行增删该sql,返回受影响行数
ResultSet executeQuery(sql) //执行查询的sql  返回查询结果集
  • 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).......);
}

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();
            }

完整代码示例:

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();
            }

        }
    }
}

在这里插入图片描述

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:对应查询的结果集

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值