JDBC总结

news2025/1/12 10:47:22

目录

JDBC(java database connection) 

JDBC连接数据库步骤:

1.   在项目中添加jar文件,如图所示

2.加载驱动类

向数据库中插入数据代码示例:

第一种:

第二种:

查询操作 :

 第一种:

 第二种:

JDBC(java database connection) 

        java数据库连接.api(应用程序编程接口) ,可以为多种关系型数据提供统一访问,它由一组java语言编写的类和接口组成.

        java程序是可以连接不同的数据库,但是不同的数据库具体的连接细节不同,那么连接数据库的细节应该由谁来实现?

        连接细节由数据库开发商实现,由于开发商起的名字,连接操作步骤不同,所以由java设计出一系列连接数据库接口规范,然后由不同的数据库开发商实现.

示例 :

java 定义的接口

inerface oper

{

insert()

{}

delete()

{}

select()

{}

update()

{}

}

然后例如mysql sqlsever 去实现.

示例: mysql实现类

oracleOperImpl implements oper{

insert()

{

.......}

delete()

{

.......}

select()

{

.....}

update()

{

.......}

}

 有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库

因为java对于不同的数据库,对其的操作方法的名字都是一样的, 

  • java定义者制定了JDBC规范,
  • 数据库开发商实现接口
  • 程序员学习使用标准规范

         所以程序员只需要知道java提供的方法即可,java提供了链接数据库的规范,具体连接细节由数据库开发商实现.mysql和java连接的jar文件,mysql-connector-java-8.0.16.jar.

JDBC连接数据库步骤

1.   在项目中添加jar文件,如图所示

2.加载驱动类

完整功能

package jdbc;

import com.mysql.jdbc.Driver;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class demo1 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {


        //2加载驱动类
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2加载驱动类2
        //DriverManager.registerDriver(new Driver());

        //建立与数据库的连接,获得连接对象
        //三个参数,账号,密码,数据库连接地址
        String url = "jdbc:mysql://127.0.0.1:3306/学生?serverTimezone=Asia/" + "Shanghai";
        String user ="root";
        String password ="root";
        Connection connection = DriverManager.getConnection(url,user,password);
        //发送sql
        Statement st = connection.createStatement();
        //java向数据库发送语句
        //向表中插入数据
        st.executeUpdate("insert into major(name)values('计算机')");

                //关闭数据库连接
                st.close();
        connection.close();
    }
}

这样就可以将java中的数据存储到数据库中去. 

 注意

        关于调用抽象类中的方法,实际上在JDBC的上下文中,你并不会直接去实例化一个抽象类或者明确地调用抽象类的方法。更多的是通过接口和具体实现类的交互来完成数据库操作。例如,当你调用DriverManager.getConnection(url, username, password)获取数据库连接时,这个方法返回的是一个实现了java.sql.Connection接口的对象。这个对象是由具体的数据库驱动程序提供的,它可能是一个具体类也可能是抽象类的具体子类,但作为开发者,我们通常不需要关心其具体实现细节,只需要知道它遵循了Connection接口规范即可。

如图所示:

向数据库中插入数据代码示例:

第一种

statement传递sql直接将sql语句传递到数据库中

