Java之JDBC详解(一)

目录

一.JDBC简介:

二.JDBC组成:

三.使用JDBC创建一个学生管理系统:


一.JDBC简介:

    1.1 JDBC理解:

  • JDBC(Java datebasse connectivity) 称为Java连接数据库,它是一套接口。最开始学习Java时,对于数据的存储,处理,使用数组存储,处理数据,但是处理的数据不知道多少,并且内部元素是对象时,我们无法对数组的长度进行任意的变动。这个时候又学习了集合,可以对数据更好的处理,可集合只能在内存中运行,但是对于一些有关联的,数据量大的,需要修改的数据并且存储的数据,我们使用了数据库。使用数据库,使用客户端操作数据库服务器,现在使用JDBC可以使用Java程序对数据库的数据操作。
  • Java程序连接数据库时,会有很多数据库比如Oracle,MySQL,serveSQL,而不同的数据库有它的不同的标准,程序员使用Java程序连接数据库时,不可能因为要使用这种数据库,就去学习使用这种数据库,这样严重影响效率。所以这种状况在设计JDBC时,将JDBC由类和接口组成,而JDBC 的具体的实现是由具体的数据库厂商提供,以驱动程序形式提供,没有驱动无法完成数据库连接

如下图:

Java的应用程序连接数据库的时候,通过JDBC加载对应数据库的驱动jar(内部是该数据库的接口和具体的实现类,由对应的数据库厂家提供),加载完驱动之后,调用connection方法连接数据库。

注意点:

1.客户端和服务端之间的通信是基于TCP/IP协议的,Java(客户端)和数据库(服务端)也是基于TCP/IP协议的,只是在上面封装了,形成JDBC。所以JDBC也是基于TCP/IP协议的。(实现基础)

2.JDBC是接口,它定义一系列规范,定义了标准,具体的实现类是由数据库厂商提供。

3.无论是网络的七层模型,还是Java程序与数据库的连接都运用到了分层的思想,这样屏蔽了底层之间的差异,实现不同的功能,从而达到最终的目的。所以平常设计的时候我们可以经常考虑分层模型。一层解决不了,再加一层,直到消除差异。

 

二.JDBC组成:

JDBC是由JDBC API和JDBC Driver Interface两部分组成

2.1 JDBC API:

JDBC API内部包含程序员调用的接口与类,主要在java.sql 和 javax.sql中,作用是:与数据库建立连接(connection),发送执行SQL语句,处理结果。

JDBC 核心的API接口:

  • Connection: 接口 连接对象
  • Statement: 接口 发送sql,通知数据库服务器执行

  • DriverManager: 类 驱动管理器, 管理项目中所有的数据库驱动

  • ResultSet: 接口 对应查询的结果

   2.1.1 DriverManager类:

DriverManger(驱动管理器)的作用有两个:

  • 注册驱动:这可以让JDBC知道要使用的是哪个驱动;
        Class.forName("com.mysql.jdbc.Driver");

这个加载驱动也就是加载对应数据库的实现类和接口,参数是全路径名=包名+类名; 

  • 获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了。
connection = DriverManager.getConnection("数据库网址", "账号", "密码");

获取到这个connection是要Statement对象。

2.1.2 Connection接口:

Connection对象表示连接,与数据库的通讯都是通过这个对象展开的:

这个Connection对象,主要用来获取Statement对象的。

2.1.3  Statement接口:

Statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句:

     Statement有两个主要的方法:

  • void executeUpdate(String sql):执行增删改操作(insert、update、delete等);

  • ResultSet executeQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;

executeUpdate返回的是增删改受影响的行数,而executeQuery返回的是一个Resultset结果集,是查询出来的表的数据。

代码演示:

            //获取到statament对象,向数据库发送sql语句
            statement = connection.createStatement();

            //发送数据,并且操作数据库,插入数据
            String sql="insert into dept value(10,'z',30)";
            int i = statement.executeUpdate(sql);
            //发送数据,删除数据
            String sqldelete="delete from dept where dname='z'";
            int i1 = statement.executeUpdate(sqldelete);
          //返回受影响的行数
            System.out.println(i1);
            //发送sql语句,查询
            String sqlselect="select *from emp where ename like '%i%'";
            resultSet = statement.executeQuery(sqlselect);
            

2.1.4 ResultSet接口:

ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格,有行有列。操作结果集要学习移动ResultSet内部的“行光标”,以及获取当前行上的每一列上的数据:

  ResultSet有两个主要的方法:

  • boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在;

  • XXX getXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0。  

注意点:

