【JDBC】----封装工具类和ORM

news2024/11/25 12:39:16

分享第二十二篇励志语录

有些烦恼是我们凭空虚构的,而我们却把它当成真实去承受。想得太多只会毁了你,让你陷入忐忑,让实际上本不糟糕的事情,变得糟糕。阳光这么好,何必自寻烦恼。

 

目录

分享第二十二篇励志语录

一:封装工具类

1 为什么要封装工具类

2 重用性方案

2.1 方案思想

2.2 方案代码

3 跨平台方案

3.1 方案思想

3.2 方案代码

二、ORM

1 实体类(entity):零散数据的载体

2 ORM应用

2.1 创建表student

2 实现步骤

2.2 创建entity实体类

2.3 查询结果封装


一:封装工具类

1 为什么要封装工具类

  • 在实际JDBC中的使用中,存在着大量的重复代码:例如连接数据库、关闭数据库这些操作。

  • 我们需要把传统的JDBC代码进行重构,抽取出通用的JDBC工具类。以后连接任何数据库、释放资源都可以使用这个工具类。

 

2 重用性方案

2.1 方案思想

(1)新建一个工具类DBUtils。

(2)在工具类DBUtils类中封装获取连接、释放资源两个方法。

  • 提供public static Connection getConnection(){}方法。

  • 提供public static void closeAll(Connection connection,Statement statement,ResultSet resultSet){}方法

2.2 方案代码

package cn.bdqn.demo03;

import java.sql.*;

/**
 * 重用性方案
 * 获取连接
 * 释放资源
 */
public class DBUtils {

