Java-MySql:JDBC

目录

JDBC概述

JDBC搭建

1、导入mysql开发商提供的jar包

2、注册驱动

3、与数据库连接

注解: 

Statement:

代码 

运行

PreparedStatement:

代码

运行 

PreparedStatement和Statement 

Statement 

代码

运行

代码

运行

代码

运行

PreparedStatement 

代码

运行

代码

运行

代码

运行

PreparedStatement和Statement 区别

结果集处理

代码

运行

代码

运行

​编辑代码

运行


JDBC概述

jdbc(Java DataBase Connectivity)java语言连接数据库
本模块中,java提供了一组用来连接数据库的类和接口
java语言开发者,本身没有提供如何具体连接数据库的功能,只是定义了一组java程序连接数据库的访问接口。

1、连接到数据库

2、向数据库发送增删改这一类的sql

3、发送查询sql

java语言只需要定义连接数据库的接口,具体的实现交给了不同的数据库开发商

java只需要定义一套接口,就可以连接不同的接口

JDBC搭建

1、导入mysql开发商提供的jar包

2、注册驱动

两种方式:

1、反射方式加载驱动类
      Class.forName("com.mysql.cj.jdbc.Driver");

2 、DriverManager.registerDriver(new Driver());

3、与数据库连接

获得Satement执行sql语句

发送sql语句

关闭与数据库的连接

注解: 

url: jdbc:mysql://127.0.0.1:3306:(端口(3306))

      /schooldb(数据库名)

      ?serverTimezone=Asia/Shanghai" 

user:用户名(root)

password:密码

Statement:

代码 

package com.ffyc.jdbcpro;import com.mysql.cj.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、注册驱动 DriverManager.registerDriver(new Driver());//3、建立与数据库的连接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);System.out.println(connection);//com.mysql.cj.jdbc.ConnectionImpl@25359ed8//发送sqlStatement statement = connection.createStatement();System.out.println(statement);//com.mysql.cj.jdbc.StatementImpl@6166e06fstatement.executeUpdate("insert into major(name)value ('数学')");//关闭与数据库的连接statement.close();connection.close();}
}

运行

PreparedStatement:

代码

package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo3 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//2、注册驱动//反射方式加载驱动类//Class.forName("com.mysql.cj.jdbc.Driver");DriverManager.registerDriver(new Driver());//3、建立与数据库的连接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);//发送sql//? 占位符 表示要插入一个参数PreparedStatement ps = connection.prepareStatement("insert into major(name)value (?)");//1向第一个占位符的位置插入数据ps.setObject(1, "智能");ps.executeUpdate();//关闭与数据库的连接ps.close();connection.close();}
}

运行 

PreparedStatement和Statement 

Statement 

