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);//发送sqlStatement 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");//发送//预先编译sqlPreparedStatement 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否则falsewhile(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;}@Overridepublic 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否则falsewhile(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.mzph.cn/web/14923.shtml

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

相关文章

一文讲清!传统企业的进销存管理难题该怎么解决?

有没有开源的进销存软件啊&#xff1f; 确实&#xff0c;市面上存在不少开源的进销存软件。但客观地讲&#xff0c;开源软件往往面临着安全隐患&#xff0c;因为代码公开&#xff0c;容易成为黑客攻击的目标。此外&#xff0c;开源软件的功能模块通常较为固定&#xff0c;难以…

初出茅庐的小李博客之MQTT.fx客户端接入EMQX Platform

EMQX Platform 概览 EMQX Platform 是 EMQ 推出的一款面向物联网领域的 MQTT 消息中间件产品。作为全球首个 MQTT 5.0 消息云服务&#xff0c;EMQX Platform 提供了一站式运维代管、独有隔离环境的 MQTT 消息服务。在万物互联的时代&#xff0c;EMQX Platform 可以帮助您快速构…

python数据类型之列表

目录 1.创建列表 2.列表基础操作 常用操作 对列表元素顺序随机打乱 列表下标和切片 字符串分割为列表 列表位移 列表切片替换 3.列表内置方法 4.列表排序 简单排序 使用key参数按指定规则排序 二维列表排序 自定义排序规则函数 5.列表排序算法 选择排序 柱状图…

C# 利用Xejen框架源码,我们来开发一个基于Dapper技术的数据库通用的帮助访问类,通过Dapper的增删改查,可以访问Sqlite数据库

Dapper 是一个轻量级的对象关系映射&#xff08;ORM&#xff09;工具&#xff0c;适用于 .NET 平台。它由 Stack Overflow 团队开发&#xff0c;旨在提供简单、高效的数据访问功能。与其他重量级 ORM&#xff08;如 Entity Framework&#xff09;相比&#xff0c;Dapper 更加轻…

基于Python图像增强算法:低光增强+图像修复+超分辨率重建

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在图像处理与计算机视觉领域&#xff0c;图像增强技术是提高图像质量和可用性的重要手段。在实…

单片机io扩展

输入输出扩展 i2c扩展 方案1:PCF8575 PCF8575双向IO口扩展模块 16位输入输出I2C通讯 单片机级联扩展板 方案2&#xff1a;PCA955A 输出扩展 74HC595 io口扩展模块输出口扩展 参考链接 中微爱芯发[2004] 1号           签发人&#xff1a; (szlcsc.com)https://…

❤ Vscode和Idea都可以使用的-AI插件(官方-百度出的)

❤ Vscode和Idea都可以使用的-AI插件&#xff08;官方-百度出的&#xff09; 最新AI特别火&#xff0c;给大家推荐一下最新出的VScode插件&#xff0c;辅助我们写代码&#xff01; 1、下载地址&#xff1a; > https://comate.baidu.com/zh/shopping?inviteCodefkzlak8f …

jmeter中Ultimate Thread Group设计梯度压测场景

Ultimate Thread Group Ultimate Thread Group 线程组是模拟波浪式压测或者阶梯式负载压测 1、Start Threads Count&#xff1a;线程数量 2、Initial Delay&#xff0c;sec&#xff1a;每组开始添加到测试执行之前的延迟&#xff08;xx秒开始启动线程&#xff09; 3、Startu…

python中的线程并行

文章目录 1. 单线程2. 线程池ThreadPoolExecutor 1. 单线程 现在有1154张图片需要顺时针旋转后保存到本地&#xff0c;一般使用循环1154次处理&#xff0c;具体代码如下所示&#xff0c;img_paths中存储1154个图片路径&#xff0c;该代码段耗时约用97ms。 t1time.time() for …

Python筑基之旅-MySQL数据库(四)

