14. JDBC

news2024/12/22 22:32:16

1. JDBC基础

• JDBC的全称是 Java Database Connectivity,即Java数据库连接,它是一种可以执行SQL语句的Java API。
• Java API是接口,其实现类由各数据库厂商提供实现,这些实现类就是“驱动程序”。

2.JDBC编程步骤

导入驱动jar包
创建lib目录,存放mysql的驱动mysql-connector-java-5.1.40-bin.jar
选中mysql的jar包,右键选择“ Add as Library…” 完成jar导入
在这里插入图片描述

import java.sql.*;

public class JDBCTest {
    public static void main(String[] args) {
        Connection connection=null;
        Statement sta=null;
        ResultSet rs=null;
        try {
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //  2.获取数据库连接
             connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/emps", "root", "root");
            //3.获取操作数据库的工具
             sta = connection.createStatement();//操作数据库就需要这个sta
            //4.操作数据库
            String sql="select * from emp";
            //String sql1="delete from emp where ename='hello'";
            //查询用executeQuery//更新语句用executeUpdate
             rs = sta.executeQuery(sql);
            // 5.处理结果集
            while (rs.next()){
                System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getString("JOB"));
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //6.关闭资源
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(sta!=null){
                try {
                    sta.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

思考:
• Url、User、Password直接在代码中定义,如果数据库服务器稍作变动,怎么办?
• 一个项目基本针对一个底层数据库,难道每次操作数据库,都要注册一次驱动程序嘛?是否可以只注册一次?
• 获取数据库连接时,每次都需要Url、User、Password,一旦改动其中一个数据,意味着要修改所有此处的代码。
• 释放资源,每次数据库操作后,都需要释放资源,难道每次操作后都要写三次try close catch代码嘛?

3.JDBC封装类

在这里插入图片描述
在这里插入图片描述

编写JDBCUtil工具类:

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JDBCUtil {
    private static String username=null;
    private static String password=null;
    private static String url=null;
    static {
        //这里边获取url,uesr。。。  并且注册驱动
        Properties pro=new Properties();
        InputStream is=JDBCUtil.class.getClassLoader().getResourceAsStream("pm/jdbc.properties");
        try {
            pro.load(is);
            username = pro.getProperty("username");
            url= pro.getProperty("url");
            password=pro.getProperty("password");
            Class.forName(pro.getProperty("driver"));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() {
        Connection con = null;
        try {
            con = DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }

    public static void close(Connection con, PreparedStatement sta, ResultSet resultSet) {
        if(con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(sta!=null){
            try {
                sta.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

编写测试类:

import java.sql.*;

public class Test1 {
    public static void main(String[] args) {
        Connection con = JDBCUtil.getConnection();
        PreparedStatement ps = null;
        try {
            //获取操作数据库的工具
            ps = con.prepareStatement("update emp set ENAME=? WHERE ENAME=?");
            PreparedStatement ps1 = con.prepareStatement("INSERT INTO EMP(EMPNO,ENAME) VALUE(?,?) ");
            ps.setString(1, "hello");
            ps.setString(2, "good");
            int i = ps.executeUpdate();
            if (i > 0) {
                System.out.println("yse");
            } else {
                System.out.println("no");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        /*   ResultSet resultSet = ps.executeQuery();
        //处理结果集
        while (resultSet.next()){
            System.out.println(resultSet.getInt(1)+" "+resultSet.getString(2));
        }*/
        //关闭资源
        JDBCUtil.close(con, ps, null);
    }
}

4.PreparedStatement接口

Statement的缺点:
• 同样的SQL语句,每次都要发送,不能进行有效的缓存。
• 拼接SQL字符串非常容易出现错误。
• 不能防止恶意数据,易产生SQL注入。
升级后的新接口PreparedStatement
• 预编译SQL语句,并进行有效的缓存,性能更好。
• 允许使用问号占位符参数,并且该参数必须获得值后才可以执行。
• 无需拼接SQL语句。
在这里插入图片描述

5.JDBC_事务处理

事务处理就是当执行多个SQL指令时,如果因为某个原因使其中一条指令执行有错误,则取消先前执行过的所有指令。它的作用是保证各项操作的一致性和完整性。
事务的特性:
• 1) 原子性(atomicity):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行。
• 2) 一致性(consistency):事务在完成时,必须是所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。
• 3) 隔离性(isolation):一个事务的执行不能被其他事务所影响。
• 4) 持久性(durability):一个事务一旦提交,事物的操作便永久性的保存在DB中。即使此时再执行回滚操作也不能撤消所做的更改。
JDBC事务是通过Connection对象进行控制的。其提供了两种事务:
• 自动提交模式:系统默认,每项数据库操作成功后,系统会自动提交。
• 手工提交模式:首先必须取消自动提交模式,然后通过commit()和rollback()提交和回滚事务。
在这里插入图片描述

6.DatabaseMetaData和ResultSetMetaData

DatabaseMetaData用于封装数据库相关信息.
在这里插入图片描述

ResultSetMetaData用于封装结果集相关信息
在这里插入图片描述

7.JDBC连接池

JDBC数据库连接的建立及关闭是极耗系统资源的操作。之前获得的数据库连接,一个数据库连接对象均为一个物理数据库连接,每次操作都打开一个物理连接,使用完后立即关闭连接。频繁地打开、关闭连接将造成系统性能低下。
数据库连接池的解决方案是:当应用程序启动时,系统主动建立足够的数据库连接,并将这些连接组成一个连接池。每次应用程序请求数据库连接时,无须重新打开连接,而是从池中取出已有的连接使用,使用完后,不再关闭数据库连接,而是直接将连接归还给连接池。
在这里插入图片描述

8.DAO设计模式

Java EE架构大致分为如下几层:
• Domain Object(领域对象)层:此层由系列的POJO(Plain Old Java Object,普通的、传统的Java对象)组成,这些对象是该系统的Domain Object,往往包含了各自所需要实现的业务逻辑方法。
• DAO(Data Access Object,数据访问对象)层:此层由系列的DAO组件组成,这些DAO实现了对数据库的创建、查询、更新和删除(CRUD)等原子操作。
• 业务逻辑层:此层由系列的业务对象组成,这些业务逻辑对象实现了系统所需要的业务逻辑方法。这些业务逻辑方法可能仅仅用于暴露Domain Object对象所实现的业务逻辑方法,也可能是依赖DAO组件实现的业务逻辑方法。
• 控制器层:此层由系列控制器组成,这些控制器用于拦截用户请求,并调用业务逻辑组件的业务逻辑方法,处理用户请求,并根据处理结果转发到不同的表现层组件。
• 表现层:此层由系列的JSP页面、Velocity页面、PDF文档视图组件组成。此层负责收集用户请求,并将显示处理结果。
大致上,Java EE 应用的架构如图所示:
在这里插入图片描述

基于数据库的信息系统,每张数据表基本都包含如下操作(函数):
• 新增记录、修改记录、删除记录
• 根据主键获取单个记录
• 根据记录数
• 获取所有记录
• 获取分页记录
PS:以上仅为基本操作,实际中还需包含其它复杂操作。
以上操作中,数据的传入传出都以对象形式,所有每张数据表对应一个实体类(列名对应属性名)

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

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

相关文章

[GXYCTF2019]Ping Ping Ping (文件执行漏洞)

本题考点: 1、命令联合执行 2、命令绕过空格方法 3、变量拼接 1、命令联合执行 ; 前面的执行完执行后面的| 管道符,上一条命令的输出,作为下一条命令的参数(显示后面的执行结果)|| 当前面的执行出错时(为…

day04-报表技术PDF

1 EasyPOI导出word 需求:使用easyPOI方式导出合同word文档 Word模板和Excel模板用法基本一致,支持的标签也是一致的,仅仅支持07版本的word也是只能生成后缀是docx的文档,poi对doc支持不好所以easyPOI中就没有支持doc&#xff0c…

字节与位在物联网传输协议中的使用

1个字节(byte) 8个位(bit) 如下例子,是一个上报数据类型的表格,总有48位(6个字节) 假如报文给的数据类型数据是: 0x06 时,06十六进制转为二进制,结果是00000110 那么在图下就是 (bit1 和 bit2 都为 1) &#xff…

Python中的程序逻辑经典案例详解

我的博客 文章首发于公众号:小肖学数据分析 Python作为一种强大的编程语言,以其简洁明了的语法和强大的标准库,成为了理想的工具来构建这些解决方案。 本文将通过Python解析几个经典的编程问题。 经典案例 水仙花数 问题描述&#xff1a…

Python 爬虫之简单的爬虫(一)

爬取网页上所有链接 文章目录 爬取网页上所有链接前言一、基本内容二、代码编写1.引入库2.测试网页3.请求网页4.解析网页并保存 三、如何定义请求头?总结 前言 最近也学了点爬虫的东西。今天就先给大家写一个简单的爬虫吧。循序渐进,慢慢来哈哈哈哈哈哈…

关于技术架构的思考

技术选型实则是取舍的艺术 这句话是我偶然在一篇技术架构方面的文章上看到的,每当我需要给新项目进行技术选型,决定技术架构时,一直坚信的。 当我们做技术选型时,需要考虑的东西非常多。比如,用关系型数据库还是非关…

Linux 中的网站服务管理

目录 1.安装服务 2.启动服务 3.停止服务 4.重启服务 5.开机自启 6.案例 1.安装服务 网址服务程序 yum insatll httpd -y 查看所有服务 systemctl list-unit-files 2.启动服务 systemctl start httpd 查看服务进程,确认是否启动 ps -ef|grep httpd 3.停止…

关联规则 关联规则概述

关联规则概述 关联规则 (Association Rules) 反映一个事物与其他事物之间的相互依存性和关联性。如果两个或者多个事物之间存在一定的关联关系,那么,其中一个事物就能够通过其他事物预测到。 关联规则可以看作是一种IF-THEN关系。假设商品A被客户购买&…

D33|动态规划!启程!

1.动态规划五部曲: 1)确定dp数组(dp table)以及下标的含义 2)确定递推公式 3)dp数组如何初始化 4)确定遍历顺序 5)举例推导dp数组 2.动态规划应该如何debug 找问题的最好方式就是把…

力扣日记12.13-【二叉树篇】从中序与后序遍历序列构造二叉树

力扣日记:【二叉树篇】从中序与后序遍历序列构造二叉树 日期:2023.12.13 参考:代码随想录、力扣 106. 从中序与后序遍历序列构造二叉树 题目描述 难度:中等 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二…

SpringData自定义操作

一、JPQL和SQL 查询 package com.kuang.repositories;import com.kuang.pojo.Customer; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.PagingAndSortingR…

Linux上使用HTTP协议进行数据获取的实战示例

嗨,Linux爱好者们,今天我们要一起探讨一下如何在Linux上进行HTTP协议的数据获取。这不是一项简单的任务,但放心,我会以最简单的语言,结合实例来给大家讲解。 首先,我们需要一个工具,那就是curl…

Flutter工具安装与环境搭建

1、下载 Flutter SDK,下载完成后,在需要放置SDK的地方解压即可。 注意: 请勿将 Flutter 有特殊字符或空格的路径下。请勿将 Flutter 安装在需要高权限的文件夹内,例如 C:\Program Files\。 2、配置环境变量 例如: …

Java学习之线程锁

一、多线程 对于多线程的概念,其实很容易理解,之前我们的学习中无论多长或者怎样的代码,都是线性执行的,也就是很显而易见的自上而下执行,这也是所有语言中最常见的执行方式,那么这种执行方式有什么弊端呢…

CLEARTEXT communication not enabled for client

CLEARTEXT communication not enabled for client 把BaseHttpClient中的supportTsl修改为false

Python生成器(Generator)的应用场景和使用(继续更新...)

学习网页: Welcome to Python.orghttps://www.python.org/https://www.python.org/ Python生成器(Generator) 生成器在Python中有很多应用场景,以下是一些常见的应用场景: 处理大数据量和耗时操作的场景&#xff…

魔众文库系统v5.7.0版本文件顺序选择,短信注册支持设置密码,前端界面升级

文件顺序选择,短信注册支持设置密码,前端界面升级 [新功能] 富文本支持文档一键导入,支持Word文档(docx)、Markdown文档(md) [新功能] 财务中心→全部订单新增"业务订单ID"筛选条件…

C++相关闲碎记录(15)

1、string字符串 #include <iostream> #include <string> using namespace std;int main (int argc, char** argv) {const string delims(" \t,.;");string line;// for every line read successfullywhile (getline(cin,line)) {string::size_type beg…

布局前沿技术,紫光展锐推动6G创新融合发展

随着5G进入规模化商用阶段&#xff0c;6G研究已在全球范围内拉开帷幕。2023年6月&#xff0c;ITU发布了《IMT面向2030及未来发展的框架和总体目标建议书》&#xff0c;在升级5G三大应用场景的同时&#xff0c;扩展出三个跨领域场景&#xff0c;形成6G的六大应用场景&#xff0c…

读书心得(内容取自高质量C/C++编程)

版式虽然不会影响程序的功能&#xff0c;但会影响可读性。程序的版式追求清晰、美观&#xff0c;是 程序风格的重要构成因素。 可以把程序的版式比喻为“书法”。好的“书法”可让人对程序一目了然&#xff0c;看得兴致勃勃。差的程序“书法”如螃蟹爬行&#xff0c;让人看得…