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

        //发送sql
        Statement statement = connection.createStatement();
        System.out.println(statement);//com.mysql.cj.jdbc.StatementImpl@6166e06f
        statement.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);
        //发送sql
        Statement 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);
        //发送sql
        Statement 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);
        //发送sql
        Statement 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);
        //发送sql
        PreparedStatement 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
        //封装sql
        PreparedStatement 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);
        //发送sql
        PreparedStatement 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;
    }

    @Override
    public 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,否则返回false
        Student 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;
        }
    }
}

运行

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

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

相关文章

前端 CSS 经典:filter 滤镜

前言&#xff1a;什么叫滤镜呢&#xff0c;就是把元素里的像素点通过一套算法转换成新的像素点&#xff0c;这就叫滤镜。而算法有 drop-shadow、blur、contrast、grayscale、hue-rotate 等。我们可以通过这些算法实现一些常见的 css 样式。 1. drop-shadow 图片阴影 可以用来…

民国漫画杂志《时代漫画》第5期.PDF

时代漫画05.PDF: https://url03.ctfile.com/f/1779803-1246745815-7953cf?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

dify:开源 LLMOps平台。

单纯笔记&#xff1a; 一、关于 Dify dify/README_CN.md at main langgenius/dify GitHub Dify 是一款开源的大语言模型&#xff08;LLM&#xff09;应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&#xff0c;使开发者可以…

单表复杂查询的场景分析二:涉及数据分组与分区/多重函数计算/SQL变种

SQL演练&#xff0c;带详细分析&#xff0c;笔记和备忘。行文不易&#xff0c;感谢支持&#xff01; 本文是单表下的复杂场景问题分析&#xff0c;具体看下面的每个需求。 接上文&#xff0c;本文为连载的第二篇。 目录 数据表及说明 需求8&#xff1a;找出指定月份每个人的…

C++—结构体

结构体&#xff08;struct&#xff09;&#xff0c;是一种用户自定义复合数据类型&#xff0c;可以包含不同类型的不同成员。 结构体的声明定义和使用的基本语法&#xff1a; // 声明结构体struct 结构体类型 { 成员1类型 成员1名称; ...成员N类型 成员N名称; };除声明…

Python导入Shapefile到PostGIS的常见问题和解决方案

导入Shapefile到PostGIS的常见问题和解决方案 先决条件&#xff1a; 已经拥有含有GDAL的python环境&#xff08;如果大家需要&#xff0c;我可以后面出一片文章 问题一&#xff1a;QGIS连接到PostGIS数据库失败 错误描述&#xff1a; Connection to server at &quo…

BCD编码(8421)介绍

概念 BCD (Binary-Coded Decimal) 是一种二进制的数字编码形式&#xff0c;其特点每个十进制数位用4个二进制位来表示。 在网络IO中&#xff0c;你传输一个数字类型最少需要一字节&#xff0c;传输两个数字类型最少需要两字节&#xff0c;但是当你使用BCD编码后传输&#xff…

Oracle Graph 入门 - RDF 知识图谱

Oracle Graph 入门 - RDF 知识图谱 0. 引言1. 查看 RDF Semantic Graph 安装情况2. 创建一个语义网络4. 创建一个模型5. 加载 RDF 文件6. 配置 W3C 标准的 SPARQL 端点 0. 引言 Oracle Graph 的中文资料太少了&#xff0c;只能自己参考英文资料整理一篇吧。 Oracle 数据库包括…

云下到云上,丽迅物流如何实现数据库降本50% | OceanBase案例

在2024年3月20日的首场OceanBase数据库城市行活动中&#xff0c;专注于物流及供应链解决方案的丽迅物流的架构师阳磊&#xff0c;围绕“OB Cloud在丽迅物流的实践”这一主题&#xff0c;进行了精彩的演讲。本文为此次演讲的内容回顾。 在丽迅物流&#xff08;Lesoon Logistics…

