java学习记录之DBUtils

news2024/9/20 16:37:24

1 jdbc回顾

1.1 批处理

 Statement 执行多条sql
addBatch(sql)
clearBatch()
int[] executeBatch()
 PreparedStatement 执行一条sql语句,多组参数
addBatch() 执行之前必须设置实际参数 psmt.setXxxx()
clearBatch()
executeBatch()

1.2 事务

 事务:一组业务逻辑操作,要么全部成功,要么全部不成功。
 事务特性:ACID
原子性:整体
一致性:数据
隔离性:并发
持久性:结果
 隔离问题:脏读、不可重复读、幻读
 隔离级别:读未提交、读已提交、可重复读、串行化
 jdbc事务操作
开启事务:conn.setAutoCommit(false);
提交事务:conn.commit();
回滚事务:conn.rollback();
conn.rollback(savepoint);

1.3 连接池

 接口:javax.sql.DataSource 数据源,getConnection() 获得连接
 第三方
DBCP:BasicDataSource --> driverClassName, url ,username, password
C3P0:ComboPooledDataSource --> driverClass , jdbcUrl ,user , password
tomcat内置: JNDI容器,名称字符串(“a/b/c”) --> lookup(“java:/comp/env/…”)

2 自定义连接池

 实现步骤
1.创建池,池中存放连接
2.当使用连接池,从池中获得(移除)–保证当前连接只能被一个人使用。
3.使用完成之后,将当前连接归还(添加)
 实现细节
1.使用LinkedList 易于增删,给集合中添加自定义对象(MyConnection)对 DriverManager生成Connection进行增强
2.使用 remove(0) 移除第一个保证同时只有一个人使用当前连接。使用递归处理连接池中没有连接情况。
3.通过 conn.close() 进行当前连接的归还。
 方法增强种类:
1.继承:父子类 – 前提:必须有父类
2.装饰者设计模式,前提:必须有接口【】
设计模式–固定的代码
3.动态代理,前提:必须有接口
4.字节码增强。例如:cglib、javaassist等

3 DbUtils

 apache 提供工具类,简化JDBC开发。
 导入jar包:
在这里插入图片描述

默认情况将使用连接池,将连接池交予工具,jdbc对象都有工具维护(Connection /Statement/ResultSet)

 核心类:QueryRunner
方式1:没有事务【】
构造方法:new QueryRunner(DataSource); , 提供连接池,工具自己维护连接
方法api
update(sql, params…) 执行DML sql 语句,并设置实际参数(可变参数,可以多个)
query(sql, handler , params…) 执行DQL 语句,params实际参数,将查询结果集ResultSet,使用Handler提供处理类进行处理,并将数据封装到指定的内容中。
方式2:使用事务(Connection),必须手动获得连接,且程序进行维护
构造方法:new QueryRunner()
方法api
update(conn , sql, params…)
query(conn , sql ,handler ,params…)
 处理类:将ResultSet 按照 指定的策略进行数据封装。(设计模式:策略)
BeanListHandler ,将查询每一条封装到指定JavaBean,将javaBean实例添加集合,最后返回集合。
BeanListHandler(User.class)
BeanHandler ,将查询一条封装到指定javabean,并返回javabean实例
BeanHandler(User.class)
ScalarHandler 处理一行一列结果集(聚合函数)
ArrayHandler 将查询一条记录所有的数据封装到数组中,并返回。Object[] arr = {1,“jack”,“1234”};
ArrayListHandler 将查询每一条记录封装到数组中,在数组添加到List集合,最后返回list集合。
new ArrayList() , list.add(Object[] )
ColumnListHandler 将执行列封装List集合。 List list = {“jack”,“rose”,“tom”};
KeyedHandler 将每一条记录封装到Map<String,Object> A , 在将mapA封装到map B中 , mapB.key 就是指定的key,mapB.value 就是mapa
{
rose={id=1, username=rose, password=9999},
jack={id=2, username=jack, password=1234}
}
MapHandler 将一条记录封装到Map,并返回map
{id=2, username=jack, password=1234}
MapListHandler ,将每一条封装Map中,将Map添加List集合中,返回List集合。
在这里插入图片描述

 工具类:
DbUtils.commitAndCloseQuietly(conn);
DbUtils.rollbackAndCloseQuietly(conn);

//手动事务

@Test
	public void demo09(){
		//1 获得连接
		Connection conn = null;
		
		
		try {
			conn = JdbcUtils.getConnection();
			/**开启事务*/
			conn.setAutoCommit(false);
			//2核心类
			QueryRunner runner = new QueryRunner();   //注意:使用事务时,不传递连接池
			
			//3 删除
			int r = runner.update(conn, "delete from t_user where id = ?", 2);
			
			System.out.println(r);
			/**提交*/
			//conn.commit();
			DbUtils.commitAndCloseQuietly(conn);
		} catch (Exception e) {
			DbUtils.rollbackAndCloseQuietly(conn);
			throw new RuntimeException(e);
		} 
		
	}

4 自定义DbUtils

 DbUtils 底层使用PreparedStatement
 query方法进行查询,并通过 设置结果集处理类进行相应数据封装。使用策略模式。
1.获得运行时查询结果集中列数,及每一列名称
元数据MetaData,用于描述数据库的数据。
ResultSetMetaData rsMetaData = = rs.getMetaData()
rsMetaData.getColumnCount() , rsMetaData.getColumnName(index)
2. 给javabean封装数据

5 BeanUtils

 apache commons 组件一个,用于给javabean进行数据封装的。
 导入jar
核心:commons-beanutils-1.8.3.jar
依赖:commons-logging-1.1.1.jar
 核心类:BeanUtils
setProperty(bean,name,value) ,给指定的javabean 指定的属性名,设置值。
等效 bean.setName(value)
populate(bean,Map<String,String[]>) 给指定的javabean封装map数据。map.key javabean属性名
 类型转换器,定义自定义需求
ConvertUtils.register(converter , Class);
DateConverter dateConverter = new DateConverter();
// * 设置转换格式
//dateConverter.setPattern(“yyyy-MM-dd HH:mm:ss”);
String[] patterns = {“yyyy-MM-dd HH:mm:ss”,“yyyy-MM-dd”};
dateConverter.setPatterns(patterns);

	ConvertUtils.register(dateConverter, java.util.Date.class);

6 案例

6.1 名称

 客户管理系统:customer manager system (cms)

6.2 功能分析

 添加客户
 查询所有客户
 修改客户
 条件查询
 分页查询
 删除客户

6.3 技术分析

 三层系统架构
 数据库优化:c3p0连接池
 DBUtils ,jdbc简化操作
 BeanUtils,javabean数据封装
在这里插入图片描述

6.4 环境搭建

6.4.1 导入jar包

在这里插入图片描述

6.4.2 包结构

在这里插入图片描述

6.4.3 数据库及表

create table t_customer(
  id varchar(32) primary key ,  #UUID
  name varchar(50),	#姓名
  gender char(1),	#性别
  birthday date,	#生日,类型选择: date ,varchar(19) yyyy-MM-dd hh:mm:ss , int getTime() 等
  cellphone varchar(11),#电话
  email varchar(100),	#邮箱
  preference varchar(50),  #爱好,格式: 1,2,3,4
  type varchar(10),	#类型
  description varchar(500)	#描述
);

6.4.4 javabean

	private String id;
	private String name;
	private String gender;
	
	private Date birthday;
	private String cellphone;
	private String email;
	
	private String preference;
	private String type;
	private String description;

6.4.5 工具类及配置文件

6.4.5.1 连接池

在这里插入图片描述

public class JdbcUtils {
	
	//定义一个连接池
	private static DataSource dataSource = new ComboPooledDataSource("day17_cms_xml");
	
	/**
	 * 获得连接池(数据源)
	 * @return
	 */
	public static DataSource getDataSource(){
		return dataSource;
	}

}
6.4.5.2 javabean封装
6.4.5.3 字符串工具

