JDBC总结

目录

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

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么理解直接程序控制和中断方式?

直接程序控制 看完之后是不是依然一头雾水&#xff1f;来看下面两个例子 无条件传送 假设你正在使用键盘打字。当你敲击键盘上的一个键时&#xff0c;键盘会立即产生一个信号&#xff08;即输入数据&#xff09;&#xff0c;并且这个信号会立即被电脑接收。在这个过程中&…

颜色值进制转换

颜色值进制转换 专业的和非专业程序员在编程时都碰到过颜色值的表达式。特别是在编制网页和设计界面时&#xff0c;都要选择颜色。各语言的颜色值表达式就两种&#xff0c;十六进制的颜色值hex$和十进制的RGB格式。现成的调色板颜色表也是这两种格式。写代码时会遇到写颜色值码…

懒人网址导航页 search.html SQL注入漏洞复现

0x01 产品简介 懒人网址导航系统是一种智能化的网址导航平台,旨在帮助用户快速找到所需的网址和资源。该系统提供了智能化的网址搜索和推荐功能,能够根据用户的搜索习惯和偏好推荐相关的网址和资源。同时,系统还提供了网址分类、网址收藏和网址分享等功能,方便用户管理和共…

镜子摆放忌讳多

镜子是我们日常生活中不可或缺的物品。在风水中&#xff0c;镜子的作用非常多&#xff0c;能够起到一定的作用。镜子的摆放位置也是非常有讲究的&#xff0c;摆放不好会直接影响到家人的事业、财运、婚姻乃至健康等诸多方面。 第一个风水忌讳&#xff0c;镜子对大门。大门的正前…

服务器硬件全攻略:从入门到精通,全面解析服务器性能与稳定性!

服务器是计算机网络中提供特定服务的计算机系统&#xff0c;其硬件配置和性能直接影响到整个网络系统的运行效率和稳定性。作为一个资深的技术人员&#xff0c;本文将全面详细地介绍服务器硬件基础知识&#xff0c;包括介绍、命令或语法、主要作用以及使用方法等。 一、介绍 服…

CV大作业28期-使用TensorFlow快速实现图像风格迁移系统

使用TensorFlow快速实现图像风格迁移系统 资源地址&#xff1a;待更新 视频地址&#xff1a;待更新 随着GPT的横空出世&#xff0c;生成式网络也越来越活&#xff0c;现在的大语言模型除了能回答文字上面的内容&#xff0c;并且在图像和视频创作中也表现除了巨大的潜力&#xf…

探索 Mistral 新发布的具有原生函数调用功能的 7B 模型【附notebook文件】

引言 Mistral 发布了新版的 7B 模型&#xff0c;这次更新引入了原生函数调用功能。对于开发者和 AI 爱好者来说&#xff0c;这一更新极具吸引力&#xff0c;因为它增强了模型的功能和实用性。在这篇博客中&#xff0c;我们将深入探讨这些新功能&#xff0c;展示如何使用该模型…

击穿盲点——【网络安全】社会工程学中的网络欺骗

社会工程学起源于上世纪60年代左右&#xff0c;是一种通过人际交流的方式来获得情报的非技术渗透手段。这种手段无需过多技术要求&#xff0c;却非常有效&#xff0c;目前已成为危害企业网络安全的重大威胁之一。著名黑客凯文米特尼克在《反欺骗的艺术》中曾提到&#xff0c;人…

深入理解计算机系统 家庭作业4.52

练习题4.3 p.254 \sim\seq\seq-full.hcl文件内已经说的很清楚了哪些不能更改,哪些是题目要求更改的控制逻辑块. 依据家庭作业4.51的答案,在seq-full.hcl文件内更改对应的HCL描述即可 以下答案注释了#changed的就是更改部分 #/* $begin seq-all-hcl */ ######################…

MFC GDI 绘图模式、映射模式、画笔、笔、字体