	static {// 类加载,执行一次!
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	// 1.获取连接
	public static Connection getConnection() {
		Connection connection = null;
		try {
			connection = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/java2217", "root", "123456");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return connection;
	}

	// 2.释放资源
	public static void closeAll(Connection connection, Statement statement,
			ResultSet resultSet) {
		try {
			if (resultSet != null) {
				resultSet.close();
			}
			if (statement != null) {
				statement.close();
			}
			if (connection != null) {
				connection.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

3 跨平台方案

3.1 方案思想

(1)在项目src文件夹下创建db.properties文件,在文件中编写数据库驱动、数据库url、用户名、密码相关数据。

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/java2217
username=root
password=123456

(2)在工具类DBUtils类中读取db.properties配置文件数据。

定义private static final Properties PROPERTIES = new Properties();//读取配置文件的Map
​
定义static{
​
    //通过复用本类自带流,读取配置文件中的数据
​
    InputStream is = DBUtils.class.getResourceAsStream("配置文件路径");
​
    // 通过prop对象将流中的配置信息分隔成键值对
​
    PROPERTIES.load(is);
​
    //通过driverName的键获取对应的值(com.mysql.jdbc.Driver)
​
    String driverName=PROPERTIES.getProperty("driver");
    //注册驱动
    Class.forName(driverName);
}

(3)在工具类DBUtils类中封装获取连接、释放资源两个方法。

  • 提供public static Connection getConnection(){}方法。

  • 提供public static void closeAll(Connection connection,Statement statement,ResultSet resultSet){}方法

3.2 方案代码

package cn.bdqn.demo04;

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

public class DBUtils {
	// //读取配置文件的Map
	private static final Properties PROPERTIES = new Properties();

	static {
		// 通过复用本类自带流,读取配置文件中的数据
		InputStream is = DBUtils.class.getResourceAsStream("/db.properties");

		try {
			// 通过prop对象将流中的配置信息分隔成键值对,将配置文件内容加载到properties集合
			PROPERTIES.load(is);
			// 注册驱动,通过driverName的键获取对应的值(com.mysql.jdbc.Driver)
			Class.forName(PROPERTIES.getProperty("driver"));
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	// 获取连接对象
	public static Connection getConnection() {
		Connection connection = null;
		try {
			connection = DriverManager.getConnection(
					PROPERTIES.getProperty("url"),
					PROPERTIES.getProperty("username"),
					PROPERTIES.getProperty("password"));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return connection;
	}

	// 释放所有资源
	public static void closeAll(Connection connection, Statement statement,
			ResultSet resultSet) {
		try {
			if (resultSet != null) {
				resultSet.close();
			}
			if (statement != null) {
				statement.close();
			}
			if (connection != null) {
				connection.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

二、ORM

(1)ORM(Object Relational Mapping),对象关系映射。

(2)从数据库查询到的结果集(ResultSet)在进行遍历时,逐行遍历,然后一个字段一个字段的读取数据,取出的都是零散的数据。在实际应用开发中,我们需要将零散的数据进行封装整理。

(3)在Java中,将查询出来的数据封装成一个对象。

1 实体类(entity):零散数据的载体

  • 一行数据中心,多个零散的数据进行整理,一行数据(在数据库中称之为一条记录或者一个实体)对应Java中的一个对象。

  • 通过entity的规则对表中的数据进行对象的封装。

  • 表名=类名;列名=属性名;提供各个属性的getXxx()/setXxx()方法。

  • 提供无参构造方法、有参构造方法

  • 重写toString()方法

2 ORM应用

2.1 创建表student

1、创建一张学生表student,表的字段如下:

sid,学生编号,主键、自动增长。

name,学生姓名,字符串类型、唯一、非空。

age,年龄,int类型、非空。

phone,手机号码,字符串类型,非空

CREATE TABLE IF NOT EXISTS `student`(
    `sid` INT PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(10) UNIQUE NOT NULL,
    `age` INT NOT NULL,
    `phone` VARCHAR(11) NOT NULL
);

2、向student表中插入两条数据:

INSERT INTO `student` VALUES(1001,'zhangsan',19,'13112341234');
INSERT INTO `student` VALUES(1002,'lisi',19,'13866665555');

2 实现步骤

2.2 创建entity实体类

package com.cxyzxc.examples01;

/**
 * entity实体类
 * 
 * @author 程序员张小厨
 * 
 */
public class Student {
	/** 学号 */
	private int sid;
	/** 姓名 */
	private String name;
	/** 年龄 */
	private int age;
	/** 手机号码 */
	private String phone;

	// 无参构造方法
	public Student() {
		super();
	}

	// 有参构造方法
	public Student(int sid, String name, int age, String phone) {
		super();
		this.sid = sid;
		this.name = name;
		this.age = age;
		this.phone = phone;
	}

	// getXxx()/setXxx()方法
	public int getSid() {
		return sid;
	}

	public void setSid(int sid) {
		this.sid = sid;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	// 重写Object类中的toString()方法
	@Override
	public String toString() {
		return "id=" + sid + ", name=" + name + ", age=" + age + ", phone="
				+ phone;
	}

}

 

2.3 查询结果封装

package com.cxyzxc.examples01;
​
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
​
public class StudentJDBCQuery {
​
    public static void main(String[] args) {
​
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
​
        try {
            // 2、获取连接对象(1、注册驱动在DBUtils类中完成了)
            connection = DBUtils.getConnection();
            // 3、获取发送SQL语句的对象
            statement = connection.createStatement();
            // 编写SQL语句
            String sql = "select * from student";
            // 4、执行SQL语句,得到结构集
            resultSet = statement.executeQuery(sql);
            // 5、遍历结果集,使用while循环进行遍历
            while (resultSet.next()) {
                // 如果有数据,根据列的编号获取每行每个字段的数据
                int sid = resultSet.getInt(1);
                String name = resultSet.getString(2);
                int age = resultSet.getInt(3);
                String phone = resultSet.getString(4);
                // 创建实体类对象
                Student student = new Student();
                // 将字段数据赋值给对应的实体类对象属性
                student.setSid(sid);
                student.setName(name);
                student.setAge(age);
                student.setPhone(phone);
                System.out.println(student);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.closeAll(connection, statement, resultSet);
        }
    }
}

今天的分享就到此结束了

创作不易点赞评论互关三连

 

 

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

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

相关文章

毕业设计 stm32老人跌倒检测预防系统 - 单片机 物联网 嵌入式

文章目录0 前言1 整体设计2 硬件电路3 软件设计4 跌倒检测算法5 关键代码6 最后0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉…

linux常用命令二

1、find 查找文件或目录 find / -size 204800k //在根目录下查找大于200MB的文件 find / -user username//在根目录下查找所有者为username的文件 find / -name filename.txt //根据名称查找/目录下的filename.txt文件。 2、复制文件包括其子文件到自定目录 cp -r sourceF…

[附源码]JAVA毕业设计水果销售管理网站(系统+LW)

[附源码]JAVA毕业设计水果销售管理网站(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术…

AidLux智慧交通AI安全实战

这里写目录标题1.项目背景2. 项目实战流程2.1 YOLOv5车辆检测模型训练及部署2.2 AI对抗攻击与对抗防御2.2.1 AI对抗攻击算法讲解2.2.2 常用AI对抗攻击算法划分2.2.3 对抗攻击主要代码2.2.4 对抗攻击效果验证2.2.4 常用AI对抗防御算法讲解2.2.5 常用AI对抗防御算法划分2.2.6 对抗…

实验十一 级数与方程符号求解(MATLAB)

实验十一 级数与方程符号求解 1.1实验目的 1.2实验内容 1.3流程图 1.4程序清单 1.5运行结果及分析 1.6实验的收获与体会 1.1实验目的 1.2实验内容 实验十一 级数与方程符号求解 课本373页 1.3流程图 1.4程序清单 实验十一 1 clear clc nsym(n);xsym(x); s1…

通关算法题之 ⌈字符串⌋

字符串 171. Excel 表列序号 给你一个字符串 columnTitle ,表示 Excel 表格中的列名称,返回该列名称对应的列序号。 A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...输入: columnTitle "A" 输出: 1 输入: col…

一起用Go做一个小游戏(中)

限制飞船的活动范围上一篇文章还留了个尾巴,细心的同学应该发现了:飞船可以移动出屏幕!!!现在我们就来限制一下飞船的移动范围。我们规定飞船可以左右超过半个身位,如下图所示:很容易计算得出&a…

vue3+ts打包报错处理

打包报错 但是npm run dev 是运行正常的 经过一番搜索之后,这个错误是比较难搜索到的 注意看package.json 中的vue-tsc --noEmit 删掉就可以了 { “name”: “vuevitec”, “version”: “0.0.0”, “scripts”: { “dev”: “vite”, “build”: “vue-tsc --noEm…

NextJs 学习笔记

NextJs 学习笔记 简述 之前使用过 Nuxt3 基于前端框架 Vue3 来开发网站,因为 Nuxt3 很多地方借鉴了基于 React 的 SSR 框架 Next,因此最近抽时间开始学习一下 Next 这个框架。 创建项目 npx create-next-applatest # or yarn create next-app # or p…

大学生川菜网页制作教程 学生HTML静态美食菜品网页设计作业成品 简单网页制作代码 学生美食网页作品免费设计

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

适老化产品开发:用科技和智能解决老龄化难题

随着人口的深度老龄化,很多老年人不会使用智能手机、不会上网,在消费、出行等日常生活中遇到很多不便,为老人提供更多的养老、适老化产品,完善的养老服务,打造舒适安全的养老环境是我们急需解决的问题。实现适老化产品…

给自己的hexo博客个性化Volantis主题

文章目录准备工作一、搭建一个大致框架二、在_config.yml的一些基础配置三、在_config.volantis.yml的进阶配置1.首先我们要创建页面2.自定义导航栏3.自定义友链页面设置4.自定义页脚5.自定义封面6.自定义侧边栏7.利用不蒜子添加访问人数8.添加阅读时长和字数9.添加音乐播放器1…

【从零开始学习深度学习】12. 什么是模型的训练误差?基于三阶多项式的欠拟合与过拟合训练过程演示

目录前言1.1 训练误差和泛化误差1.2 模型选择1.2.1 验证数据集1.2.3 KKK折交叉验证1.3 欠拟合和过拟合1.3.1 模型复杂度1.3.2 训练数据集大小1.4 多项式函数拟合示例1.4.1 生成数据集1.4.2 定义、训练和测试模型1.4.3 三阶多项式函数拟合(正常)1.4.4 线性…

【Docker教程系列】Docker学习5-Docker镜像理解

通过前面几篇文章的学习,我们已经安装好了Docker,也学会使用一些常用的命令。比如启动命令、镜像命令、容器命令。常用命令分类后的第二个就是镜像命令。那么镜像是什么?拉取镜像的时候为什么是一层一层的?镜像加载的原理是什么&a…

LeetCode #2.两数相加

力扣 | 2.两数相加 题目截图 官方方法 总共有三个链表,l1,l2和最后的结果链表。l1和l2各自滑动对应链表各个位数支出相应的值,最后相加,将结果添加到新链表上。 唯一需要考虑的是数值相加后的进位。 先设置进位carry为0 结果相加的时候利…

[附源码]计算机毕业设计考试系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

如何系统全面的成为一个网络工程师?看完这个你就懂了

如何系统全面的成为一个网络工程师?总有粉丝这样问我,今天就来给大家推荐一个方法。 想要真正系统全面地成为一个网络工程师,掌握系统全面的网络技术的话,我这边建议的话还是完整的学一下华为认证HCIA、HCIP、HCIE,这三…

JavaScript -- Date对象及常用方法介绍

文章目录Date1 Date介绍2 常用方法介绍3 创建指定日期的Date对象4 日期的格式化Date Date - JavaScript 1 Date介绍 在JS中所有的和时间相关的数据都由Date对象来表示 创建Date对象 let d new Date() // 直接通过new Date()创建时间对象时,它创建的是当前的时…

双12哪些数码好物实用不吃灰?2022最值得入手的数码好物推荐

年末的双十二来了,相信不少人像我一样已经将自己想买的一些数码产品加入购物车啦。实用性强的数码产品才是最好的,才能最大程度地体现它的价值。那么,有哪些数码好物实用性强且不吃灰呢?下面,我来给大家推荐几款2022最…

电力系统的延时功率流 (CPF)的计算【 IEEE-14节点】(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 📝目前更新:🌟🌟🌟电力系统相关知识,期刊论文&…