代码
 package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class Demo2 {public static void main(String[] args) throws SQLException {Demo2.insert("元神启","动", "2018-8-23", "12345678910", 1.4);}public static void insert(String name,String gender,String birthday,String phone,double height) throws SQLException {//注册驱动DriverManager.registerDriver(new 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);//发送sqlStatement statement = connection.createStatement();statement.executeUpdate("insert into student(name,gender,birthday,phone,height)value('"+name+"','"+gender+"','"+birthday+"','"+phone+"',"+height+")");//关闭与数据库的连接statement.close();connection.close();}
}
运行

代码
package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class Demo2 {public static void main(String[] args) throws SQLException {Demo2.delete(6);}public static void delete(int number) throws SQLException {//注册驱动DriverManager.registerDriver(new 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);//发送sqlStatement statement = connection.createStatement();//直接将字符串拼接到sql中,不能防止sql注入攻击"or 1=1"statement.executeUpdate("delete from student where number = "+number);//关闭与数据库的连接statement.close();connection.close();}
}
运行

代码
package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class Demo2 {public static void main(String[] args) throws SQLException {Demo2.update(3,"爱丽西娅","女", "2024-4-14", "123456789", 1.72);}public static void update(int number,String name,String gender,String birthday,String phone,double height) throws SQLException {//注册驱动DriverManager.registerDriver(new 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);//发送sqlStatement statement = connection.createStatement();statement.executeUpdate("update student set name='"+name+"',gender='"+gender+"',birthday='"+birthday+"',phone='"+phone+"',height="+height+" where number ="+number);//关闭与数据库的连接statement.close();connection.close();}
}
运行

PreparedStatement 

代码
package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo4 {public static void main(String[] args) throws SQLException {Demo4.insert("小姨","鹤", "2018-8-23", "123456789", 1.4);}public static void insert(String name,String gender,String birthday,String phone,double height) throws SQLException {//注册驱动DriverManager.registerDriver(new 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);//发送sqlPreparedStatement ps = connection.prepareStatement("insert into student(name,gender,birthday,phone,height)value(?,?,?,?,?)");ps.setObject(1,name);ps.setObject(2,gender);ps.setObject(3,birthday);ps.setObject(4,phone);ps.setObject(5,height);ps.executeUpdate();//关闭与数据库的连接ps.close();connection.close();}
}
运行

代码
package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo4 {public static void main(String[] args) throws SQLException {Demo4.delete(15);}public static void delete(int number) throws SQLException {//注册驱动DriverManager.registerDriver(new 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);//发送sql//封装sqlPreparedStatement ps = connection.prepareStatement("delete from student where number = ?");//向sql中传参 传参时会进行验证,防止sql注入攻击,更安全ps.setObject(1, number);ps.executeUpdate();//关闭与数据库的连接ps.close();connection.close();}
}
运行

代码
package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo4 {public static void main(String[] args) throws SQLException {Demo4.update(3,"申鹤","女", "2024-4-14", "12345678910", 1.72);}public static void update(int number,String name,String gender,String birthday,String phone,double height) throws SQLException {//注册驱动DriverManager.registerDriver(new 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);//发送sqlPreparedStatement ps = connection.prepareStatement("update student set name=?,gender=?,birthday=?,phone=?,height=? where number =?");ps.setObject(1, name);ps.setObject(2, gender);ps.setObject(3, birthday);ps.setObject(4, phone);ps.setObject(5, height);ps.setObject(6, number);ps.executeUpdate();//关闭与数据库的连接ps.close();connection.close();}
}
运行

PreparedStatement和Statement 区别

1、代码的可读性和可维护性. 虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无 论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次。

2、最重要的一点是极大地提高了安全性.

     防止sql注入  

     Stringsql= “ delete from user where id = ”+num;   

     如果我们把[or 1=1]作为id传入进来?   

     delete from tb_name where id = 1 or 1 = 1;   

因为‘1’ = ‘1’肯定成立   

而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹 配的关系.

预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句。

结果集处理

PreparedStatement和Statement中的executeQuery()方法中会返回一 个ResultSet对象,查询结果就封装在此对象中.

使用ResultSet中的next()方法获得下一行数据

使用getXXX(String name)方法获得值

package com.ffyc.jdbcpro;import java.util.Date;public class Student {private int number;private String name;private String gender;private Date birthday;private String phone;private double height;private Date ref_time;public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}public Date getRef_time() {return ref_time;}public void setRef_time(Date ref_time) {this.ref_time = ref_time;}@Overridepublic String toString() {return "Student{" +"number=" + number +", name='" + name + '\'' +", gender='" + gender + '\'' +", birthday=" + birthday +", phone='" + phone + '\'' +", height=" + height +", ref_time=" + ref_time +'}';}
}

代码

package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo5 {public static void main(String[] args) throws SQLException {Student student = Demo5.findStudentByNumber(16);System.out.println(student);}public static Student findStudentByNumber(int number) throws SQLException {DriverManager.registerDriver(new 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 number,name,gender,birthday,height,phone,reg_time from student where number = ?");ps.setObject(1, number);//执行查询后,mysql将数据封装到一个ResultSet对象中ResultSet rs = ps.executeQuery();System.out.println(rs);//com.mysql.cj.jdbc.result.ResultSetImpl@64d2d351//将ResultSet中的数据包装到自己的对象中,这样用起来更加方便//结果集中有没有数据 如果有返回true,否则返回falseStudent stu = new Student();while (rs.next()){stu.setNumber(rs.getInt("number"));stu.setName(rs.getString("name"));stu.setGender(rs.getString("gender"));stu.setBirthday(rs.getDate("birthday"));stu.setHeight(rs.getDouble("height"));stu.setPhone(rs.getString("phone"));stu.setRef_time(rs.getTimestamp("reg_time"));}return stu;}
}

运行

代码

package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;
import java.util.ArrayList;public class Demo6 {public static void main(String[] args) throws SQLException {ArrayList<Student> students = findStudent();System.out.println(students);}public static ArrayList<Student> findStudent() throws SQLException {DriverManager.registerDriver(new 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 number,name,gender,birthday,height,phone,reg_time from student");ResultSet rs = ps.executeQuery();//创建一个集合对象用来封装多个学生对象ArrayList<Student> students = new ArrayList<>();while (rs.next()){//每循环一次,创建一个学生对象Student stu = new Student();stu.setNumber(rs.getInt("number"));stu.setName(rs.getString("name"));stu.setGender(rs.getString("gender"));stu.setBirthday(rs.getDate("birthday"));stu.setHeight(rs.getDouble("height"));stu.setPhone(rs.getString("phone"));stu.setRef_time(rs.getTimestamp("reg_time"));//把当前学生对象返回到集合中students.add(stu);}return students;}
}

运行

代码

package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo7 {public static void main(String[] args) throws SQLException {int res = checkNum(16);System.out.println(res);}public static int checkNum(int number) throws SQLException {DriverManager.registerDriver(new 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 count(*) c from student where number = ?");ps.setObject(1, number);ResultSet resultSet = ps.executeQuery();if(resultSet.next()){return resultSet.getInt("c");}else{return 0;}}
}

运行

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

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

相关文章

九、图形化脚本

多年来&#xff0c; shell脚本一直都被认为是枯燥乏味的。但如果你准备在图形化环境中运行脚本时&#xff0c;就未必如此了。有很多与脚本用户交互的方式并不依赖read和echo语句。 9.1 创建文本菜单 创建交互式shell脚本最常用的方法是使用菜单。提供各种选项可以帮助脚本用户…

AI遇上遥感,未来会怎样?

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

基于MetaGPT构建LLM多智能体

前言 你好&#xff0c;我是GISer Liu&#xff0c;在上一篇文章中&#xff0c;我们用了两万多字详细拆解了单个Agent的组成&#xff0c;并通过Github Trending订阅智能体理解MetaGPT框架的订阅模块如何解决应用问题&#xff0c;但是对于复杂&#xff0c;并行的任务&#xff0c;单…

【vue】el-select选择器实现宽度自适应

选择器的宽度根据内容长度进行变化 <div class"Space_content"><el-selectv-model"value":placeholder"$t(bot.roommessage)"class"select"size"small"style"margin-right: 10px"change"selectcha…

JavaSE——集合框架二(1/6)-前置知识-可变参数、Collections工具类

目录 可变参数 Collections工具类 Collections的常用静态方法 实例演示 可变参数 可变参数 就是一种特殊形参&#xff0c;定义在方法、构造器的形参列表里&#xff0c;格式是&#xff1a;数据类型...参数名称 可变参数的特点和好处 特点&#xff1a;可以不传数据给它&am…

SQL常用基础语句(一)-- ABCDE开头

AS 将列名从 count(*) 修改为 total select count(*) as total from users where status0 将列名 username 改为 uname&#xff0c; password 改为 upwd select username as uname, password as upwd from users BETWEEN AND 说明&#xff1a;BETWEEN 筛选的是 >value1且 &l…

小程序主体变更是通过迁移吗?是需要2个小程序吗?

小程序迁移变更主体有什么作用&#xff1f;好多朋友都想做小程序迁移变更主体&#xff0c;但是又不太清楚具体有啥用&#xff0c;今天我就来详细说说。首先&#xff0c;小程序迁移变更主体最重要的作用就是可以修改主体。比如你的小程序原来是 A 公司的&#xff0c;现在 A 公司…

操作系统实验四:多线程与信号量编程

操作系统实验上机 更多技术请访问&#xff1a;www.xuanworld.top 部分审核不通过的文章将发至个人博客&#xff1a;www.xuanworld.top 欢迎来52破解论坛阅读帖子&#xff1a;https://www.52pojie.cn/thread-1891208-1-1.html 实验名称实验序号实验日期实验人多线程与信号量…

010-Linux磁盘介绍

文章目录 1、名词 2、类型 3、尺寸 4、接口/协议/总线 5、命名 6、分区方式 MBR分区 GPT分区 1、名词 磁盘是计算机主要的存储介质&#xff0c;可以存储大量的二进制数据&#xff0c;并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘&#xff08;Floppy D…

基于yolov5和desnet的猫咪识别模型

前言 前段时间给学校的猫咪小程序搭建了识猫模型&#xff0c;可以通过猫咪的照片辨别出是那只猫猫&#xff0c;这里分享下具体的方案&#xff0c;先看效果图&#xff1a; 源代码在文末 模型训练 在训练服务器&#xff08;或你的个人PC&#xff09;上拉取本仓库代码。 图片数…

10款免费黑科技软件,强烈推荐!

1.AI视频生成——巨日禄 网页版https://aitools.jurilu.com/ "巨日禄 "是一款功能强大的文本视频生成器&#xff0c;可以快速将文本内容转换成极具吸引力的视频。操作简单&#xff0c;用户只需输入文字&#xff0c;选择喜欢的样式和模板&#xff0c; “巨日禄”就会…

Day39贪心算法part06

LC738单调递增的数字&#xff08;未掌握&#xff09; 思路分析&#xff1a;一旦出现strNum[i - 1] > strNum[i]的情况&#xff08;非单调递增&#xff09;&#xff0c;首先想让strNum[i - 1]–&#xff0c;然后strNum[i]给为9字符串是不可变的&#xff0c;不可以使用s.char…

树莓派学习笔记——树莓派的三种GPIO编码方式

1、板载编码&#xff08;Board pin numbering&#xff09;: 板载编码是树莓派上的一种GPIO引脚编号方式&#xff0c;它指的是按照引脚在树莓派主板上的物理位置来编号。这种方式对于初学者来说可能比较直观&#xff0c;因为它允许你直接根据引脚在板上的位置来编程。 2、BCM编…

Linux gurb2简介

文章目录 前言一、GRUB 2简介二、GRUB 2相关文件/文件夹2.1 /etc/default/grub文件2.2 /etc/grub.d/文件夹2.3 /boot/grub/grub.cfg文件 三、grubx64.efi参考资料 前言 简单来说&#xff0c;引导加载程序&#xff08;boot loader&#xff09;是计算机启动时运行的第一个软件程…

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《计及温控厌氧发酵和阶梯碳交易的农村综合能源低碳经济调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

网络域名是什么意思

网络域名&#xff0c;顾名思义&#xff0c;就是网络上的名字&#xff0c;类似于现实中的地址或姓名一样&#xff0c;用来标识网络上的一个或一组计算机或服务器的位置&#xff0c;以及它们的相应服务资源。网络域名是互联网上最基础的基础设施之一&#xff0c;是网络通信的“标…

【mysql】更新操作是如何执行的

现有一张表&#xff0c;建表语句如下&#xff1a; mysql> create table T(ID int primary key, c int);如果要将 ID2 这一行的a字段值加 1&#xff0c;SQL语句会这么写&#xff1a; mysql> update T set c c 1 where ID 2;上面这条sql执行时&#xff0c;分析器会通过词…

Nacos 微服务管理

Nacos 本教程将为您提供Nacos的基本介绍&#xff0c;并带您完成Nacos的安装、服务注册与发现、配置管理等功能。在这个过程中&#xff0c;您将学到如何使用Nacos进行微服务管理。下方是官方文档&#xff1a; Nacos官方文档 1. Nacos 简介 Nacos&#xff08;Naming and Confi…

操作符详解(上)(新手向)

操作符详解&#xff08;上&#xff09; 一&#xff0c;算术操作符&#xff08;双目操作符&#xff09;1:‘’,‘-’,‘*’2&#xff1a;‘/’&#xff0c;‘%’ 一&#xff0c;单目操作符1:‘’,‘-’2&#xff1a;‘!’3&#xff1a;‘&’4&#xff1a;‘*’5&#xff1a;…

linux 排查java内存溢出(持续更新中)

场景 tone.jar 启动后内存溢出,假设pid 为48044 排查 1.确定java程序的pid(进程id) ps 或 jps 都可以 ps -ef | grep tone jps -l 2.查看堆栈信息 jmap -heap 48044 3.查看对象的实例数量显示前30 jmap -histo:live 48044 | head -n 30 4.查看线程状态 jstack 48044