Java Database Connectivity (JDBC + Servlet)

server/2024/11/26 1:26:53/

https://blog.csdn.net/SuYuewu/article/details/143986880?sharetype=blogdetail&sharerId=143986880&sharerefer=PC&sharesource=SuYuewu&spm=1011.2480.3001.8118

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.ppmy.cn/server/144941.html

相关文章

微信万能门店小程序系统存在任意文件读取漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…

5、AI测试辅助-生成测试用例思维导图

AI测试辅助-生成测试用例思维导图 创建测试用例两种方式1、Plantuml思维导图版本 (不推荐&#xff09;2、Markdown思维导图版本&#xff08;推荐&#xff09; 创建测试用例两种方式 完整的测试用例通常需要包含以下的元素&#xff1a; 1、测试模块 2、测试标题 3、前置条件 4、…

鸿蒙生态崛起

1.鸿蒙生态&#xff1a;开发者的新蓝海 从开发者角度看&#xff0c;鸿蒙生态带来了巨大机遇。其分布式能力实现了不同设备间的无缝体验&#xff0c;如多屏协同&#xff0c;让应用能跨手机、平板、智能穿戴和车载设备流畅运行。开发工具也有显著提升&#xff0c;方舟编译器等极大…

Java基于Spring Boot框架的房屋租赁系统,附源码

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

Github工作流

GitHub 工作流 是一种专门为 GitHub 上的代码协作和版本控制而设计的工作流&#xff0c;它强调通过 **拉取请求&#xff08;Pull Request&#xff0c;PR&#xff09;** 来管理代码的合并和审查。GitHub 工作流通常涉及到使用 **分支** 来进行功能开发和修复&#xff0c;并通过 …

并发和并行的基础知识

1. 并发&#xff08;Concurrency&#xff09;的例子 场景&#xff1a;单核计算机同时运行多个应用程序 假设你正在使用一台单核 CPU 的计算机&#xff0c;你同时打开了以下任务&#xff1a; 任务 A&#xff1a;听音乐&#xff08;音乐播放器&#xff09;。任务 B&#xff1a…

nature communications论文 解读

题目《Transfer learning with graph neural networks for improved molecular property prediction in the multi-fidelity setting》 这篇文章主要讨论了如何在多保真数据环境&#xff08;multi-fidelity setting&#xff09;下&#xff0c;利用图神经网络&#xff08;GNNs&…

HarmonyOS(57) UI性能优化

性能优化是APP开发绕不过的话题&#xff0c;那么在HarmonyOS开发过程中怎么进行性能优化呢&#xff1f;今天就来总结下相关知识点。 UI性能优化 1、避免在组件的生命周期内执行高耗时操作2、合理使用ResourceManager3、优先使用Builder方法代替自定义组件4、参考资料 1、避免在…