1.next()方法是从第一行开始移动,也就是字段的那一行。之后再往下移动。

2.getXXX(int col)有它的重载方法 ------》getXXX(String column列名)获取指定列的所有数据。

代码演示:

//发送sql语句,查询
            String sqlselect="select *from emp where ename like '%i%'";
            resultSet = statement.executeQuery(sqlselect);
//next返回的是一个boolean类型
            //解析,resultset的结果集,这个get索引的值来获取值 get(int index)
//            while(resultSet.next()){
                for(int j=0;j<4;j++){
                resultSet.next();
                String string = resultSet.getString(2);
                String string1 = resultSet.getString(3);
                String mgr = resultSet.getString(4);
                System.out.println(string+" "+string1+" "+mgr);
            }
            System.out.println("==============");

            //get(String 列名)来获取值,这样可读性就比较高
              for(int j=0;j<4;j++){
               resultSet.next();
               String empno = resultSet.getString("empno");
               String ename = resultSet.getString("ename");
               String job = resultSet.getString("job");
               System.out.println(empno+" "+ename);
               System.out.println(empno+" "+ename+" "+job);
            }

 2.2 JDBC Driver Interface:

JDBC API 是提供给开发者的一组独立于数据库的 API,对任何数据库的操作都可以用这组 API 来进行。那么要把这些通用的 API 翻译成特定数据库能懂的"指令",就要由 JDBC Driver Interface 来实现了。JDBC Driver Interface 是面向 JDBC 驱动程序开发商的编程接口,它会把我们通过 JDBC API 发给数据库的通用指令翻译给他们自己的数据库。
 

 三.JDBC练习:

   通过JDBC实现一个学生管理系统:

package com.company.jdbcday906;/*
Author:
date:
problem:

学生管理系统

思路分析:
1.创建学生信息表,用户表(密码,用户名)
2.创建一个类作用是JDBC连接数据库,获取表中的数据
3.用户登录,把表中的数据和控制台输出的判断,正确就登录,没有的话,登录失败,然后输出判断是否注册,注册把输出的数据写入数据库中
4.登录之后写学生管理系统中的各种功能,这个时候写一个死循环1,2,3,4,功能都不能退出该循环。只有5才能然循环退出
*/

import com.company.day20Arraylist89.MyArrayList;

import java.sql.*;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

