Mysql与Java连接----JDBC

前言:

当将Java与MySQL数据库连接时,JDBC(Java Database Connectivity)是一种重要的技术。JDBC允许Java应用程序通过标准的数据库访问方式与不同的关系型数据库进行通信,其中包括MySQL。通过使用JDBC,Java开发人员可以轻松地执行数据库操作,如查询数据、更新数据和执行存储过程等。

在本文中,我们将探讨如何使用JDBC来连接MySQL数据库。首先,我们将介绍JDBC的基本概念,包括驱动程序、连接URL和基本的数据库操作。然后,我们将详细说明如何在Java应用程序中配置和使用JDBC驱动程序来连接MySQL数据库。我们将覆盖建立连接、执行查询、插入和更新数据以及关闭连接等方面的重要步骤。

无论您是初学者还是有经验的Java开发人员,本文都将为您提供足够的信息来开始在Java应用程序中使用JDBC与MySQL数据库进行交互。通过掌握这些基础知识,您将能够构建更强大、更可靠的数据库驱动的Java应用程序,并更好地理解Java与数据库之间的交互过程。

接下来,让我们深入研究JDBC的基础知识,并开始探索如何在Java应用程序中利用JDBC来连接MySQL数据库。

作者建议:学习知识在于深度理解,多动手、多动脑,总能更快地领悟。不要仅仅停留在阅读代码的层面,亲自动手敲打一遍,会带来更丰富的收获。通过实践,我们能够更深入地理解知识,掌握技能,并且在解决问题时更加得心应手。相信自己的能力,坚持不懈地实践,你将会取得更大的进步和成就。让学习成为一种习惯,让动手实践成为你提升的捷径,加油!你是最棒的!

目录

概述

JDBC搭建

在项目中添加jar文件

注册JDBC驱动程序:

初始化驱动程序 ----- 这样就打开与数据库的通信通道

建立与数据库连接

发送sql

Statement

PrepareStatement

关闭数据库

preparedStatement和Statement的区别

查询所有信息---ResultSet executeQuery() 


概述

JDBC全程:Java DataBase connection  ----  java数据库连接

java可以连接不同的数据库,但是不同的数据库具体连接细节不同.

连接: java设计出一系列的连接数据库的接口规范,然后有不同的数据库连接开发商去实现数据库的具体连接.    接口oper,开发商去实现接口,然后重写接口中方法.

JDBC API:

供程序员调用的接口与类,集成在java.sql包中

DriverManager类作用:管理各种不同的jDBC驱动

Connection 接口 与特定数据库的连接

Statement 接口 执行sql

PreparedStatement接口 执行sql

ResultSet接口 接收查询结果

mysql-connector-java-8.0.16.jar 就是mysql官方开发实现,具体连接数据库功能代码

JDBC搭建

在项目中添加jar文件

        在项目下创建lib目录

     将下载好的jar文件拖入lib中

     右键jar文件找到这个启用就OK了

注册JDBC驱动程序:

初始化驱动程序 ----- 这样就打开与数据库的通信通道

Class.forName(“com.mysql.cj.jdbc.Driver”); //反射实现

或者 DriverManager.registerDriver(new Driver());

建立与数据库连接

DriverManager.getConnection() 创建一个Connection对象

Connection conn = DriverManager.getConnection(URL,USER,PASSWORD);

URL---jdbc:mysql://ip(本地:127.0.0.1):端口(3306)/数据库名?serverTimezone=Asia/Shanghai

通常只需要改变 数据库名  ip(如果与自己连接ip:127.0.0.1)  端口号(创建数据库的时候设置) 其他的不变

USER:用户名字---创建数据库设置    PASSWORD:用户密码---创建数据库设置

发送sql

Statement st = connection.createStatement();

executeUpdate(String sql) ---- 用来发送sql

实例:这个语句就给mysql数据库中发送一条数据,用来给student数据库添加数据

Statement st = connection.createStatement();
st.executeUpdate("INSERT INTO student(NAME,gender,birthday,phone,address,reg_time,majorid)"+"VALUES('"+name+"','"+gender+"','"+birthday+"','"+phone+"','"+address+"',now(),"+majorid+") ");
Statement