在这里插入图片描述

6.4.6 dao层

 使用DbUtils完成
 save 、update、delete、findAll、findById

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

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

相关文章

SpringBoot 整合redis + Aop防止重复提交 (简易)

1.redis的安装 redis下载 解压 安装 # wget http://download.redis.io/releases/redis-6.0.8.tar.gz # tar xzf redis-6.0.8.tar.gz # cd redis-6.0.8 # make 看一下就会有 进入redis-6.0.8下的src目录 [rootVM-16-8-centos redis]# cd redis-6.0.8 [rootVM-16-8-centos re…

【Java】Java 中的引用类型

本文仅供学习参考&#xff01; Java是一种类型化语言&#xff0c;这本质上意味着声明的每个变量都有与之关联的特定类型。此类型确定它可以存储的值。例如&#xff0c;整数类型可以存储非小数。也称为数据类型&#xff0c;这可以大致分为两类&#xff1a;基元和引用。基元类型是…

华为云GaussDB,能否成为数据库国产化替代的“更优选择”?

没有一个行业比数据库更需要长期主义&#xff0c;而在践行长期主义的道路上&#xff0c;国内数据库厂商中华为是不可忽视的存在。 近日&#xff0c;Gartner Peer Insights《Voice of the Customer for Cloud Database Management Systems&#xff0c;2023》报告发布&#xff0…

使用python unittest从零构建web应用的自动化测试用例

文章目录 必要性使用pycharm搭建unittest框架selenium下载web driverweb driver的基本使用driver 定位元素driver使用事件处理下拉框处理复选框 sshftp数据库sqlserveroracle安装使用 mongodb excelpycurl 必要性 大部分团队起始对于要不要投入资源进行UI自动化测试的开发都是…

泰裤辣!Corona 10强势来袭,蓝海创意云同步更新支持

2023年6月22日&#xff0c;Chaos Corona官网发布了Chaos Corona 10 for 3ds Max and Cinema 4D版本。本次不仅更新了新功能&#xff0c;还优化了渲染卡顿的问题&#xff0c;一起来看看有哪些实用的好玩意吧&#xff01; 1.贴花影响特定通道 CR10在你的场景中焕然一新&#xff…

Git报错: Please move or remove them before you switch branches.

Bug记录&#xff1a;在我写需求的时候&#xff0c;产品说上个包有崩溃&#xff0c;于是我就控制台 git checkout切分支&#xff0c;结果报错Please move or remove them before you switch branches.下面是被改动的文件&#xff0c;因为是项目build的时候产生的临时文件&#x…

在虚幻引擎中创建大气的HIMIL电影作品

今天瑞云渲染小编给大家带来了关于电影制片人Tiziano Fioriti展示了《H I M I L》项目背后的工作流程&#xff0c;解释了人工智能是如何用于细节的&#xff0c;并谈到了设置火光的问题。 介绍 大家好&#xff0c;我叫Tiziano Fioriti&#xff0c;是来自意大利的自由电影制作人…

RabbitMQ管理界面介绍

1.管理界面概览 connections&#xff1a; 无论生产者还是消费者&#xff0c;都需要与RabbitMQ建立连接后才可以完成消息的生产和消费&#xff0c;在这里可以查看连接情况 channels&#xff1a; 通道&#xff0c;建立连接后&#xff0c;会形成通道&#xff0c;消息的投递获取依…

高阶常系数微分方程——笔记整理

首先&#xff0c;介绍基本知识&#xff1a; 首先&#xff0c;我们对式子进行处理得到&#xff1a; 得到特征根是 和 0, 所以其通解 假设特解是,带入方程所得&#xff1a;

Nik Color Efex 滤镜库

Nik Color Efex 滤镜库中提供了 55 个滤镜。有关这些滤镜的详细参数说明请分别参阅&#xff1a; 1 ~ 11 《Nik Color Efex 滤镜详解&#xff08;1/5&#xff09;》 12 ~ 22 《Nik Color Efex 滤镜详解&#xff08;2/5&#xff09;》 23 ~ 33 《Nik Color Efex 滤镜详解&#x…

