Java Database Connectivity (JDBC + Servlet)

news2024/11/22 8:43:20

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代码编写,再加以练习就可以很好地掌握这部分内容。

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

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

相关文章

【Python爬虫实战】深入解析 Scrapy 爬虫框架:高效抓取与实战搭建全指南

&#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、Srapy简介 &#xff08;一&#xff09;什么是Srapy &#xff08;二&#xff09;Scrapy 的设计目标 …

编程之路,从0开始:动态内存管理

Hello&#xff0c;大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路。 我们今天来学习C语言中的动态内存管理。 目录 1、为什么要有动态内存管理&#xff1f; 2、malloc和free &#xff08;1&#xff09;malloc函数 &…

初始Python篇(4)—— 元组、字典

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 元组 相关概念 元组的创建与删除 元组的遍历 元组生成式 字典 相关概念 字典的创建与删除 字典的遍历与访问 字典…

d3-ease 的各种方法和示例

D3.js中的d3-ease模块提供了多种缓动函数&#xff0c;用于实现平滑的动画过渡效果。这些缓动函数通过扭曲时间控制动画中运动的方法&#xff0c;使得动画更加自然和流畅。以下是D3中常见的一些ease方法和示例代码&#xff1a; 线性缓动&#xff08;linear&#xff09;&#xff…

HTML5拖拽API学习 托拽排序和可托拽课程表

文章目录 前言拖拽API核心概念拖拽式使用流程例子注意事项综合例子&#x1f330; 可拖拽课程表拖拽排序 前言 前端拖拽功能让网页元素可以通过鼠标或触摸操作移动。HTML5 提供了标准的拖拽API&#xff0c;简化了拖放操作的实现。以下是拖拽API的基本使用指南&#xff1a; 拖拽…

Throwable、IO流、Java虚拟机

Error和Exception stream结尾都是字节流&#xff0c;reader和writer结尾都是字符流 两者的区别就是读写的时候一个是按字节读写&#xff0c;一个是按字符。 实际使用通常差不多。 在读写文件需要对内容按行处理&#xff0c;比如比较特定字符&#xff0c;处理某一行数据的时候一…

lanqiao OJ 364 跳石头

这个题目的条件是移动的石头数量给定&#xff0c;但是最小移动距离的最大值我们不知道&#xff0c;所以要通过mid来“猜测”。如果当前的mid需要移动的最小石头数量超过给定数&#xff0c;则mid不成立&#xff0c;需要缩小&#xff0c;反之则增大mid&#xff0c;直至找到一个最…

「一」HarmonyOS端云一体化概要

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…

Shell基础(7)

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…

音视频pts/dts

现在的视频流有两个非常重要的时间戳&#xff0c;pts和dts&#xff0c;其中pts是显示的时候用&#xff0c;dts在解码的时候用。 pts很好理解&#xff0c;按照pts的顺序以及duration不间断的display就可以了。 dts在解码的时候用&#xff0c;那么这句话怎么理解&#xff0c;解…

sql server怎样用sql profiler捕获带变量值的慢sql

一 新建跟踪 点击工具-SQL Server Profiler&#xff1a; 点击文件-新建跟踪的按钮&#xff1a; 在‘事件选择’选项卡只选择如下两项内容&#xff08;RPC:Completed,SQL:BatchCompleted&#xff09;&#xff0c;把多余的取消勾选&#xff1a; 然后勾选上面截图中右下方的‘显示…

二叉树——输出叶子到根节点的路径

目录 代码 算法思想 例子 思维拓展 代码 int LeaveBit(Bitree T,int flag,int g) {if (!T) {return 0;}if (T->rchild NULL && T->lchild NULL) {//cout << "empty:" << T->data << endl;s.push(T->data);while (!s.emp…

深入理解Spring(三)

目录 2.1.3、Spring配置非自定义Bean 1)配置Druid数据源交由Spring管理 2)配置Connection交由Spring管理 3)配置日期对象交由Spring管理 4)配置MyBatis的SqlSessionFactory交由Spring管理 2.1.4、Bean实例化的基本流程 1)Bean信息定义对象-BeanDefinition 2)DefaultLi…

React Native 基础

React 的核心概念 定义函数式组件 import组件 要定义一个Cat组件,第一步要使用 import 语句来引入React以及React Native的 Text 组件: import React from react; import { Text } from react-native; 定义函数作为组件 const CatApp = () => {}; 渲染Text组件

SpringBoot,IOC,DI,分层解耦,统一响应

目录 详细参考day05 web请求 1、BS架构流程 2、RequestParam注解 完成参数名和形参的映射 3、controller接收json对象&#xff0c;使用RequestBody注解 4、PathVariable注解传递路径参数 5、ResponseBody&#xff08;return 响应数据&#xff09; RestController源码 6、统一响…

Linux:confluence8.5.9的部署(下载+安装+pojie)离线部署全流程 遇到的问题

原文地址Linux&#xff1a;confluence8.5.9的部署&#xff08;下载安装破ji&#xff09;离线部署全流程_atlassian-agent-v1.3.1.zip-CSDN博客 背景&#xff1a;个人使用2核4g 内存扛不住 总是卡住&#xff0c;但是流程通了所以 直接公司开服务器干生产 个人是centos7 公司…

线程池的实现与应用

一、线程池 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用&#xff0c…

.net 8使用hangfire实现库存同步任务

C# 使用HangFire 第一章:.net Framework 4.6 WebAPI 使用Hangfire 第二章:net 8使用hangfire实现库存同步任务 文章目录 C# 使用HangFire前言项目源码一、项目架构二、项目服务介绍HangFire服务结构解析HangfireCollectionExtensions 类ModelHangfireSettingsHttpAuthInfoUs…

EventListener与EventBus

EventListener JDK JDK1.1开始就提供EventListener&#xff0c;一个标记接口&#xff0c;源码如下&#xff1a; /*** A tagging interface that all event listener interfaces must extend.*/ public interface EventListener { }JDK提供的java.util.EventObject&#xff1…

优先级队列PriorityQueue(堆)

1. 优先级队列 队列是一种先进先出的数据结构,而如果我们操作的数据带有优先级,我们出队的时候就会先出队优先级最高的元素.比如打游戏的时候有人给你打电话,操作系统看来有俩个进程,优先会处理打电话. 主要功能 1> 返回最高优先级对象 2> 添加新的对象 2. 堆的概念 2.1 …