JDBC基础

JDBC只是一种连接数据库与java程序的媒介,其核心还是在乎于SQL命令。无论操作何种数据库,其JDBC命令是相同的,但SQL命令并不相同。可见我们可以把JDBC看成盒子,它的作用主要是将sql命令从java程序传递到相应数据库,不会对里面存放的东西进行审查,这时你心中就对JDBC有一个大体映像。下面从理论层大体介绍JDBC。

上面说到 JDBC是java连接数据库的媒介,注意是连接数据库而不是指特定数据库。这时就需要根据所连接数据库的不同使用与数据库对应的架包,即我连接mysql的架包与连接oracle的架包肯定是不一样的。Mysql架包为mysql-connector-java-8.0.11与mysql-connector-java-5.7.XX,如果我们连接mysql数据库就要使用其中任意一个,(注意:虽然都是mysql的架包,但不同架包版本之间也存在差异,如8.0不需要使用Class.forname()导入,而是程序自动导入的)。Class.forname()就是导入架包的命令(mysql 8.0可以不加,程序自动导入)

把架包弄好,准备工作就已经完成了,这是就要连接数据库了。连接数据库的命令是

Connection con = DriverManager.getConnection("jdbc:mysql://主机地址:数据库端口,默认是3306/所要链接的数据库?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false", 用户名, 用户名对应的密码);

 

 

解释一个每个参数的意义: Connection 这个类就是连接数据库的(深层原理不知道,能用就行,哈哈)。DriverManager.getConnection()就是建立与数据库的连接,并返回Connection类型的数据。主机地址咋说,java程序与数据库并不一定在一台主机上。端口可以理解成屋子的窗口,你想与房子内的人交流就要通过窗口交流,这是是可能会问为什么要设置端口呢,因为别的程序也会占用端口,如果两个程序占用一个端口是不可以的,因此有时数据库不使用默认端口(3306)。所要连接的数据库,这句话可能不好理解,在mysql通过show databases;查看会发现有很多数据库,每个数据库内有不同的表,这时想操作不同的表就要连接特定的数据库,用户名,用户名对应的密码见文知意,我们通过cmd登录mysql还要输入呢。?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false"这一句可能是mysql-connector-java-8.0.11新要求的,与设置时区有关。  

       完美,我们已经让java程序与数据库完美连接了。上面提到 JDBC就是盒子,现在路已经有了,是不是应该找个盒子了。PreparedStatement pstmt = con.prepareStatement(“要向mysql发送的指令“); 这就是我们需要的盒子(当然还有其他盒子,这种方法是比较推荐的),里面存的的就是我们要发送的内容。如完整的是PreparedStatement pstmt = con.prepareStatement("insert into student values (10,'应该是sss',21,'日照');");是不是很眼熟,盒子里放的就是mysql语句。哈哈,这就是无论操作何种数据库JDBC命令都相同的原因,但里面存的内容却有天壤之别(对应各数据的sql指令)

       上面说推荐使用PreparedStatement当盒子,为什么会推荐,可以查看相关资料,不在进行描述.

       最好一步了,这时路和盒子都已经有了,发送吧。把话藏在心里,别人可接受不到。这时还要考虑一个问题,增删改没有返回值(因为我们执行操作就好了,不需要得到什么)而查询我们是要得到数据的,所以这里要分成两部分:分别对应 增 删 改  与 查询

  1. 增删改 格式为 int I = pstmt.executeUpdate(); 定义这个i变量的作用是,要操作不成功返回0,其实返回的是在mysql受影响的数据,如果 0 条受影响,肯定是不成功。
  2. 查询 格式为 ResultSet s = pstmt.executeQuery();  ResultSet可以看成集合,它是用来存放数据库返回结果的。

 

