JDBC进阶篇-ROM、主键回显、批量操作、连接池

实体类和ORM

  • 在使用JDBC操作数据库时,我们会发现数据都是零散的,明明在数据库中是一行完整的数据,到了Java中变成了一个一个的变量,不利于维护和管理。而我们Java是面向对象的,一个表对应的是一个类,一行数据就对应的是Java中的一个对象,一个列对应的是对象的属性,所以我们要把数据存储在一个载体里,这个载体就是实体类!
  • ORM(Object Relational Mapping)思想,对象到关系数据库的映射,作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来,以面向对象的角度操作数据库中的数据,即一张表对应一个类,一行数据对应一个对象,一个列对应一个属性!
  • 当下JDBC中为手动ORM。自动ORM要学习ORM框架,比如MyBatis、JPA等。

ORM实现步骤

  • 封装实体类JavaBean
    • 类和数据库名对应,但是表名一般缩写,类名要全写
    • JavaBean中属性与数据库中列名相对应,数据库中列名用下划线分隔,属性名用驼峰
    • 实现无参构造器,有参构造器,get、set方法等
  • 使用JDBC连接数据库
		//1.注册驱动
//        Class.forName("com.mysql.cj.jdbc.Driver");//2.获取数据库连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名", "root","密码");//3.创建PreparedStatement对象,并预编译SQL语句,使用?占位符PreparedStatement preparedStatement = connection.prepareStatement("select 查询字段 表名");//4.为占位符赋值,索引从1开始,执行SQL语句,获取结果//preparedStatement.setInt(第几个占位符, 数据字符串);,有?占位符时添加ResultSet resultSet = preparedStatement.executeQuery();//预先创建实体类变量,自定义Employee employee = null; // 实体类 实体类名 = null;//预先创建类集合,自定义List<Employee> employeeList = new ArrayList<>();//5.封装while (resultSet.next()) {int 属性名1 = resultSet.getInt("列名");String 属性名2 = resultSet.getString("列名");Double 属性名3 = Double.valueOf(resultSet.getString("列名"));//当结果集中有数据,再进行对象的创建employee = new Employee(属性名1,属性名2,属性名3);//将每次循环封装的一行数据的对象存储在集合里employeeList.add(employee);}//6.处理结果,遍历集合for(Employee emp : employeeList){System.out.println("employee = " + emp);}//7.释放资源(先开后关原则)resultSet.close();preparedStatement.close();connection.close();}

主键回显

在数据中,执行新增操作时,主键列为自动增长,可以在表中直观的看到,但是在Java程序中,我们执行完新增后,只能得到受影响行数,无法得知当前新增数据的主键值。在Java程序中获取数据库中插入新数据后的主键值,并赋值给Java对象,此操作为主键回显。

  • 在创建preparedStatement对象时,传入逐渐回显参数Statement.RETURN_GENERATED_KEYS,告诉对象我需要获取主键
  • 调用preparedStatement对象中getGeneratedKeys()方法,获取一行一列结果集
  • 在结果集中获取主键列值
		//创建preparedStatement对象,传入需要主键回显参数Statement.RETURN_GENERATED_KEYSPreparedStatement preparedStatement = connection.prepareStatement("insert into t_emp values  (?,?)",Statement.RETURN_GENERATED_KEYS);//获取生成的主键列值,返回的是resultSet,在结果集中获取主键列值ResultSet resultSet = preparedStatement.getGeneratedKeys();if (resultSet.next()){//获取主键列值int empId = resultSet.getInt(1);employee.setEmpId(empId);}

批量操作

1、必须在连接数据库的URL后面追加?rewriteBatchedStatements=true,允许批量操作
2、新增SQL必须用values。且语句最后不要追加;结束
3、调用addBatch()方法,将SQL语句进行批量添加操作
4、统一执行批量操作,调用executeBatch()

//1.追加?rewriteBatchedStatements=true
Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu?rewriteBatchedStatements=true", "root", "atguigu");//2.sql语句不要;,批量处理时转换为sql语句 insert into 表名 values(值1,值2,值3),values(值21,值22,值23)...
String sql = "insert into 表名 values (?,?,?)";for(int i = 0;i<10000;i++){//为占位符赋值preparedStatement.setString(1, "值1");preparedStatement.setDouble(2, "值2");preparedStatement.setInt(3, "值3");//3.调用addBatch()方法,将SQL语句进行批量添加操作,转为批量添加值的SQL语句preparedStatement.addBatch();
}//4.执行批量操作
preparedStatement.executeBatch();

