JDBC 保姆级教程

目录

1 JDBC引言

1.1 JDBC简介

1.2 JDBC原生编程(了解)

2 JdbcTemplate编程

2.1 JdbcTemplate编程步骤

2.2 第1个JdbcTemplate程序

3 结果集的处理

3.1 ResultSet结果集

3.2 处理结果集

3.3 RowMapper接口

4 数据绑定

4.1 字符串拼接

4.2 ?占位符

4.3 字符串拼接和?占位符的区别

5 异常

5.1 根据异常日志分析

5.2 添加日志输出

5.3 记录JDBC中的异常

1 JDBC引言

1.1 JDBC简介

JDBC(Java DataBase Connectivity) :Java数据库连接技术:具体讲就是通过Java连接广泛的数据库,并对表中数据执行增、删、改、查等操作的技术。

此前我们学习过SQL后,可以通过DataGripNavicatSQLyog等图形化客户端发送SQL操作数据库。本质上,JDBC的作用和图形化客户端的作用相同,都是发送SQL操作数据库。差别在图形化界面的操作是图形化、傻瓜化的,而JDBC则需要通过编码(先不要思考JDBC代码怎么写,也不要觉得它有多难)完成图形操作时的效果。

总结:JDBC本质上也是一种发送SQL操作数据库的client技术,只不过需要通过Java编码完成。

为什么要学习JDBC?既然说JDBC和 Navicat的作用相同,而 Navicat图形化操作很简单(我们也很熟练),那么为什么还要学习操作更复杂(需要编码)、更陌生的新的Java客户端技术呢?

Java是可编程的(可定制化),可以将普通用户输入的数据拼接成各种各样的可运行的SQL,从而降低普通用户使用数据库服务的难度。

举个例子:任何系统中都有登录功能,登录时需要从用户表中根据用户名查询然后比对密码,每个人的用户名密码肯定不同,执行的select语句的条件部分就不同,直接让用户通过 Navicat 操作数据库,就得由用户拼接SQL,这对于小白用户要求过高。而JDBC就可以通过Java代码将用户输入的用户名密码拼接到SQL中完成查询,普通小白用户通过JDBC程序操作数据库时,只要会输入用户名密码即可!!!

1.2 JDBC原生编程(了解)

1.2.1 JDBC涉及的API

JDBC要通过Java代码操作数据库,JDBC中定义了操作数据库的各种接口和类型:

  • Driver: 驱动接口,定义了Java如何和数据库获取连接

  • DriverManager: 管理驱动的工具类, 可以管理多种驱动,通过它可以获取和数据库的连接

  • Connection:连接接口,通过它完成Java和数据库之间的交互

  • DataSource::数据源接口,用来管理Java和数据库建立的连接,可以复用之前建立的连接

  • PreparedStatement: 发送SQL的工具接口,该类型对象用于向数据库发送一条SQL

  • ResultSet: 结果集接口, 该类型的对象表示一条查询SQL返回的结果

注意:学习到这里不需要你掌握上述的任何一个类型(后续会逐步学习到每一个类型),只需要加深理解JDBC需要通过编码操作数据库(也就是JDBC的可编程属性)即可。

1.2.2 JDBC原生编程示例(了解)

之前,我们已经反复强调JDBC是一种和 Navicat 相当的客户端程序,那么JDBC操作数据库的步骤和 Navicat 操作数据库步骤就大同小异,下面我们先回顾下 Navicat的操作步骤,然后分析出JDBC的步骤。

总结:开发步骤

1. 加载驱动
2. 获取链接:配置url、username和password
3. 准备SQL以及发送SQL的工具
4. 执行SQL
5. 处理结果集
6. 释放资源 
-- 需求:从t_person表中查询数据
-- 数据准备
create table t_person(
	person_id int primary key auto_increment,
    person_name varchar(20),
    age tinyint,
    sex varchar(6),
    mobile varchar(20),
    address varchar(200)
);
insert into t_person values(1,'王月华',18,'F','1563868xxxx','郑州'),(2,'刘天赐',18,'M','1563768xxxx','郑州');
-- 需求 查询t_person表所有数据
select * from t_person;
  1. 准备工作(搭建开发环境)

    需要在项目中引入数据库驱动jar包(jar文件:针对class文件的压缩格式包含了多个带包的class文件,类似于普通文件打包的zip、rar)

    • eclipse

      将mysql-connector-java.jar添加到项目环境中
      1. 右键选中项目,新建一个folder名为lib,将jar包复制到lib目录中
      2. 右键选中jar包,build path-->add to build path
    • idea

      将mysql-connector-java.jar添加到项目环境中
      1. 右键选中项目,新建一个Directory名为lib,将jar包复制到lib文件夹中
      2. 右键选中jar包,Add as Library --> OK
  2. 编码(JDBC6步)

  

public class JDBCTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1 加载驱动
        /*
        	驱动版本8.0.x com.mysql.cj.jdbc.Driver
        	驱动版本5.1.x com.mysql.jdbc.Driver
        */
        Class.forName("com.mysql.cj.jdbc.Driver");
        
        //2 获取连接
        String username = "root";//用户名
        String password = "123456";//密码
        /*
            url参数用来确定连接的数据库信息: 数据库机器ip 端口号port 数据库名db_name 连接的参数,比如编解码集、时区...
            url格式:jdbc:mysql://ip:port/db_name?k=v参数 ,只需要了解url的组成,不需要记忆
        */
        String url = "jdbc:mysql://localhost:3306/baizhi?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
        Connection conn = DriverManager.getConnection(url, username, password);//通过DriverManager管理驱动获取连接
        
        //3 准备发送SQL的工具
        String sql = "select * from t_person";
        PreparedStatement pstm = conn.prepareStatement(sql);
        
        //4 发送执行SQL
        ResultSet rs = pstm.executeQuery();
        
        //5 处理结果集(如果有)
        while(rs.next()){
            /*
                rs.getXxx(列顺序从1开始) 或者 rs.getXxx("列名") 获取指定列的数据,Xxx为数据类型
                实战中多使用列名,可读性强
             */
            int personId1 = rs.getInt("person_id");
            String personName1 = rs.getString("person_name");
            int age1 = rs.getInt("age");
            String sex1 = rs.getString("sex");
            String mobile1 = rs.getString("mobile");
            String address1 = rs.getString("address");
            System.out.println("personId="+personId1+",personName="+personName1
                    +",age="+age1+",sex="+sex1+",mobile="+mobile1+",address="+address1);

            int personId2 = rs.getInt(1);
            String personName2 = rs.getString(2);
            int age2 = rs.getInt(3);
            String sex2 = rs.getString(4);
            String mobile2 = rs.getString(5);
            String address2 = rs.getString(6);
            System.out.println("personId="+personId2+",personName="+personName2
                  
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值