完成任务了,JDBC模板就是这样了,以后使用JDBC也就是套啊套。最后说下 如果 从ResultSet s中提取查询的数据,既然都查了,不把数据拿出来并不像话。

              while(s.next()) { //next()是先向下一移一条记录,在查看是否存在,不存在返回false

                s.getInt("字段名"); //我们在数据库可以存放不同的数据,哪取出的时候也要用不同的方法取出。

                s.getFloat("字段名");

                s.getString("字段名");

            }

      

下面做个案例,以mysql-connector-java-8.0.11为例,如果是5.7版本需要适修改实验一下:

首先创建一个数据库 Test,里面一张 Student 表,表中有 id(int) name(varchar(20)) sex(char(1) 三个字段。

mysql> create database Test;

Query OK, 1 row affected (0.01 sec)

mysql> use Test; #在使用表之前,必须选择一个数据库

Database changed

mysql> create table Student( id int, name varchar(20),sex char(1));

Query OK, 0 rows affected (0.06 sec)

 

在下面的程序需要导入的包

import java.sql.Connection;

import java.sql.Driver;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

 

在java程序连接数据库 向内 插入一条数据(1,’张三’,‘男‘),并在mysql查看

//在主函数内写入

try {

            //需要连接Test 数据库 用户名为 root 密码为 123456

            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/Test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false","root", "123456");

            //插入一条数据(1,’张三’,‘

            PreparedStatement pstmt = con.prepareStatement("insert into Student values (1,'张三','');");

            //准备完毕,向数据库发送指令

            int i = pstmt.executeUpdate();

            if(i > 0) { //判断受影响的记录数,可以插入一条数据,如果成功I 应该为 1

                System.out.println("操作成功");

            }else{

                System.out.println("操作失败");

            }

        }catch(SQLException e) {

            e.printStackTrace();

        }

//在mysql查看

mysql> select * from Student;

+------+--------+------+

| id   | name   | sex  |

+------+--------+------+

|    1 | 张三   | 男   |

+------+--------+------+     #通过查询结果  操作成功

 

(这一步可以省略,设置到PreparedStatement知识点,也不难可以常识使用,但思考为什么这么写)通过以上方法在将插入一条数据(2,’李四’,‘男‘); 显示意见这是我们就要重新修改pstmt内容,这样当插入数据过多时,是很影响效率的,而 PreparedStatement 类可以有效避免这个问题,也时推荐使用的原因,将上图程序修改为

try {

            //需要连接Test 数据库 用户名为 root 密码为 123456

            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/Test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false","root", "123456");

            //我们不知道要插入什么数据,所以先用? 进行 占位, 以后通过修改?的值,达到插入不同数据的效果

            PreparedStatement pstmt = con.prepareStatement("insert into Student values (?,?,?);");

            //通过pstmt方法,修改?号的值

                pstmt.setInt(1, 2); //把第一个问号设置为 整数 2

                pstmt.setString(2, "李四"); //把第二个问号设置为字符串 李四

                pstmt.setString(3, "");

            //准备完毕,向数据库发送指令

            int i = pstmt.executeUpdate();

            if(i > 0) {

                System.out.println("操作成功");

            }else{

                System.out.println("操作失败");

            }

        }catch(SQLException e) {

            e.printStackTrace();

        }

    }

 

 

下面将Test数据库中的Student表内容提取出来

try {

            //需要连接Test 数据库 用户名为 root 密码为 123456

            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/Test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false","root", "123456");

            //我们不知道要插入什么数据,所以先用? 进行 占位, 以后通过修改?的值,达到插入不同数据的效果

            PreparedStatement pstmt = con.prepareStatement("select * from Student");

            ResultSet res = pstmt.executeQuery(); //注意 更新操作是 executeUpdate()

            if(res != null) {

                while(res.next()){

                    int id = res.getInt("id");

                    String name = res.getString("name");

                    String sex = res.getString("sex");

               

                    System.out.println("id = "+id+" name = "+name+" sex = "+sex);

                }

            }

        }catch(SQLException e) {

            e.printStackTrace();

        }

 

查看结果:

完成

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值