连接池

现有问题

  • 每次操作数据库都要获取新连接,使用完毕后就close释放,频繁的创建和销毁造成资源浪费。
  • 连接的数量无法把控,对服务器来说压力巨大。

连接池

  • 连接池就是数据库连接对象的缓冲区,通过配置,由连接池负责创建连接、管理连接、释放连接等操作。
  • 预先创建数据库连接放入连接池,用户在请求时,通过池直接获取连接,使用完毕后,将连接放回池中,避免了频繁的创建和销毁,同时解决了创建的效率。
  • 当池中无连接可用,且未达到上限时,连接池会新建连接。
  • 池中连接达到上限,用户请求会等待,可以设置超时时间。
  • 例子:排队买票时,我们不可能给每位顾客提供一个售票窗口(连接池),当顾客人数小于售票窗口时,顾客可以在空余售票窗口买票,当顾客人数大于售票窗口时,只能进行排队买票,当人员过多,排队时间过长时,售票窗口的售票人员告诉你,还需要排队XX时间,你如果有其余的事情要做,可以先完成其余事情
    • 售票窗口 = 连接池
    • 买票 = 连接
    • 购票完毕 = 释放连接
    • 顾客人数小于售票窗口 = 池中连接未达到上限
    • 顾客人数大于售票窗口 = 池中连接达到上限
    • 顾客排队 = 请求等待
    • 顾客排队时间 = 超时时间

常见连接池

JDBC 的数据库连接池使用 javax.sql.DataSource接口进行规范,所有的第三方连接池都实现此接口,自行添加具体实现!也就是说,所有连接池获取连接的和回收连接方法都一样,不同的只有性能和扩展功能!

  • DBCP 是Apache提供的数据库连接池,速度相对C3P0较快,但自身存在一些BUG。
  • C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以。
  • Proxool 是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能, 稳定性较c3p0差一点
  • Druid 是阿里提供的数据库连接池,是集DBCP 、C3P0 、Proxool 优点于一身的数据库连接池,性能、扩展性、易用性都更好,功能丰富(相当于精修房(扩展功能多),国内使用率较高)
  • Hikari(ひかり[shi ga li]) 取自日语,是光的意思,是SpringBoot2.x之后内置的一款连接池,基于 BoneCP (已经放弃维护,推荐该连接池)做了不少的改进和优化,口号是快速、简单、可靠。(相当于毛坯房(扩展功能少),追求极致速度)
  • 如果想要扩展性推荐使用Druid
  • 如果只是追求极致的效率使用Hikari

Druid连接池使用

硬编码方式(了解):将连接池的配置信息和Java代码耦合在一起。

        1、创建DruidDataSource连接池对象。2、设置连接池的配置信息【必须 | 非必须】3、通过连接池获取连接对象4、回收连接【不是释放连接,而是将连接归还给连接池,给其他线程进行复用】
		//1.创建DruidDataSource连接池对象。DruidDataSource druidDataSource = new DruidDataSource();//2.设置连接池的配置信息【必须 | 非必须】//2.1 必须设置的配置druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");druidDataSource.setUrl("jdbc:mysql:///数据库");druidDataSource.setUsername("root");druidDataSource.setPassword("密码");//2.2 非必须设置的配置druidDataSource.setInitialSize(10);//初始化10个连接,超过8个必须设置setMaxActivedruidDataSource.setMaxActive(20);//最大连接20个,默认8个//3.通过连接池获取连接对象Connection connection = druidDataSource.getConnection();//基于connection进行CRUD//4.回收连接connection.close();

软编码方式(推荐)

在项目目录下创建resources文件夹,标识该文件夹为资源目录,创建db.properties配置文件,将连接信息定义在该文件中

# druid连接池需要的配置参数,key固定命名
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql:///数据库
username=root
password=密码
initialSize=10
maxActive=20

Java代码

		//1.创建Properties集合,用于存储外部配置文件的key和value值。Properties properties = new Properties();//2.读取外部配置文件,获取输入流,加载到Properties集合里。InputStream inputStream = DruidTest.class.getClassLoader().getResourceAsStream("db.properties");properties.load(inputStream);//3.基于Properties集合构建DruidDataSource连接池DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);//4.通过连接池获取连接对象Connection connection = dataSource.getConnection();//5.开发CRUD//6.回收连接connection.close();

HikariCP连接池使用

硬编码方式