public class Studentmangersystem {
    public static void main(String[] args) throws SQLException, ClassNotFoundException, InterruptedException {
        //使用jdbc连接数据库,获取到数据
        //查询用户表中的数据,并且返回
        //定义一个用户的变量
        String use;
        String password;
        //创建一个集合,用来存储这个得到的数据
        //存放用户名
        ArrayList listname = new ArrayList();
        //存放密码
        ArrayList listword = new ArrayList();
        //加载驱动类(全路径名=包名+文件名)
        Class.forName("com.mysql.jdbc.Driver");
        //获取数据库网址,填写自己的用户名。连接数据库
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            connection = DriverManager.getConnection();
            //获取到statament对象,向数据库发送sql语句
            statement = connection.createStatement();
            //发送查询语句
            String sql = "select *from studentsystem_user";
            resultSet = statement.executeQuery(sql);
            //返回一个结果集,得到里面的数据
            while (resultSet.next()) {
//                String string = resultSet.getString(1);
                use = resultSet.getString("use");
                password = resultSet.getString("password");
//                System.out.println(use);
//                System.out.println(password);
                listname.add(use);
                listword.add(password);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //登录判断
        System.out.println("请输入你的用户名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.next();
        System.out.println("请输入你的密码");
        String mima = scanner.next();
        if (listname.contains(name) && listword.contains(mima)) {
            System.out.println("正在加载..........");
            //休眠3秒钟。
            TimeUnit.SECONDS.sleep(3);
            System.out.println("登录成功");
            int i=0;
            System.out.println("欢迎进入学生管理系统");
            menu();
            //循环执行系统功能
            while(i!=2){
                int choose = scanner.nextInt();
                switch(choose){
                    case 2:
                        add();
                        break;
                    case 1:
                        show();
                        break;
                    case 3:
                        alter();
                        break;
                    case 4:
                        delete();
                        break;
                    case 5:
                        i= exit(i);
                        break;
                }
            }
        } else {
            System.out.println("用户名或者密码错误");
            System.out.println("是否注册");
            Scanner scanner1 = new Scanner(System.in);
            String shuru = scanner1.next();
            if (shuru.equals("是")) {
                Connection jdbc = jdbc();
                System.out.println("输入你的用户名");
                Scanner scanner2 = new Scanner(System.in);
                String name1 = scanner2.next();
                System.out.println("输入你的密码");
                String mima1 = scanner2.next();
                String sql="insert into studentsystem_user values(?,?);";
                PreparedStatement preparedStatement = jdbc.prepareStatement(sql);
                preparedStatement.executeUpdate();
                System.out.println("注册成功");
                System.out.println("请重新登录");
            } else {
                System.out.println("失败");
            }
        }
    }
    public static Connection jdbc() throws ClassNotFoundException, SQLException {
        //加载驱动类(全路径名=包名+文件名)
        Class.forName("com.mysql.jdbc.Driver");
        //获取数据库网址,填写自己的用户名。连接数据库
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            connection = DriverManager.getConnection();
//            System.out.println("连接成功");
            //获取到statament对象,向数据库发送sql语句
        } catch (SQLException e) {

            e.printStackTrace();
        }
        return connection;
    }
    //菜单功能,显示菜单
    public static void menu(){
        String[] menuarr={"1.显示所有的学生信息","2.添加学生","3.修改学生信息","4.删除学生信息","5.退出系统"};
        for(int i=0;i<menuarr.length;i++){
            System.out.println(menuarr[i]);
        }
    }
    //显示所有学生的信息
    public static void show() throws SQLException, ClassNotFoundException {
        Connection jdbc = jdbc();
        //查询所有的学生信息
        String sql="select *from studentsytem_student;";
//        ResultSet resultSet = jdbc.executeQuery(sql);
        //使用prepareStatement,对这个预编译
        PreparedStatement preparedStatement = jdbc.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        while(resultSet.next()){
            String id = resultSet.getString("id");
            String name = resultSet.getString("name");
            String sex = resultSet.getString("sex");
            String age = resultSet.getString("age");
            System.out.println(id+" "+name+" "+sex+" "+age);
        }
    }
    //添加功能
    public static void add() throws SQLException, ClassNotFoundException {
        while (true){
            try{
                //要添加的数据
                Scanner scanner = new Scanner(System.in);
                System.out.println("输入学号:");
                int id = scanner.nextInt();
                System.out.println("输入名字:");
                String name = scanner.next();
                System.out.println("请选择性别:");
                System.out.println("输入1为男,2为女:");
                int anInt = scanner.nextInt();
                String sex=null;
                if(anInt==1){
                    sex="男";
                }else if(anInt==2){
                    sex="女";
                }
                System.out.println("请输入年龄:");
                int age = scanner.nextInt();
                String sql="insert into studentsytem_student values(?,?,?,?);";

                Connection jdbc = jdbc();
                PreparedStatement preparedStatement = jdbc.prepareStatement(sql);
                preparedStatement.setObject(1,id);
                preparedStatement.setObject(2,name);
                preparedStatement.setObject(3,sex);
                preparedStatement.setObject(4,age);
                int i = preparedStatement.executeUpdate();

                System.out.println("添加成功");
                break;
            }catch(Exception e){
                System.out.println("学号重复,重新输入");
                break;
            }
        }
        }


    //修改功能,根据学号修改,不能修改学号
    public static  void alter() throws SQLException, ClassNotFoundException {
        System.out.println("修改学生的学号:");
        Scanner scanner = new Scanner(System.in);
        int id = scanner.nextInt();
        System.out.println("输入要修改的字段:");
        String ziduan = scanner.next();
        System.out.println("输入值:");
        Object value = scanner.next();
        Connection jdbc = jdbc();
        String sql="update studentsytem_student set "+ziduan+" =?  where id=?;";
        System.out.println(sql);
        PreparedStatement preparedStatement = jdbc.prepareStatement(sql);
        preparedStatement.setObject(1,value);
        preparedStatement.setObject(2,id);
        preparedStatement.executeUpdate();
        System.out.println("修改成功");
        preparedStatement.clearParameters();
    }
    //删除功能,根据学号删除
    public static void delete() throws SQLException, ClassNotFoundException {
        System.out.println("输入要删除的学生的学号:");
        Scanner scanner = new Scanner(System.in);
        int id = scanner.nextInt();
        Connection jdbc = jdbc();
        String sql="delete from studentsytem_student where id=?;";
        PreparedStatement preparedStatement = jdbc.prepareStatement(sql);
        preparedStatement.setObject(1,id);
        preparedStatement.executeUpdate();
        System.out.println("删除成功");
    }
    //退出功能
    public static int exit(int i){
        System.out.println("已退出,欢迎使用再次本软件");
        return i=2;
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值