package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
//向数据库插入数据
public class deom2 {
    public static void main(String[] args) {

        try {
            new deom2().save("小三",12,"2003-06_17", "19025284617", "男","陕西西安", 1.80, 5 );
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    public void save(String name, int num ,String birthday ,String phone, String gender,String address ,double height ,int majorid) throws ClassNotFoundException, SQLException {
        //加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");//反射实现
        // 管理驱动程序并建立与数据库连接,返回的这个connection 对象代表了特定数据库的连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/学生?serverTimezone=Asia/Shanghai","root","root");
        // 通过调用 Connection 对象的 createStatement() 方法,
        // 你可以创建一个 Statement 对象。
        // 这个 Statement 对象可以用来执行SQL查询或者更新(比如INSERT, UPDATE, DELETE语句)
        Statement st =  connection.createStatement();
        //执行SQL语句中的更新数据的操作
        st.executeUpdate("INSERT INTO student(name ,num , birthday ,phone ,gender,address,height ,reg_time,majorid)"
                + "values('"+name+"',"+num+",'"+birthday+"','"+phone+"','"+gender+"','"+address+"',"+height+",now(),"+majorid+")");
 //执行sql语句中的修改操作
        //st.executeUpdate("update student set name ='"+name+"',gender ='"+gender+"',birthday = '"+birthday+"',reg_time=now()where num ='"+num+"' ");



        //关闭单一的SQL操作句柄
        st.close();
        //关闭数据库连接
        connection.close();
    }
}

 statement:

实现这个接口的对象,专门用来向数据库发生SQL语句,并且这个接口类的抽象方法定义的名字都是一样的,方法里面传递的参数都是sql.

 第二种

preparestatement先用占位符?站位,然后通过setobject 方法赋值,写起来就不用连接符.安全可靠,具体实现如下:

package jdbc;
import java.sql.*;
/*preparestatement 和 statement的区别
相同点都是向数据库发送SQL
不同点,
statement 安全性差
preparestatement 先用占位符?站位,然后通过setobject方法赋值,写起来不用连接字符串,安全可靠
在赋值时进行检测,可以防止sql注入攻击如"or 1 = 1" 检测到有两个字符串,就会报错. 若是第一种,则删除操作时,回将整个表删除(若没有外键约束).查询查询整张表.
*
* */
//向数据库插入数据
public class deom3 {
    public static void main(String[] args) {
        try {
            new deom3().save("小三",12,"2003-06_17", "19025284617", "男","陕西西安", 1.80, 5 );
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    public void save(String name, int num ,String birthday ,String phone, String gender,String address ,double height ,int majorid) throws ClassNotFoundException, SQLException {
        //加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");//反射实现
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/学生?serverTimezone=Asia/Shanghai","root","root");
        //发送
        //预先编译sql
        PreparedStatement ps = connection.prepareStatement("insert into student(name,num ,birthday ,phone,gender,address,height,majorid)values(?,?,?,?,?,?,?,?)");
       //然后传参
        ps.setObject(1, name);
        ps.setObject(2, num);
        ps.setObject(3,birthday);
        ps.setObject(4, phone);
        ps.setObject(5, gender);
        ps.setObject(6, address);
        ps.setObject(7,height);
        ps.setObject(8, majorid);

        //执行
        ps.executeUpdate();

        //关闭单一的SQL操作句柄
        ps.close();
        //关闭数据库连接
        connection.close();
    }
}

查询操作 :

第一种

        当查询结果只有一行时,JAVA是面向对象的,查询语句中将查询到的结果将这行数据封装到对象中.步骤如下

        定义一个学生类相当于数据库中的表名,其中的变量如name,num,gender相当于数据库中的列名,将从数据库中查到的列名用set()方法赋值到对象的变量中,然后利用改写toString方法输出,

具体代码实现如下

package jdbc;

import java.sql.*;

public class deom4 {
    public static void main(String[] args) {
        try {
            student st =  new deom4().findstudentByNum(5);
            System.out.println(st.toString());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    public student findstudentByNum(int num) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");//反射实现
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/学生?serverTimezone=Asia/Shanghai","root","root");
        PreparedStatement ps = connection.prepareStatement("select num ,name ,gender ,birthday ,phone ,reg_time from student where num=?");
        ps.setObject(1, num);
        //查询操作
        ResultSet rs =  ps.executeQuery();//将查询的结果封装到result对象中,需要ResultSet对象封装到对象中
        student st = null;
        //结果集中有数据返回true否则false
        while(rs.next())
        {
            //创建学生对象,将获取到的结果封装到学生类中.
            st = new student();
            st.setNum(rs.getInt("num"));
            st.setName(rs.getString("name"));
            st.setGender(rs.getString("gender"));
            st.setBirthday(rs.getString("birthday"));
            st.setPhone(rs.getString("phone"));
            st.setReg_time(rs.getTimestamp("reg_time"));
        }
rs.close();
        ps.close();
        connection.close();
        return st ;
    }

}

定义的student类,用来装数据库中查询到的结果. 

package jdbc;

import java.util.Date;

public class student {
    private int  num ;
    private String name ;
    private String gender;
    private String birthday;
    private String phone ;
    private Date reg_time ;

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    @Override
    public String toString() {
        return "student{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", birthday='" + birthday + '\'' +
                ", phone='" + phone + '\'' +
                ", reg_time=" + reg_time +
                '}';
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Date getReg_time() {
        return reg_time;
    }

    public void setReg_time(Date reg_time) {
        this.reg_time = reg_time;
    }
}

 第二种:

        当查询结果有多条语句时,就要用到java中的集合ArrayList来装数据库中查询到的多条记录,

将查询到的每一条student对象全部用arraylist中的add方法添加到arraylist中去,然后输出arraylist

集合.

具体实现如下:

package jdbc;

import java.sql.*;
import java.util.ArrayList;
import java.util.Collection;

public class deom5 {
    public static void main(String[] args) {
        try {
            ArrayList <student> students =  new deom5().findstudentByGender("男");
            System.out.println(students);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    public ArrayList<student> findstudentByGender(String gender) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");//反射实现
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/学生?serverTimezone=Asia/Shanghai","root","root");
        PreparedStatement ps = connection.prepareStatement("select num ,name ,gender ,birthday ,phone ,reg_time from student where gender=?");
        ps.setObject(1, gender);
        ArrayList<student> students  = new ArrayList<>();//创建学生集合,存储多个学生对象
        //查询操作
        ResultSet rs =  ps.executeQuery();//将查询的结果封装到result对象中,需要ResultSet对象封装到对象中

        //结果集中有数据返回true否则false
        while(rs.next())
        {
            //每循环一次创建一个学生对象
            student st = new student();
            st.setNum(rs.getInt("num"));
            st.setName(rs.getString("name"));
            st.setGender(rs.getString("gender"));
            st.setBirthday(rs.getString("birthday"));
            st.setPhone(rs.getString("phone"));
            st.setReg_time(rs.getTimestamp("reg_time"));
            //将学生对象存入到学生集合之中去
            students.add(st);
        }
rs.close();
        ps.close();
        connection.close();
        return students ;
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1691695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

esp32开发中CMakeLists.txt文件在编译时添加打印信息

在使用CMakeLists.txt文件时&#xff0c;我们时常会对一些宏定义表示的具体路径表示迷茫&#xff0c;不太确定具体表示的路径是哪个&#xff0c;这个时候就希望能在编译的时候打印当前文件中使用的宏定义表示的路径的具体信息。 就像下图中&#xff0c;编译时打印出 CMAKE_CU…

牛客NC391 快乐数【simple 模拟法 Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/293b9ddd48444fa493dd17da0feb192d 思路 直接模拟即可Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值…

serverless在点淘的质量保障实践

SERVERLESS能够将应用分为研发域和运维域&#xff0c;使两者独立迭代&#xff0c;降低运维成本&#xff0c;提升研发效率。点淘作为试点项目&#xff0c;经历了包括功能回归、压力测试和监控验证在内的质量保障流程&#xff0c;并在实践中遇到了各种问题&#xff0c;如依赖梳理…

VOS3000被DDOS攻击后该怎么办

VOS3000遭受DDoS攻击的应对措施 当VOS3000遭受DDoS攻击时&#xff0c;可以采取以下几个步骤来应对&#xff1a; 立即启动防火墙&#xff1a;尽管难以完全阻止DDoS攻击&#xff0c;但防火墙可以在一定程度上帮助抵御攻击&#xff0c;减轻其造成的危害。 联系服务器提供商&#…

抖音小店新规重磅来袭!事关店铺流量!商家的福音来了?

大家好&#xff0c;我是喷火龙。 就在前两天&#xff0c;抖店发布了新规&#xff0c;我给大家总结了一下&#xff0c;无非就是两点。 第一点&#xff1a;保证金下调&#xff0c;一证开多店。 第二点&#xff1a;新品上架破10单&#xff0c;有流量扶持。 咱来细细的解读&…

人生苦短,我学python之数据类型(下)

个人主页&#xff1a;星纭-CSDN博客 系列文章专栏&#xff1a;Python 踏上取经路&#xff0c;比抵达灵山更重要&#xff01;一起努力一起进步&#xff01; 目录 一.集合 1.1子集与超集 1.2交集&#xff0c;并集&#xff0c;补集&#xff0c;差集 1.intersection(英文&a…

学习笔记——STM32F103V3版本——HC-05模块控制数码管

一.硬件 1.HC-05模块 2.数码管 3.连接硬件 二.在keil5中的代码 main.c代码&#xff1a; #include "stm32f10x.h" #include "buletooth.h" #include "led.h" #include "sys.h" #include "usart.h" #include "delay.…

python实用系列:按顺序重命名文件

啊&#xff0c;好久没更博客了&#xff0c;今天偶然想换个桌面壁纸&#xff0c;于是上网搜了两个比较满意的桌面壁纸&#xff0c;都是压缩包&#xff1a; 当我想要给他们放到我的桌面壁纸文件里的时候患了难&#xff0c;因为他们的名字有相同的&#xff1a; anime文件夹里边&a…

el-select可选择可搜索可输入新内容

需求&#xff1a;el-form-item添加el-select&#xff0c;并且el-select可选择可搜索可输入新内容&#xff0c;并且和其他的el-input做联动&#xff0c;如果是选择&#xff0c;那么el-input自动回填数据并且不可编辑&#xff0c;如果el-select输入新的内容&#xff0c;那么el-in…

js禁止使用浏览器的前进后退按钮的方法

效果图&#xff1a; // 替换当前页面的历史记录&#xff0c;使用户不能通过浏览器的前进后退按钮导航 history.replaceState(null, null, location.href);// 监听浏览器的历史记录变化事件 window.onpopstate function(event) {// 再次替换当前页面的历史记录&#xff0c;确保…

接口使用实例——数组排序

对于基本数据类型的大小比较&#xff0c;我们可以使用<,>,或者equals方法进行比较&#xff0c;但是对象之间如何进行比较呢&#xff1f;要对对象进行比较&#xff0c;我们必须对同一个成员变量进行比较&#xff0c;如我们可以通过比较name的大小来得出两个对象的大小&…

四万字长文详解——node.js使用移动云,EOS对象存储

目录 前言 安装及安装前的操作 前置条件 如何创建认证信息 使用npm安装SDK开发包 安装开发包命令 初始化操作 存储桶 查看结果命令 查看桶列表 查看结果命令 删除桶 查看结果命令 创建桶 获取桶列表 判断桶是否存在 查询桶所属地域 查询桶的访问权限 管理桶的…

前后端 | 低代码平台之 Erupt

前文提要 最近大家是不是都有那种危机感&#xff0c;项目变多了&#xff0c;工时压紧了&#xff0c;老板说&#xff0c;我不管你加不加班&#xff0c;我只看结果&#xff0c;项目经理说&#xff0c;我不管你用什么技术栈&#xff0c;我只要没BUG&#xff0c;测试说&#xff0c…

【算法】分治 - 快速排序

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、颜色分类二、排序数组三、数组中的第k个数四、最小的k个数总结 引言 本节主要介绍快速排序&#xf…

类图的六大关系

类图中的六大关系包括&#xff1a;继承关系、实现关系、关联关系、聚合关系、组合关系和依赖关系。 1. 继承关系 继承是一种类与类之间的关系&#xff0c;表示一种泛化和特化的关系。子类继承父类的特性和行为。 class Animal {void eat() {System.out.println("This an…

足球走地全自动化操作软件实现过程

本次采用selenium实现自动化操作的流程 打开浏览器录入账号密码等待数据请求&#xff08;监听&#xff09;有新数据&#xff0c;进行自动化操作通过homeName搜索&#xff0c;找到对应数据找到对应的类型&#xff08;让、大小…&#xff09;找到对应的盘口输入数量提交 附登录…

系统资源监控器工具glances的使用详解

目录 1、glances工具介绍 2、安装方式 3、glances的工具界面说明 4、常用的参数选项 5、常用快捷键说明 1、glances工具介绍 glances可以分析系统的 CPU使用率、内存使用率、内核统计信息和运行队列信息磁盘I/O速度、传输和读/写比率、磁盘适配器网络I/O速度、传输和读/写…

华为编程题目(实时更新)

1.大小端整数 计算机中对整型数据的表示有两种方式&#xff1a;大端序和小端序&#xff0c;大端序的高位字节在低地址&#xff0c;小端序的高位字节在高地址。例如&#xff1a;对数字 65538&#xff0c;其4字节表示的大端序内容为00 01 00 02&#xff0c;小端序内容为02 00 01…

电脑远程控制另一台电脑怎么弄?

可以远程控制另一台电脑吗&#xff1f; “你好&#xff0c;我对远程访问技术不太了解。现在&#xff0c;我希望我的朋友可以远程控制我的Windows 10电脑&#xff0c;以便她能帮我解决一些问题。请问&#xff0c;有没有免费的方法可以实现这种远程控制&#xff1f;我该如何操作…

如何选择一个最强大模型-看最硬核排名了!

Chatbot Arena由伯克利大学主导团队 LMSYS Org 发布了一个针对大语言模型的基准平台 Chatbot Arena。该平台采用匿名、随机的方式让不同的大模型产品进行对抗评测&#xff0c;基于国际象棋等竞技游戏中广泛使用的埃洛等级分系统&#xff0c;通过用户投票产生&#xff0c;系统每…