1、创建HikariDataSource连接池对象
2、设置连接池的配置信息【必须 | 非必须】
3、通过连接池获取连接对象
4、回收连接

	//1.创建HikariDataSource连接池对象HikariDataSource hikariDataSource = new HikariDataSource();//2.设置连接池的配置信息【必须 | 非必须】//2.1必须设置的配置hikariDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");hikariDataSource.setJdbcUrl("jdbc:mysql:///数据库");hikariDataSource.setUsername("root");hikariDataSource.setPassword("密码");//2.2 非必须设置的配置hikariDataSource.setMinimumIdle(10);//最小连接数量hikariDataSource.setMaximumPoolSize(20);//最大连接数量//3.通过连接池获取连接对象Connection connection = hikariDataSource.getConnection();//4.回收连接connection.close();

软编码方式

在项目下创建resources/hikari.properties配置文件

driverClassName=com.mysql.cj.jdbc.Driver
jdbcUrl=jdbc:mysql:///数据库
username=root
password=密码
minimumIdle=10
maximumPoolSize=20

Java代码

//1.创建Properties集合,用于存储外部配置文件的key和value值。Properties properties = new Properties();//2.读取外部配置文件,获取输入流,加载到Properties集合里。InputStream inputStream = HikariTest.class.getClassLoader().getResourceAsStream("db.properties");properties.load(inputStream);// 3.创建Hikari连接池配置对象,将Properties集合传进去HikariConfig hikariConfig = new HikariConfig(properties);// 4. 基于Hikari配置对象,构建连接池HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);// 5. 获取连接Connection connection = hikariDataSource.getConnection();System.out.println("connection = " + connection);//6.回收连接connection.close();

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

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

相关文章

YoloV8改进策略:Neck改进改进|ELA(独家原创与复现)

摘要 本文使用2024年最新的ELA注意力机制改进YoloV8的Neck层,实现涨点!改进方式简单易用,涨点明显!欢迎大家使用。 大家在订阅专栏后,记着加QQ群啊!有些改进方法确实有难度,大家在改进的过程中遇到问题,我会解答和指导! 论文:《ELA:深度卷积神经网络的高效局部注意…

SpringBoot + Dobbo + nacos

SpringBoot Dobbo nacos 一、nacos https://nacos.io/zh-cn/docs/quick-start.html 1、下载安装包 https://github.com/alibaba/nacos/releases/下载后在主目录下&#xff0c;创建一个logs的文件夹&#xff1a;用来存日志 2、启动nacos 在bin目录下打开cmd运行启动命令&a…

2024年DeFi的四大主导趋势:Restaking、Layer3、AI和DePin

DeFi&#xff08;去中心化金融&#xff09;行业在2024年将继续呈现快速增长的势头&#xff0c;驱动这一增长的主要因素将是四大主导趋势&#xff1a;Restaking、Layer3、AI和DePin。这些趋势将推动DeFi生态系统的发展&#xff0c;为用户提供更多的机会和创新。 趋势1&#xff…

ERA拓展之旅:2024香港Web3峰会聚焦全球Web3发展

2024年香港Web3大型峰会是一次令人难忘的体验。这次峰会吸引了来自世界各地的Web3爱好者和从业者齐聚一堂&#xff0c;共同探讨着Web3的未来发展方向与机遇。在这个热情洋溢的氛围中&#xff0c;展现了对Web3的热情&#xff0c;分享彼此的见解和理念&#xff0c;探讨了未来的行…

【1】c++多线程技术之线程基础概念

1、进程与线程的区别 进程和线程是现代操作系统中并发执行程序的两种实体&#xff0c;它们之间存在一些本质的区别。具体分析如下&#xff1a; 进程&#xff1a;进程是操作系统资源分配的基本单位&#xff0c;每个进程都有自己独立的地址空间&#xff0c;包括代码、数据和堆栈…

性能优化-01

当看到性能指标时&#xff0c;你会首先想到什么呢&#xff1f;我相信 “高并发” 和 “响应快” 一定是最先出现在你脑海里的两个词&#xff0c;而它们也正对应着性能优化的两个核心指标—— “吞吐” 和 “延时” 。这两个指标是从应用负载的视角来考察性能&#xff0c;直接影…

Chatgpt掘金之旅—有爱AI商业实战篇|SEO 咨询业务|(十七)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业在SEO 咨询业务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随…

python基础语法+爬虫+图像处理+NumpyPandas数据处理(12天速成,第6天中-列表生成式)

1、列表生成式1 非常方便的得到一个列表 [元素 for遍历 if筛选]l1 [x for x in range(1,21)] # range(1,21) 生成[1&#xff0c;21)包左不包右的列表 print(l1)l2 [x*x for x in range(1,21)] print(l2)l3 [x for x in range(1,21) if x%2 0] print(l3)# 得到20个&#xf…