目录 一、数据表操作 1、新增记录 1-1、用mysql-connector-python库 1-2、用PyMySQL库 1-3、用PeeWee库 1-4、用SQLAlchemy库 2、删除记录 2-1、用mysql-connector-python库 2-2、用PyMySQL库 2-3、用PeeWee库 2-4、用SQLAlchemy库 3、修改记录 3-1、用mysql-conn…

Java轻松转换Markdown文件到Word和PDF文档

Markdown 凭借其简洁易用的特性&#xff0c;成为创建和编辑纯文本文档的常用选择。但某些时候我们需要更加精致的展示效果&#xff0c;例如在专业分享文档或打印成离线使用的纸质版时&#xff0c;就需要将Markdown文件以其他固定的文档格式呈现。通过将 Markdown 转换为 Word 和…

OpenHarmony实战开发——网络组件axios可以在OpenHarmony上使用了

什么是axios 上古浏览器页面在向服务器请求数据时&#xff0c;因为返回的是整个页面的数据&#xff0c;页面都会强制刷新一下&#xff0c;这对于用户来讲并不是很友好。并且我们只是需要修改页面的部分数据&#xff0c;但是从服务器端发送的却是整个页面的数据&#xff0c;十分…

高效写代码java-推荐插件1(格式转化 ConverterX )-日后待更新

ConverterX 主要功能:格式转化 字符串格式转换 日期转换 Json格式转义 字符格式 快捷键 ctrl shiftS Upper(CODEEASE)字符串全部变成大写Lower(codeease)字符串全部变成小写Camel(codeEase)字符串变成小驼峰ClassCaemel(CodeEase)字符串变成大驼峰UnderlineUpper(CODE_EAS…

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

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

揭秘!亚马逊、Vinted卖家如何借助自养号测评实现爆单?

​作为一名跨境卖家&#xff0c;你一定梦想着能够在亚马逊上实现爆单&#xff0c;让产品火爆销售。下面就分享五个秘诀&#xff0c;帮助你实现这个梦想&#xff1a; 1. 优质产品&#xff1a;首先&#xff0c;确保你的产品质量优秀&#xff0c;能够满足消费者的需求。品质好的产…

基于Matlab使用BP神经网络进行电力系统短期负荷预测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 电力系统的短期负荷预测对于电力调度和能源管理具有至关重要的作用。通过准确地预测电力负荷&…

【产品经理】输出

引言&#xff1a;        在最近频繁的产品管理职位面试中&#xff0c;我深刻体会到了作为产品经理需要的不仅仅是对市场和技术的敏锐洞察&#xff0c;更多的是在复杂多变的环境中&#xff0c;如何运用沟通、领导力和决策能力来引导产品从概念走向市场。这一系列博客将分享…

CAN网络管理(TJA1145如何实现MCU的休眠唤醒)

节点唤醒方式 本地唤醒&#xff1a; 唤醒源来源于自身模块&#xff0c;比如常说的KL15&#xff0c;控制器由KL15线供电&#xff0c;即只能在钥匙置于“ACC”或者“ON”档时运行软件和维持CAN通信 对于正在运行的CPU软件&#xff0c;无论它处在什么状态&#xff0c;只要Hardwa…

Plesk中如何移除之前添加的域名

我这边想要移除我之前绑定到主机的域名&#xff0c;但是不知道如何在主机上面进行移除&#xff0c;由于我使用的Hostease的Windows虚拟主机产品默认带普通用户权限的Plesk面板&#xff0c;但是不知道如何在Plesk上操作移除域名&#xff0c;因为也是对于Hostease主机产品不是很了…

获取和设置代理的动态IP的方式

引言 大家好&#xff0c;今天我来给大家分享一下如何通过编程技术来获取和设置代理的动态IP。在网络世界中&#xff0c;代理和动态IP是非常常见的概念&#xff0c;尤其对于需要大规模访问网站或者需要隐藏真实IP地址的应用程序来说&#xff0c;更是必不可少的工具。接下来&…