2023年java还是golang还是c#?

前言 我们可以先来看一下这三门语言各自的优劣 学习曲线&#xff1a;如果你是初学者或对编程相对陌生&#xff0c;Java可能是一个较好的选择。它有广泛的学习资源和社区支持&#xff0c;易于上手。Go也有简单易学的特点&#xff0c;但由于相对较年轻&#xff0c;相关的学习资…

为何收入或存款增量难找存量告急

其实&#xff0c;和年纪关系不太大吧&#xff0c;平凡的普通人都没多少存款。 *近日&#xff0c;有调查称“大概五分之一的年轻人存款在一万元以内。10万元存款是一个“坎”&#xff0c;存款超过10万就会超过53.7%的人。”“年轻人”“存款”两个词碰撞在一起&#xff0c;引来了…

python3中http协议提供文件服务器功能

http协议是互联网的通用基础协议&#xff0c;也可以利用其来开发文件服务器&#xff0c;给客户提供文件浏览&#xff0c;查看&#xff0c;下载&#xff0c;上传等功能。 目录 1.python3自带http文件服务 2.python3从头开发http文件服务 1.python3自带http文件服务 python3中…

资源调度框架 YARN

3.1.1 什么是YARN Yet Another Resource Negotiator, 另一种资源协调者通用资源管理系统为上层应用提供统一的资源管理和调度&#xff0c;为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处 3.1.2 YARN产生背景 通用资源管理系统 Hadoop数据分布式存储&#xff08…

【打杂记录】-能否开发一个报账系统,自动批量识别与完成报账任务?

能否开发一个报账系统&#xff0c;自动批量识别与完成报账任务&#xff1f; 今天这篇博客&#xff0c;我想说些非技术性语言。我在研二一年负责实验室的报账工作&#xff0c;近期终于有机会将工作交接给下一位负责人&#xff0c;我的科研时间又回来了。 在这一年里&#xff0c…

centos7 挂载未分配的空间新增卷

一、系统环境 操作系统&#xff1a;Centos 7 已配置环境&#xff1a;空 二、磁盘挂载到新目录&#xff08;磁盘挂载&#xff09; 2.1 查找新硬盘 查看机器所挂硬盘及分区情况&#xff1a; fdisk -l 复制 红框圈中的即是本次要挂载的磁盘&#xff0c;与 /dev/sda 和 /de…

掌握多线程的用法一篇就够了

多线程 线程与进程进程线程线程调度速度问题 创建线程的方式第一种:继承Thread类原理分析 第二种:实现Runnable接口的形式第三种&#xff1a;有返回值的线程 Thread类的方法Thread和Runnable的区别线程安全问题举例测试代码线程安全问题分析案例解决办法分析方案一:使用同步代…

SpringSecurity基础入门详解

【1】SpringSecurity是什么 Spring 是非常流行和成功的 Java 应用开发框架&#xff0c;Spring Security正是Spring家族中的成员。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。 正如你可能知道的关于安全方面的两个主要区域是“认…

使用英特尔 oneAPI AI 工具分析包实现AI应用程序的调试与改进

目录 1.什么是英特尔 oneAPI AI&#xff1f; 关于英特尔 oneAPI AI 工具分析包 2.使用英特尔 oneAPI AI 工具分析包实现AI数据分析 准备工作 数据准备 编写AI应用程序 性能分析 并行性优化 内存和线程错误分析 优化AI算法 性能验证与调试 性能优化迭代 3.总结 1.什…

「2024」预备研究生mem-概率基础加法公式乘法公式古典概型基础

一、概率基础 二、加法公式 三、乘法公式&古典概型基础 均不是1点 除了不是1的概率 不全是1点&#xff1a;也有可能是1点&#xff0c; 理解为 对是1点取非 相互独立 相乘 古典概型&#xff1a; 从A出发&#xff0c;先到B&#xff0c; 先到D&#xff0c;先到C&#xff08;…