论文精读-SRFormer Permuted Self-Attention for Single Image Super-Resolution

论文精读-SRFormer: Permuted Self-Attention for Single Image Super-Resolution SRFormer:用于单图像超分辨率的排列自注意 Params&#xff1a;853K&#xff0c;MACs&#xff1a;236G 优点&#xff1a; 1、参考SwinIR的RSTB提出了新的网络块结构PAB&#xff08;排列自注意力…

盘点28个免费域名申请大全

盘点28个免费域名申请大全 免费域名推荐学习使用&#xff0c;免费就意味着没任何保障。 名称稳定时间支持解析模式后缀格式说明地址EU.org28 年NS.eu.org/. 国家简写.eu.org需要审核&#xff0c;稳定性高&#xff0c;限制少&#xff0c;国内访问有问题&#xff0c;可 CFeu.orgp…

反射获取或修改对象属性的值

利用反射既可以获取也可以写入,首先咱们先写几个获取的例子。 一:利用反射修改各数据(利用resultField.set修改) 首先定义实体类 public class Dog {private String dogUser;private int age;把DogUser的"hahaha"改为"geggegegege" Dog dog = new Do…

10个最佳Android数据恢复工具,用于恢复已删除的文件

由于我们现在在智能手机上存储了许多重要文件&#xff0c;因此了解数据恢复工具变得很重要。您永远不会知道何时需要使用适用于Android的数据恢复工具。 由于不乏Windows数据恢复工具&#xff0c;因此从崩溃的计算机中恢复文件很容易。但是&#xff0c;当涉及到从Android恢复数…

adb卸载系统垃圾应用

//获取包名 输入如下代码&#xff0c;然后在打开和关闭要获取包名的app就会打印出该app的包名 adb shell am monitor //卸载系统应用 -k会保留用户数据&#xff0c;不包含-k则不会保留用户数据 adb shell pm uninstall -k --user 0 包名 &#xff08;包名一般为&#xff1a;c…

机械臂与Realsense D435 相机的手眼标定ROS包

本教程主要介绍机械臂与 Realsense D435 相机手眼标定的配置及方法。 系统&#xff1a;Ubuntu 20.0.4 ◼ ROS&#xff1a;Noetic ◼ OpenCV 库&#xff1a;OpenCV 4.2.0 ◼ Realsense D435&#xff1a;librealsense sdk&#xff08;2.50.0&#xff09;、realsense-ros 功能包&…

【map、set】C++用红黑树来封装map、set容器

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | Linux | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解map和set之用红黑树来封装map、set容器的相关内容。 如果看到最后您…

资料防拷贝该如何实现?数据防拷贝的方法有哪些

数据安全和隐私保护成为企业和个人关注的重点。电脑中存储的资料往往包含了重要的商业机密、个人隐私或其他敏感信息。 因此&#xff0c;如何有效防止他人非法拷贝电脑资料&#xff0c;成为了一个亟待解决的问题。 本文将探讨数据防拷贝的方法&#xff0c;以帮助企业和个人保护…

22-LINUX--多线程and多进程TCP连接

一.TCP连接基础知识 1.套接字 所谓套接字(Socket)&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲&#xff0c;套接字上联应用进程…

Map遍历、反射、GC

map的遍历 用foreach遍历 HashMap<Character,Integer> map new HashMap<>();map.put(A,2);map.put(B,3);map.put(C,3);for (Map.Entry<Character,Integer> entry: map.entrySet()) {char key entry.getKey();int value entry.getValue();System.out.prin…

CF451E: Devu and Flowers(容斥原理 + 考虑反面 + golang组合模版)

题目截图 题目翻译 题目分析 正难则反&#xff0c;考虑所有不符合的例子 由于n很小&#xff0c;所以可以状态压缩二进制遍历完全部不符合例子的组合 对于不符合的例子&#xff0c;假设其中第i个不符合&#xff0c;那么就消耗掉fi 1个球 以此类推&#xff0c;减剩下s2个球 这时…