Satement中的方法:

Int executeUpdate(String sql) 用于执行ddl语句和dml(增,删,改)语句返回操作的行数

用于执行ddl语句返回0

用于执行dml语句返回操作的行数

增添数据

    public static void main(String[] args) {try {set_value("素烧","男", "2022-2-2", "15235465236", "汉中", 2);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException throwables) {throwables.printStackTrace();}}   public static void set_value(String name, String gender, String birthday, String phone, String address, int majorid) throws ClassNotFoundException, SQLException {//加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//建立与数据库的链接,或得连接对象String url = "jdbc:mysql://127.0.0.1:3306/shooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url, user, password);//发送Statement st = connection.createStatement();st.executeUpdate("INSERT INTO student(NAME,gender,birthday,phone,address,reg_time,majorid)"+"VALUES('"+name+"','"+gender+"','"+birthday+"','"+phone+"','"+address+"',now(),"+majorid+") ");//关闭数据库连接st.close();connection.close();}

修改数据

    public static  void XiuGai(int num,String name, String gender, String birthday, String phone, String address, int majorid) throws ClassNotFoundException, SQLException {//加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//建立与数据库的链接,或得连接对象String url = "jdbc:mysql://127.0.0.1:3306/shooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url, user, password);//发送Statement st = connection.createStatement();st.executeUpdate("UPDATE student SET name = '" + name + "', gender = '" + gender + "' WHERE num = 1");//关闭数据库连接st.close();connection.close();}
PrepareStatement

在sql语句中参数位置使用占位符,使用setXX方法向sql中设置参数

PrepareStatement ps = connection.prepareStatement(sql);

PrepareStatement中的方法:

Int executeUpdate() 用于执行ddl语句和dml(增,删,改)语句返回操作的行数

用于执行ddl语句返回0

用于执行dml语句返回操作的行数

增添数据

    public static void set_value(String name, String gender, String birthday, String phone, String address, int majorid) throws ClassNotFoundException, SQLException {//加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//建立与数据库的链接,或得连接对象String url = "jdbc:mysql://127.0.0.1:3306/shooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url, user, password);
//?占位符,表示此处需要接收一个参数        PreparedStatement ps = connection.prepareStatement("insert into student(name,gender,birthday,phone,address,reg_time,majorid)" + "values (?,?,?,?,?,now(),?)");ps.setObject(1, name);ps.setObject(2, gender);ps.setObject(3,birthday);ps.setObject(4,phone);ps.setObject(5,address);ps.setObject(6,majorid);//启动ps.executeUpdate();ps.close();connection.close();}

修改数据 

    public static  void XiuGai(int num,String name, String gender, String birthday, String phone, String address, int majorid) throws ClassNotFoundException, SQLException {//加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//建立与数据库的链接,或得连接对象String url = "jdbc:mysql://127.0.0.1:3306/shooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url, user, password);PreparedStatement ps = connection.prepareStatement("update student set name = ?,gender = ?,birthday = ?,phone = ?,address = ?,majorid = ? where num = ?");ps.setObject(1, name);ps.setObject(2, gender);ps.setObject(3,birthday);ps.setObject(4,phone);ps.setObject(5,address);ps.setObject(6,majorid);ps.setObject(7,num);//启动ps.executeUpdate();//关闭ps.close();connection.close();}

关闭数据库

st.close(); --- 关闭发送

connection --- 关闭连接

preparedStatement和Statement的区别

相同点:都是向数据库发送sql

Statement :将参数直接拼接到sql中,要拼接字符串,写起来麻烦,安全性差 如果:删除参数加一个 or 1=1 可以直接将全部数据删除

preparedStatement:先用?占位,然后通过setObject方法赋值,写起来不用拼接字符串,安全可靠的在赋值时进行检测(?---setObject()执行会检测数据,占位符只能接受一个数据所以有or的时候就会直接报错),可以防止sql注入攻击

如果传进去多个值就会报错

如果你的删除demo2.delete("112 or 1=1"); 传参进去这样  

查询所有信息---ResultSet executeQuery() 

ResultSet executeQuery()  将查询结果封装到一个ResultSet对象中,需要将ResultSet对象的数据封装到对应的对象中.

实例:将数据库的数据全部拿出,并且赋给student类

    public ArrayList<Student> findStudentByGender(String gender) throws ClassNotFoundException, SQLException {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url,user,password);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();//将查询结果封装到一个ResultSet对象中, 需要将ResultSet对象中的数据封装到对应的对象中//next() 如果结果集中有数据返回true,否则返回falsewhile (rs.next()){//每循环一次,拿到一个学生对象Student student =  new Student();student.setNum(rs.getInt("num"));student.setName(rs.getString("name"));student.setGender(rs.getString("gender"));student.setBirthday(rs.getDate("birthday"));student.setPhone(rs.getString("phone"));student.setRegTime(rs.getTimestamp("reg_time"));students.add(student);//将学生对象存入到学生集合中}rs.close();ps.close();connection.close();return students;}

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

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

相关文章

二叉树的前序、中序、后序遍历

二叉树的前序、中序、后序 1.二叉树的前序遍历 题目&#xff1a; 二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff…

aigc的基础知识介绍

AIGC,即人工智能生成内容(Artificial Intelligence Generated Content),是一种利用人工智能技术自动生成各种形式内容的技术。以下是关于AIGC的基础知识介绍: 定义:AIGC指的是利用人工智能技术和算法来自动生成各种形式的内容,如文本、图像、音频和视频等。 发展历程:A…

LeetCode题练习与总结:不同的二叉搜索树Ⅱ--95

一、题目描述 给你一个整数 n &#xff0c;请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,nul…

Unity自定义动画-Animation动画数据-How is “fileIDToRecycleName“ generated

一般美术和程序分工明确的项目 fbx确实是和动画一一对应的&#xff1b; 但一些独立&#xff0c;或者小工作室的项目&#xff0c;就没法保证了&#xff0c;关键还是在于 Unity的 .meta 目录 查找和对比了一下 .fbx 和 .meta&#xff1a; 缓存和不缓存Animation 具体的Animat…

HCIP-Datacom-ARST自选题库_03_VLAN【26道题】

一、单选题 1.QinQ技术是一项扩展VLAN空间的技术&#xff0c;通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来达到扩展VLAN空间的功能。下列关于QinQ说法错误的是 灵活QinQ可以根据不同的内层Tag而加上不同的外层Tag&#xff0c;对于用户VLAN的划分更加细致 QinQ使VLA…

Golang | Leetcode Golang题解之第86题分隔链表

题目&#xff1a; 题解&#xff1a; func partition(head *ListNode, x int) *ListNode {small : &ListNode{}smallHead : smalllarge : &ListNode{}largeHead : largefor head ! nil {if head.Val < x {small.Next headsmall small.Next} else {large.Next hea…

栈的详尽技术分析

栈的详尽技术分析 一、引言 在计算机科学的领域中&#xff0c;数据结构是组织和管理数据的方式&#xff0c;对于编写高效算法而言至关重要。栈作为一种特殊的数据结构&#xff0c;其应用广泛&#xff0c;对理解程序语言的编译、内存管理以及算法设计等方面都有重要意义。 二、栈…

ue引擎游戏开发笔记(39)——npc的ai设定:追踪玩家以及瞄准

1.需求分析&#xff1a; 实现对npc的击杀和死亡反馈后&#xff0c;下一步需要赋予npc基本的ai&#xff0c;首先就是敌人要能够追踪或者说跟随玩家&#xff0c;这才能为后续npc开枪&#xff0c;对射做好准备&#xff0c;首先实现追踪玩家。 2.操作实现&#xff1a; 1.思路&…

代码随想录第六天打卡|242.有效的字母异位词,349. 两个数组的交集,202. 快乐数

242.有效的字母异位词 Python from collections import Counter class Solution:def isAnagram(self, s: str, t: str) -> bool:nCounter(s)mCounter(t)return nm C class Solution { public:bool isAnagram(string s, string t) {int Map[26]{0};for (int i0;i<s.s…

数据结构填空题专项.docx

1. 根据数据元素间关系的不同特性&#xff0c;通常可分为集合、线性 、树形 、图状 四 类基本结构。 2. 算法的 5 个特征包括&#xff1a; 有穷性、确定性 、有效性、输入和输出。 3. 数据结构中的数据元素存在“一对多”的关系称为 树形 结构。 4. 在包含 n 个元素的…

2024.5组队学习——MetaGPT智能体理论与实战(待续)

学习资料&#xff1a;项目地址——hugging-multi-agent、在线阅读、MetaGPT项目、MetaGPT中文文档 文章目录 一、环境配置1.1 配置MetaGPT1.2 配置大模型api_key1.3 测试demo 一、环境配置 全部工作在Autodl上完成&#xff0c;下面是简单记录&#xff1a; 1.1 配置MetaGPT 下…

不好!有敌情,遭到XSS攻击【网络安全篇】

XSS&#xff1a;当一个目标的站点&#xff0c;被我们用户去访问&#xff0c;在渲染HTMl的过程中&#xff0c;出现了没有预期到的脚本指令&#xff0c;然后就会执行攻击者用各种方法注入并执行的恶意脚本&#xff0c;这个时候就会产生XSS。 涉及方&#xff1a; 用户&#xff0…

前端铺子-uniapp移动端:跨平台开发新篇章

一、引言 在移动应用开发领域&#xff0c;随着技术的不断进步&#xff0c;用户对应用的需求也日益多样化。如何快速、高效地开发跨平台应用成为了前端开发者面临的一大挑战。uni-app作为一款使用Vue.js开发所有前端应用的框架&#xff0c;凭借其一次编写、多端运行的特性&…

Vue Excel 文件流导出乱码快速解决方案

今日在开发一个导出功能&#xff0c;原本一个非常简单的功能&#xff0c;却没想里面藏了陷阱&#xff01; 背景 前端导出的文件流乱码&#xff0c;此时确定非后端问题&#xff08;可以在postman导出是否正常来判断&#xff09;。 前端导出&#xff1a; 后端正常数据&#xf…

Nature 综述(IF=88):微生物群落和土壤性质之间的相互作用

随着社会的发展&#xff0c;环境污染和自然资源的消耗日益严重&#xff0c;土壤生态系统的健康状况备受关注。然而&#xff0c;当前研究领域存在一个问题&#xff0c;即在研究土壤微生物群落结构的同时&#xff0c;忽略了微生物对土壤环境的影响。本文旨在探讨微生物如何通过生…

『大模型笔记』MIT 最新的科尔莫戈洛夫-阿诺德网络(Kolmogorov-Arnold Network,KAN)简介

MIT 最新的科尔莫戈洛夫-阿诺德网络(Kolmogorov-Arnold Network,KAN)简介 文章目录 一. 探索 AI 下一前沿:科尔莫戈洛夫-阿诺德网络(KAN)1.1 基础回顾:多层感知器(MLPs)1.2 引入科尔莫戈洛夫-阿诺德网络(KAN)1.3 神经网络架构的开创性变革四. 参考文献内容出自:htt…

submitUpload() { this.$refs.upload.submit(); },

submitUpload() {this.$refs.upload.submit();}, submitUpload() 是一个函数&#xff0c;调用该函数会将 Vue 组件中的上传组件中的文件上传到服务器上。这个函数通过 this.$refs.upload.submit() 来实现&#xff0c;其中 this.$refs.upload 可以获取到上传组件的 DOM 对象&am…

js怎么判断视频链接是否能播放

标题js怎么判断视频链接是否能播放 这个函数用提供的URL创建一个新的Video元素&#xff0c;并根据视频是否可以播放来解析一个Promise。它监听canplaythrough事件来确定视频是否可播放&#xff0c;并监听error事件来处理可能发生的任何错误。 function canPlayVideo(url) {re…

【树】简要理解树的概念

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、树的概念2、树的相关概念3、结语 1、树的概念 树是一种非线性的数据结构&#xff0c;它…

js通过音频链接获取音频时长

js通过音频链接获取音频时长 要在JavaScript中从音频链接获取音频文件的持续时间&#xff0c;您可以使用fetch API来检索音频文件&#xff0c;然后使用audio API来获取持续时间。例子: function getAudioDuration(audioUrl) {return fetch(audioUrl).then((response) > re…