Java Database Connectivity (JDBC + Servlet)

Java Database Connectivity (JDBC)是一个Java API,用于与数据库进行连接和操作。通过JDBC,Java程序可以与各种关系型数据库进行通信,执行SQL查询、更新数据等操作。

一、Java连接数据库两种方式 

  ​​​​​

​​               

二、Java中提供的方法


               

 三、连接数据库的步骤

  • 加载数据库驱动程序:首先需要加载适当的数据库驱动程序,以便与特定数据库建立连接。不同的数据库需要不同的驱动程序类。

  • 建立数据库连接:使用DriverManager.getConnection()方法建立与数据库的连接,提供数据库URL、用户名和密码等连接信息。

  • 创建Statement对象:通过连接对象创建StatementPreparedStatement对象,用于执行SQL查询。

  • 执行SQL查询:使用executeQuery()方法执行SQL查询,返回一个ResultSet对象,其中包含查询结果。

  • 处理查询结果:通过ResultSet对象提取查询结果,可以使用ResultSet.next()方法遍历结果集中的每一行数据。

  • 关闭连接:在操作结束后,记得关闭ResultSet、Statement和Connection对象,释放资源。

3.1 数据库实现

3.1.1 连接数据库

打开DataGrip,点击左上角“+”标志,选择对应数据库进行连接:

3.1.2 创建book表:

-- 创建一个book表,表中存入book相关的内容,包括id,书名,作者,价格

create table book(

    bookid int primary key auto_increment,

    bookname varchar(50) not null,

    bookauthor varchar(50),

    bookprice double not null

                               

);

3.1.3 在数据库中插入数据:

-- 向表中插入一些数据

insert into book (bookname, bookauthor, bookprice) values

('活着', '余华', 29.90),

('百年孤独', '加西亚·马尔克斯', 39.90),

('挪威的森林', '村上春树', 49.90),

('围城', '钱钟书', 39.00),

('小王子', '安东尼·德·圣埃克苏佩里', 25.00),

('红与黑', '司汤达', 35.00),

('简·爱', '夏洛蒂·勃朗特', 30.00),

('傲慢与偏见', '简·奥斯汀', 28.50),

('海边的卡夫卡', '村上春树', 45.00),

('时间简史', '斯蒂芬·霍金', 50.00),

('解忧杂货店', '东野圭吾', 38.00),

('追风筝的人', '卡勒德·胡赛尼', 32.00),

('平凡的世界', '路遥', 27.00),

('月亮和六便士', '毛姆', 34.00),

('茶花女', '小仲马', 22.00),

('动物农场', '乔治·奥威尔', 26.00),

('福尔摩斯探案集', '阿瑟·柯南·道尔', 31.00),

('人类简史', '尤瓦尔·赫拉利', 48.00),

('白夜行', '东野圭吾', 36.00),

('盗墓笔记', '南派三叔', 40.00);

查看表中数据:

3.2 JDBC连接数据库

3.2.1 创建对应的Java项目

在idea的空项目中创建一个java项目,创建好后将自动生成的Main类删除

3.2.2 导入对应Jar包

在创建完项目后,右键点击bookstore,创建目录,创建一个名为lib的目录,将附件中的lib文件夹中的问价导入到项目中的lib目录下

3.2.3 添加为库

选中所有jar包,将其添加为库

成功添加后会带有索引箭头

3.2.4 创建JDBC连接 (详细代码请查看项目文件)

在src目录下创建一个java类,名为dao.BaseDao

package dao;

import java.sql.*;

/**

 * @program: Book

 * @ClassName BaseDao

 * @description:

 * @author: 苏芮溪

 * @create: 2024−11-18 17:25

 * @Version 1.0

 **/

public class BaseDao {

    public static final String DRIVERCLASSNAME = "com.mysql.cj.jdbc.Driver";

    public static final String URL = "jdbc:mysql://localhost:3306/bookstore?sslMode=REQUIRED&characterEncoding=UTF-8&connectionTimeZone=GMT%2B8&forceConnectionTimeZoneToSession=true";

    public static final String USER = "root";

    public static final String PASS = "admin";

    /**

     * 获取数据库连接

     */