RTOS Lab report:Task-List Management in the RTOS Kernel

Task-List Management in the RTOS Kernel Ⅰ Introduction Much of the administration in a real‐time kernel consists of list management. In this initial step, we create three different lists and operate them as follows: • Create functions that can input a…

springboot+vue高校贫困生资助勤工俭学管理系统python

本次开发一套贫困生资助管理系统有管理员和用户两个角色。管理员功能有个人中心&#xff0c;学生管理&#xff0c;院校管理&#xff0c;贫困申请管理&#xff0c;资助项目管理&#xff0c;资助申请管理&#xff0c;资助发放管理&#xff0c;勤工俭学管理&#xff0c;岗位申请管…

大语言模型LLM《提示词工程指南》学习笔记04

文章目录 大语言模型LLM《提示词工程指南》学习笔记04数据生成生成代码完成函数&#xff0c;继续下一行生成其他有用的代码&#xff0c;例如创建和测试MySQL查询代码解释 提示函数 大语言模型LLM《提示词工程指南》学习笔记04 数据生成 LLMs具有生成连贯文本的强大能力。使用…

CMake构建OpenCv并导入QT项目过程中出现的问题汇总

前言 再此之前请确保你的环境变量是否配置&#xff0c;这是总共需要配置的环境变量 E:\cmake\bin E:\OpenCv\opencv\build\x64\vc15\bin F:\Qt\Tools\mingw730_64\bin F:\Qt\5.12.4\mingw73_64\bin 问题一&#xff1a; CMake Error: CMake was unable to find a build program…

Linux网络 基础概念

目录 背景知识 互联网的发展 局域网和广域网 网络拓扑 网络协议栈 协议的概念 网络协议的分层 网络与操作系统的联系 网络传输的基本流程 IP地址和MAC地址 以太网通信 数据包的封装和分用 跨网段传输 背景知识 互联网的发展 计算机网络是计算机技术和通信技术相…

MyBatis 执行流程

加载配置文件:MvBatis 的执行流程从加载配置文件开始。通常&#xff0c;MyBatis 的配置文件是一个 XML 文件&#xff0c;其中包含了数据源配置、SQL 映射配置、连接池配置等信息。构建 SqlSessionFactory:在配置文件加载后&#xff0c;MyBatis 使用配置信息来构建 SqlSessionFa…

【Android Studio报错】:* What went wrong:Out of memory. Java heap space

项目场景&#xff1a; 今天&#xff0c;刚打开自己的安卓项目发现报错&#xff1a; 报错&#xff1a; * What went wrong: Out of memory. Java heap space Possible solution: - Check the JVM memory arguments defined for the gradle process in: gradle.properties in…

路由器端口映射是什么意思?

路由器端口映射是一种网络配置技术&#xff0c;在私有网络中允许外部网络访问特定的服务或应用程序。通过将路由器的端口映射到内部客户端设备&#xff0c;可以实现从公共网络访问内部网络资源的目的。 天联组网介绍 天联是一款异地组网内网穿透产品&#xff0c;由北京金万维科…

网工基础协议——IP地址

IP地址的概念&#xff1a; IP 地址是我们进行TCP/IP通讯的基础&#xff0c;每个连接到网络上的计算机都必须有一个!P地址。我们目前使用的IP地址是32位的&#xff0c;通常以点分十进制表示。例如:192.168.0.181。IP地址的格式为: IP地址 网络地址 主机地址 或者 |P地址主机地…

windows ffmpeg7 通过rtsp拉取h265裸流

点击下边那个链接会转到github 下载完成后&#xff0c;添加include、lib到工程。 添加头文件&#xff1a; extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavformat/avio.h" #inclu…

【opencv】示例-detect_blob.cpp

// 导入所需的OpenCV头文件 #include <opencv2/core.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/features2d.hpp> // 导入向量和映射容器 #include <vector> #include <map> // 导入输入输出…

微软卡内基梅隆大学:无外部干预,GPT4等大语言模型难以自主探索

目录 引言&#xff1a;LLMs在强化学习中的探索能力探究 研究背景&#xff1a;LLMs的在情境中学习能力及其重要性 实验设计&#xff1a;多臂老虎机环境中的LLMs探索行为 实验结果概览&#xff1a;LLMs在探索任务中的普遍失败 成功案例分析&#xff1a;Gpt-4在特定配置下的探…