一 GDI 绘图模式&#xff08;RoP2 Mode&#xff09; 在使用VC MFC进行图形程序编程时&#xff0c;常会用到GDI绘图指令&#xff0c;而要做到绘图时有橡皮筋动态效果&#xff0c;就需设置GDI绘图模式。GDI绘图模式有多种&#xff0c;如下&#xff1a; 常用R2_NOT模式来实…

TXT文本编辑器:一键提取,多关键字匹配,内容尽在掌控!

在浩如烟海的文档中&#xff0c;寻找关键信息往往是一项繁琐而耗时的任务。你是否曾经为了查找某个关键字而翻遍了整个文件夹&#xff0c;却仍然一无所获&#xff1f;现在&#xff0c;有了TXT文本编辑器&#xff0c;这一切都将变得轻松而高效 这款软件以其简洁明了的操作界面和…

VBA_MF系列技术资料1-615

MF系列VBA技术资料1-615 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-0…

17.分类问题

机器学习分类问题详解与实战 介绍 在机器学习中&#xff0c;分类问题是一类常见的监督学习任务&#xff0c;其目标是根据输入特征将数据样本划分为预先定义的类别之一。分类问题广泛应用于各个领域&#xff0c;如图像识别、自然语言处理、金融风险评估等。本文将详细介绍机器…

Java的线程的使用

一.两种创建线程的方式 1.继承Thread类&#xff08;匿名内部类&#xff09; 创建方式&#xff1a; 1.定义一个子类继承Thread&#xff0c;重写run方法 2.创建子类对象&#xff0c; 3.调用子类对象的start方法&#xff08;启动还是执行的run方法&#xff09; 优缺点&#x…

vue3 ts问题 找不到模块“@/views/home/index.vue”或其相应的类型声明。

1. 找不到模块“/views/HomeView.vue”或其相应的类型声明 今天帮同事看了一个问题&#xff0c;他尝试用vitevue3tspinia创建项目&#xff0c;结果刚上来就遇到这么一个问题 2. 解决办法 出现这个问题的原因就是&#xff1a;ts只支持导出导入模块&#xff0c;但是vue不是模块…

Java——接口后续

1.Comparable 接口 在Java中&#xff0c;我们对一个元素是数字的数组可以使用sort方法进行排序&#xff0c;如果要对一个元素是对象的数组按某种规则排序&#xff0c;就会用到Comparable接口 当实现Comparable接口后&#xff0c;sort会自动调用Comparable接口里的compareTo 方法…

HIVE3.1.3+ZK+Kerberos+Ranger2.4.0高可用集群部署

目录 一、集群规划 二、介质下载 三、基础环境准备 1、解压文件 2、配置环境变量 四、配置zookeeper 1、创建主体 2、修改zoo.cfg 3、新增jaas.conf 4、新增java.env 5、重启ZK 6、验证ZK 五、配置元数据库 六、安装HIVE 1、创建Hiver的kerberso主体 2…

马尔可夫和比奈梅-切比雪夫不等式

目录 一、说明 二、自然界的极限性 三、马尔可夫不等式 3.1 最早提出 3.2 马尔可夫不等式的证明 四、 Bienaym–Chebyshev 不等式 4.1 简要回顾Bienaym–Chebyshev 不等式的历史 4.2 Bienaym — Chebyshev 不等式的证明 五、弱大数定律&#xff08;及其证明&#xff09;…

kafka学习笔记05

Consumer消费者重新分配策略和offset维护机制 我们会打印很多kafka的日志。 我们现在可以去关闭kafka的日志&#xff1a; 创建日志配置。 这样就只有Info级别的日志可以打印出来了。 改成debug级别可以输出比较多的日志。 Kafka消费者Consumer消费消息配置实战 生产者发送消息…

ArcGIS不同图斑设置不同的透明度

对于设置一个图层的整体的透明度&#xff0c;我们在 ArcGIS制作带蒙版的遥感影像地图http://mp.weixin.qq.com/s?__bizMzIzNjM2NTYxMg&mid2247509080&idx1&sn38dccf0a52bb3bb3758f57114ee38b72&chksme8da161bdfad9f0d363da90959a8524dcf2b60d0e8d999f8ebeef0…