    public Connection getConnection() {

        Connection conn = null;

        try {

            //装载驱动.3

            Class.forName(DRIVERCLASSNAME);

            //连接数据库

            conn = DriverManager.getConnection(URL, USER, PASS);

            System.out.println(conn);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return conn;

    }

    protected void closedAll(Connection conn, PreparedStatement ps, ResultSet rs) {

        if (rs != null) {

            try {

                rs.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

        if (ps != null) {

            try {

                ps.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

        if (conn != null) {

            try {

                conn.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    }

}

3.3 Java代码实现

3.3.1创建对应层的软件包目录

按如下图片创建对应的软件包:

3.3.2创建entity的实体类

创建的实体类中的属性要与数据库中的实体类的属性一一对应(个数和类型要对应)(可以选择实现Serializable接口)

自动生成对应的get,set方法以及有参构造无参构造(ALT+INSERT)

package entity;

import java.io.Serializable;

/**

 * @program: Book

 * @ClassName Book

 * @description:

 * @author: 苏芮溪

 * @create: 2024−11-18 17:45

 * @Version 1.0

 **/

public class Book implements Serializable {

    int id;

    String name;

    String author;

    double price;

    public Book() {

    }

    public Book(int id, String name, String author, double price) {

        this.id = id;

        this.name = name;

        this.author = author;

        this.price = price;

    }

    public Book(String name, String author, double price) {

        this.name = name;

        this.author = author;

        this.price = price;

    }

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getAuthor() {

        return author;

    }

    public void setAuthor(String author) {

        this.author = author;

    }

    public double getPrice() {

        return price;

    }

    public void setPrice(double price) {

        this.price = price;

    }

    @Override

    public String toString() {

        return "Book{" +

                "id=" + id +

                ", name='" + name + '\'' +

                ", author='" + author + '\'' +

                ", price=" + price +

                '}';

    }

}

3.3.3创建dao层接口和实现类

创建BookDao接口,在接口中声明方法

package dao;

import entity.Book;

import java.util.List;

/**

 * @program: Book

 * @ClassName BookDao

 * @description:

 * @author: 苏芮溪

 * @create: 2024−11-18 17:48

 * @Version 1.0

 **/

public interface BookDao {

    //查询所有书籍

    List<Book> findAll();

    //添加书籍

    boolean addBook(Book book);

    //通过书的id更新书籍

    boolean updateBook(Book book,int id);

    //删除书籍

    boolean deleteBook(Book book);

    List<Book> findLike(String name);

}

创建BookDaoImpl实现类,继承BaseDao类实现BookDao接口,在BookDaoImpl中实现对应方法(查阅代码文件)

package dao.impl;

import dao.BaseDao;

import dao.BookDao;

import entity.Book;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

/**

@program: Book

@ClassName BookDaoImpl

@description:

@author: 苏芮溪

@create: 2024−11-18 17:53

@Version 1.0

 **/

public class BookDaoImpl extends BaseDao implements BookDao {

    //创建连接引用

    Connection conn = null;

    //创建操作引用

    PreparedStatement ps = null;

    //创捷接收引用

    ResultSet rs = null;

    @Override

    public List<Book> findAll() {

        List<Book> books = new ArrayList<Book>();

        //SQL操作语句

        String sql = "select * from book";

        try {

            //进行数据库连接(调用BaseDao中的方法)

            conn = getConnection();

            //创建操作对象

            ps = conn.prepareStatement(sql);

            //接受处理结果

            rs = ps.executeQuery();

            while (rs.next()) {

                //根据返回结果创建book对象

                Book book = new Book(rs.getInt("bookid"),rs.getString("bookname"), rs.getString("bookauthor"), rs.getDouble("bookprice"));

                //将对象加入到列表中

                books.add(book);

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }finally {

            closedAll(conn, ps, rs);

        }

        return books;

    }

    @Override

    public boolean addBook(Book book) {

        //SQL操作语句

        String sql = "insert into book(bookname,bookauthor,bookprice) values(?,?,?)";

        try {

            //进行数据库连接(调用BaseDao中的方法)

            conn = getConnection();

            //创建操作对象

            ps = conn.prepareStatement(sql);

            //处理sql操作参数

            ps.setString(1,book.getName());

            ps.setString(2,book.getAuthor());

            ps.setDouble(3,book.getPrice());

            //执行 插入 修改 删除 都执行此语句

            int i = ps.executeUpdate();

            if (i > 0) {

                return true;

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }finally {

            closedAll(conn, ps, null);

        }

        return false;

    }

    @Override

    public boolean updateBook(Book book, int id) {

        //SQL操作语句

        String sql = "update book set bookname=?,bookauthor=?,bookprice=? where bookid=?";

        try {

            //进行数据库连接(调用BaseDao中的方法)

            conn = getConnection();

            //创建操作对象

            ps = conn.prepareStatement(sql);

            //处理sql操作参数

            ps.setString(1,book.getName());

            ps.setString(2,book.getAuthor());

            ps.setDouble(3,book.getPrice());

            ps.setInt(4,id);

            //执行 插入 修改 删除 都执行此语句

            int i = ps.executeUpdate();

            if (i > 0) {

                return true;

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }finally {

            closedAll(conn, ps, null);

        }

        return false;

    }

    @Override

    public boolean deleteBook(Book book) {

        //SQL操作语句

        String sql = "delete from book where bookname=?";

        try {

            //进行数据库连接(调用BaseDao中的方法)

            conn = getConnection();

            //创建操作对象

            ps = conn.prepareStatement(sql);

            //处理sql操作参数

            ps.setString(1,book.getName());

            //执行 插入 修改 删除 都执行此语句

            int i = ps.executeUpdate();

            if (i > 0) {

                return true;

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }finally {

            closedAll(conn, ps, null);

        }

        return false;

    }

    @Override

    public List<Book> findLike(String name) {

        List<Book> books = new ArrayList<Book>();

        //SQL操作语句

        String sql = "select * from book where bookname like ?";

        try {

            //进行数据库连接(调用BaseDao中的方法)

            conn = getConnection();

            //创建操作对象

            ps = conn.prepareStatement(sql);

            ps.setString(1,"%"+name+"%");

            //接受处理结果

            rs = ps.executeQuery();

            while (rs.next()) {

                //根据返回结果创建book对象

                Book book = new Book(rs.getInt("bookid"),rs.getString("bookname"), rs.getString("bookauthor"), rs.getDouble("bookprice"));

                //将对象加入到列表中

                books.add(book);

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }finally {

            closedAll(conn, ps, rs);

        }

        return books;

    }

}

3.3.4创建service层接口和实现类

package service;

import entity.Book;

import java.util.List;

/**

 * @program: Book

 * @ClassName BookService

 * @description:

 * @author: 苏芮溪

 * @create: 2024−11-18 18:09

 * @Version 1.0

 **/

public interface BookService {

    //查询所有书籍

    List<Book> findAll();

    //添加书籍

    boolean addBook(Book book);

    //通过书的id更新书籍

    boolean updateBook(Book book,int id);

    //删除书籍

    boolean deleteBook(Book book);

    //模糊查询

    List<Book> findLike(String name);

}

package service.impl;

import dao.BookDao;

import dao.impl.BookDaoImpl;

import entity.Book;

import service.BookService;

import java.util.Collections;

import java.util.List;

/**

 * @program: Book

 * @ClassName BookServiceImpl

 * @description:

 * @author: 苏芮溪

 * @create: 2024−11-18 18:10

 * @Version 1.0

 **/

public class BookServiceImpl implements BookService {

    //面向接口变成

    BookDao bookDao;

    //构造函数

    public BookServiceImpl() {

        bookDao = new BookDaoImpl();

    }

    @Override

    public List<Book> findAll() {

        return bookDao.findAll();

    }

    @Override

    public boolean addBook(Book book) {

        return bookDao.addBook(book);

    }

    @Override

    public boolean updateBook(Book book, int id) {

        return bookDao.updateBook(book, id);

    }

    @Override

    public boolean deleteBook(Book book) {

        return bookDao.deleteBook(book);

    }

    @Override

    public List<Book> findLike(String name) {

        return bookDao.findLike(name);

    }

}

3.5创建test类运行程序

3.5.1总查询:

先运行一下一下代码,查询一下所有的书籍,同时也是检测一下数据库的连接是否正确:

我们可以清晰看到数据库连接地址以及书籍信息

3.5.2模糊查询:

查询书名中带有“的”的书籍

3.5.3添加书籍:

添加一本书,并使用模糊查询查找到它

3.5.4删除书籍:

3.5.5更新书籍

四、注意事项总结

在使用JDBC进行数据库连接时,数据库的名称url,用户名密码一定要正确,不然无法正确连接数据库;同时,数据库连接时,一定要记得加载驱动,以及将Jar包导入类库。

在Dao层中,实现sql查询时,sql中的属性是数据库中表的属性,而在下面返回到的resultset中转为我们的Book类时,取值取得是数据库中的属性的值, 构造出来的是我们的实体类Book。

查询中可以根据作者查询,可以查询价格区间,在更新和删除

总之,记住JDBC的总体结构,熟悉SQL语句,掌握Java代码编写,再加以练习就可以很好地掌握这部分内容。

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

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

相关文章

[Realtek sdk-3.4.14b] RTL8197FH-VG新增jffs2分区操作说明

sdk说明 ** Gateway/AP firmware v3.4.14b – Aug 26, 2019**  Wireless LAN driver changes as:  Refine WiFi Stability and Performance  Add 8812F MU-MIMO  Add 97G/8812F multiple mac-clone  Add 97G 2T3R antenna diversity  Fix 97G/8812F/8814B MP issu…

鸿蒙多线程开发——线程间数据通信对象01

1、线程间通信 线程间通信指的是并发多线程间存在的数据交换行为。由于ArkTS语言兼容TS/JS&#xff0c;其运行时的实现与其它所有的JS引擎一样&#xff0c;都是基于Actor内存隔离的并发模型提供并发能力。 对于不同的数据对象&#xff0c;在ArkTS线程间通信的行为是有差异的&…

基于单片机的多功能跑步机控制系统

本设计基于单片机的一种多功能跑步机控制系统。该系统以STM32单片机为主控制器&#xff0c;由七个电路模块组成&#xff0c;分别是&#xff1a;单片机模块、电机控制模块、心率检测模块、音乐播放模块、液晶显示模块、语音控制模块、电源模块。其中&#xff0c;单片机模块是整个…

测试工程师如何在面试中脱颖而出

目录 1.平时工作中是怎么去测的&#xff1f; 2.B/S架构和C/S架构区别 3.B/S架构的系统从哪些点去测&#xff1f; 4.你为什么能够做测试这一行&#xff1f;&#xff08;根据个人情况分析理解&#xff09; 5.你认为测试的目的是什么&#xff1f; 6.软件测试的流程&#xff…

PHM技术:基于支持向量机的智能故障诊断 | 行星齿轮箱智能故障诊断

目录 1.数据获取 2.特征提取与选择 3.健康状态识别 1.数据获取 用的行星齿轮箱数据采集自图1中的多级齿轮传动系统实验台中&#xff0c;在实验过程中&#xff0c;分别模拟了8种行星齿轮箱的健康状态&#xff0c;包括正常、第一级太阳轮点蚀、第一级太阳轮齿根裂纹、第一级…

【划分型 DP-约束划分个数】【hard】【阿里笔试】力扣1278. 分割回文串 III

给你一个由小写字母组成的字符串 s&#xff0c;和一个整数 k。 请你按下面的要求分割字符串&#xff1a; 首先&#xff0c;你可以将 s 中的部分字符修改为其他的小写英文字母。 接着&#xff0c;你需要把 s 分割成 k 个非空且不相交的子串&#xff0c;并且每个子串都是回文串…

国标GB28181视频平台EasyCVR视频融合平台H.265/H.264转码业务流程

在当今数字化、网络化的视频监控领域&#xff0c;大中型项目对于视频监控管理平台的需求日益增长&#xff0c;特别是在跨区域、多设备、高并发的复杂环境中。EasyCVR视频监控汇聚管理平台正是为了满足这些需求而设计的&#xff0c;它不仅提供了全面的管理功能&#xff0c;还支持…

相机触发模式

参考自&#xff1a;相机触发模式_硬触发和软触发的区别-CSDN博客 一、图像采集模式分类 相机的图像采集模式分为内触发模式与外触发模式。其中内触发模式包含连续采集、单帧采集两种形式&#xff1b;外触发模式包含软件外触发、硬件外触发。本文以海康相机的软件平台作介绍&a…

【数据结构】【线性表】【练习】反转链表

申明 该题源自力扣题库19&#xff0c;文章内容&#xff08;代码&#xff0c;图表等&#xff09;均原创&#xff0c;侵删&#xff01; 题目 给你单链表的头指针head以及两个整数left和right&#xff0c;其中left<right&#xff0c;请你反转从位置left到right的链表节点&…

Applied Intelligence投稿

一、关于手稿格式&#xff1a; 1、该期刊是一个二区的&#xff0c;模板使用Springer nature格式&#xff0c; 期刊投稿要求&#xff0c;详细期刊投稿指南&#xff0c;大部分按Soringernature模板即可&#xff0c;图片表格声明参考文献命名要求需注意。 2、参考文献&#xff…

【Google Cloud】Private Service Connect 托管式服务

简介 Private Service Connect 是什么 Private Service Connect 是 Google Cloud&#xff08;原名 GCP&#xff09;Virtual Private Cloud&#xff08;VPC&#xff09;的一项功能。 该功能主要用于以下两个场景&#xff1a; 使用私有 IP 访问 Google Cloud 的 API。将用户自…

JDK、MAVEN与IDEA的安装与配置

1.认识JDK、MAVEN与IDEA JDK 提供了编译和运行Java程序的基本环境。Maven 帮助管理项目的构建和依赖。IDEA 提供了一个强大的开发环境&#xff0c;使得编写、调试和运行Java程序更加高效。 2. 安装与环境配置 2.1 官网地址 选择你需要的版本下载&#xff1a; MAVEN下载传送…

MySQL深入:B+树的演化、索引和索引结构

提示&#xff1a;内容是读《MySQL技术内幕&#xff1a;InnoDB存储引擎》&#xff0c;笔记摘要 文章目录 二叉查找树平衡二叉树(AVL) B树(BTree)B树(BTree)InnoDB B树索引索引结构&#xff08;InnoDB B树&#xff09;B树存放的数据量 二叉查找树 在二叉查找树中&#xff0c;左子…

FairGuard游戏加固实机演示

此前&#xff0c;FairGuard对市面上部分游戏遭遇破解的案例进行了详细分析&#xff0c;破解者会采用静态分析与动态调试相结合的手段&#xff0c;逆向分析出代码逻辑并对其进行篡改&#xff0c;实现作弊功能&#xff0c;甚至是对游戏资源文件进行篡改&#xff0c;从而制售外挂。…

聊一聊Elasticsearch的索引数据搜索过程

与向索引写入数据的时候必须是主分片来承担不同。搜索的时候&#xff0c;主分片和副本分片均可以承担&#xff0c;最终选用主分片还是副本分片是通过轮询的方式来进行选择的。 索引数据的搜索过程&#xff0c;依据有无路由值&#xff0c;分为两种&#xff1a;不带路由值的搜索…

视频修复技术和实时在线处理

什么是视频修复&#xff1f; 视频修复技术的目标是填补视频中的缺失部分&#xff0c;使视频内容连贯合理。这项技术在对象移除、视频修复和视频补全等领域有着广泛的应用。传统方法通常需要处理整个视频&#xff0c;导致处理速度慢&#xff0c;难以满足实时处理的需求。 技术发…

自动化运维-检测Linux服务器CPU、内存、负载、IO读写、机房带宽和服务器类型等信息脚本

前言&#xff1a;以上脚本为今年8月1号发布的&#xff0c;当时是没有任何问题&#xff0c;但现在脚本里网络速度测试py文件获取不了了&#xff0c;测速这块功能目前无法实现&#xff0c;后面我会抽时间来研究&#xff0c;大家如果有建议也可以分享下。 脚本内容&#xff1a; #…

C语言-11-18笔记

1.C语言数据类型 类型存储大小值范围char1 字节-128 到 127 或 0 到 255unsigned char1 字节0 到 255signed char1 字节-128 到 127int2 或 4 字节-32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647unsigned int2 或 4 字节0 到 65,535 或 0 到 4,294,967,295short2 字节…

【HashMap篇】HashMap实现原理|put方法|扩容机制|寻址算法|1.7情况下的多线程死循环问题

目录 一、二叉树、红黑树、散列表简单介绍 1.二叉树 &#xff08;1&#xff09;什么是二叉树 &#xff08;2&#xff09;什么是二叉搜索树 2.红黑树 &#xff08;1&#xff09;什么是红黑树 3.散列表 &#xff08;1&#xff09;什么是散列表 &#xff08;2&#xff09;…

AI 大模型重塑软件开发的未来

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…