Java学习-JDBC(三)

JDBC扩展

实体类和ORM
  • 在使用JDBC操作数据库时,会发现数据是零散的,明明在数据库中是一行完整的数据,到了Java中变成一个个变量,不利于维护和管理,Java是面向对象的,一个表对应一个类,一行数据就对应Java中的一个对象,每个列对应对象的属性,所以要将数据以实体类的方式存储
  • ORM(Object Relational Mapping)对象到关系数据库的映射,把面向对象的概念跟数据库中表的概念对应起来,以面向对象的角度操作数据库数据,即一张表对应一个类,一行数据对应一个对象,一个列对应一个属性
//javabean类
package com.lotus.advance.pojo;
public class Employee {private Integer empId;private String empName;private Double empSalary;private Integer empAge;public Employee(Integer empId, String empName, Double empSalary, Integer empAge) {this.empId = empId;this.empName = empName;this.empSalary = empSalary;this.empAge = empAge;}public Employee() {}public Integer getEmpId() {return empId;}public void setEmpId(Integer empId) {this.empId = empId;}public String getEmpName() {return empName;}public void setEmpName(String empName) {this.empName = empName;}public Double getEmpSalary() {return empSalary;}public void setEmpSalary(Double empSalary) {this.empSalary = empSalary;}public Integer getEmpAge() {return empAge;}public void setEmpAge(Integer empAge) {this.empAge = empAge;}@Overridepublic String toString() {return "Employee{" +"empId=" + empId +", empName='" + empName + '\'' +", empSalary=" + empSalary +", empAge=" + empAge +'}';}
}
//单元测试类,用于测试ORM
package com.lotus.advance;import com.lotus.advance.pojo.Employee;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.sql.*;
import java.util.ArrayList;
import java.util.List;public class JDBCAdvanced {private Connection conn;private PreparedStatement statement;private ResultSet rs;//测试前与数据库建立连接@Beforepublic void init() throws SQLException {String url = "jdbc:mysql://192.168.29.201:3306/jdbc";String username = "root";String password = "123456";conn = DriverManager.getConnection(url, username, password);}/*** 获取单行多列数据* @throws SQLException*/@Testpublic void testORM() throws SQLException {String statement_sql = "select * from jdbc.t_emp where emp_id=?";statement = conn.prepareStatement(statement_sql);statement.setInt(1,2);rs = statement.executeQuery();//处理结果,如确认只有一行数据,需要做一次rs.next()的判断,才能拿到列的结果Employee employee = null;while (rs.next()) {employee = new Employee();int emp_id = rs.getInt("emp_id");String emp_name = rs.getString("emp_name");double emp_salary = rs.getDouble("emp_salary");int emp_age = rs.getInt("emp_age");employee.setEmpAge(emp_age);employee.setEmpName(emp_name);employee.setEmpId(emp_id);employee.setEmpSalary(emp_salary);System.out.println(employee);}}/*** ORM封装多个对象* @throws SQLException*/@Testpublic void testORMList() throws SQLException {String statement_sql = "select * from jdbc.t_emp where emp_age>?";statement = conn.prepareStatement(statement_sql);statement.setInt(1,20);rs = statement.executeQuery();//处理结果,如确认只有一行数据,需要做一次rs.next()的判断,才能拿到列的结果List<Employee> list = new ArrayList<>();Employee employee = null;while (rs.next()) {employee = new Employee();int emp_id = rs.getInt("emp_id");String emp_name = rs.getString("emp_name");double emp_salary = rs.getDouble("emp_salary");int emp_age = rs.getInt("emp_age");employee.setEmpAge(emp_age);employee.setEmpName(emp_name);employee.setEmpId(emp_id);employee.setEmpSalary(emp_salary);list.add(employee);   //将找到的数据存入集合中}for (Employee emp : list) {System.out.println(emp);}}//测试后关闭与数据库的连接,防止内存泄漏@Afterpublic void destory() throws SQLException {//6.释放资源if (rs != null) {rs.close();}if (statement != null) {statement.close();}if (conn != null) {conn.close();}}
}
主键回显
  • 在数据库中,执行新增操作时,主键设置为自动增长,可以在表中直观的看到,但是在Java程序中,执行完新增后,只能得到受影响行数,无法得知当前新增数据的主键值,在Java程序中获取数据中插入新数据后的主键值,并赋值给Java对象,此操作为主键回显。
//连接和释放见上面代码的init和destory@Testpublic void testReturnPK() throws SQLException {//预编译SQL语句String sql = "insert into t_emp(emp_name,emp_salary,emp_age) values (?,?,?)";//Statement.RETURN_GENERATED_KEYS--返回新增数据主键列的值PreparedStatement preparedStatement = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);Employee jack = new Employee(null, "jack", 123.45, 34);preparedStatement.setString(1,jack.getEmpName());preparedStatement.setDouble(2,jack.getEmpSalary());preparedStatement.setInt(3,jack.getEmpAge());//执行SQL,获取返回结果int result = preparedStatement.executeUpdate();if (result > 0) {System.out.println("Success");//获取当前新增数据的主键列,回显到Java中Employee对象的empId属性上//返回主键值为单行单列结果,存放在ResultSet中ResultSet keys = null;try {keys = preparedStatement.getGeneratedKeys();if (keys.next()) {int empId = keys.getInt(1);jack.setEmpId(empId);}System.out.println(jack);} finally {if (keys != null) {keys.close();}}} else{System.out.println("Failure");}}
批量操作
  • 插入多条数据时,一条一条发送数据库执行,效率低下
  • 通过批量操作,可提升操作效率
public void testMoreInsert() throws SQLException {///*** 1.rewriteBatchedStatements允许批量操作* 2.sql语句中使用values,最后不能加;* 3.调用addBatch(),将SQL语句进行批量添加操作* 4.统一执行批量操作,调用executeBatch()*/String url = "jdbc:mysql://192.168.29.201:3306/jdbc?rewriteBatchedStatements=true";String username = "root";String password = "Lotus!1120";conn = DriverManager.getConnection(url, username, password);//编写SQL语句String sql = "insert into t_emp(emp_name,emp_salary,emp_age) values (?,?,?)";PreparedStatement preparedStatement = conn.prepareStatement(sql);//获取当前代码执行开始时间long start = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {//为占位符赋值preparedStatement.setString(1,"marry" + i);preparedStatement.setDouble(2,100.0 + i);preparedStatement.setInt(3,20 + i);//preparedStatement.executeUpdate();preparedStatement.addBatch();}preparedStatement.executeBatch();long end = System.currentTimeMillis();System.out.println("Time:" + (end - start));}

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

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

相关文章

激活乡村振兴新动能:推动农村产业融合发展,打造具有地方特色的美丽乡村,实现乡村全面振兴

目录 一、推动农村产业融合发展 1、农业产业链条的延伸 2、农业与旅游业的结合 二、挖掘地方特色&#xff0c;打造美丽乡村 1、保护和传承乡村文化 2、发展特色农业 三、加强基础设施建设&#xff0c;提升乡村品质 1、改善农村交通条件 2、提升农村水利设施 四、促进…

使用【AbortController】终止请求

AbortController 是一个 Web API&#xff0c;用于终止一个或多个 Web 请求。当你使用 fetch API 发送异步请求时&#xff0c;你可能需要在某些情况下主动终止这些请求。使用 AbortController 可以实现这一功能。 基本用法&#xff1a; 创建一个 AbortController 实例: const co…

JavaEE——声明式事务管理案例:实现用户登录

一、案例要求 本案例要求在控制台输入用户名密码&#xff0c;如果用户账号密码正确则显示用户所属班级&#xff0c;如果登录失败则显示登录失败。实现用户登录项目运行成功后控制台效果如下所示。 欢迎来到学生管理系统 请输入用户名&#xff1a; zhangsan 请输入zhangsan的密…

吴恩达2022机器学习专项课程C2W2:2.23 选修_反向传播算法的工作原理(什么是导数图计算大型神经网络)

目录 引言一.导数的计算1.epsilon与导数的关系2.其它导数符号形式3.导数小结 二.小型神经网络的计算图1.什么是计算图&#xff08;前向传播过程&#xff09;2.反向传播计算过程3.验证反向传播的计算结果4.为什么用反向传播计算导数&#xff1f; 三.扩大神经网络的计算图1.计算反…

笔记本充电出现了问题。

不知道为什么。电池充电图片一直显示的空。谁能救救我&#xff01;

C51学习归纳9 --- I2C通讯学习(重点)

首先&#xff0c;我自己学习过以后的直观感觉&#xff0c;通信协议是单片机的灵魂之一&#xff0c;只有规定好了通信协议我们才能够正确的接收到信息&#xff0c;才能实现更加深入的研究。所以这一部分是需要好好学习的。 本节借助一个可存储的芯片AT24C02&#xff0c;进行在I2…

docker国内被墙,有什么可以平替的公有云仓库?

目前有两个&#xff1a; 1、一个是红帽 quay.io 2、一个是Github的仓库 ghcr.io 红帽的不是那么全&#xff0c; Github的比较全&#xff0c;基本满足日常使用。

C语言怎样初始化图形模式?

一、问题 在C语⾔中&#xff0c;initgraph( ) 函数⽤于初始化图形模式。初始化时&#xff0c;那么多参数都是⼲什么的&#xff1f;怎样设置&#xff1f; 二、解答 initgraph( ) 函数⽤于初始化图形模式&#xff0c;其语法格式如下。 void far initgraph(int far * gdriver, i…

ACM算法学习路线、清单

入门 模拟、暴力、贪心、高精度、排序 图论 搜索 BFS、DFS、IDDFS、IDA*、A*、双向BFS、记忆化 最短路 SPFA、bellman-fort(队列优化)、Dijkstra(堆优化)、Johnson、Floyd、差分约束、第k短路 树 树的重心和直径、dfs序、树链刨分与动态树、LCA、Prufer编码及Cayley定理…

对象存储OSS 客户端签名直传的安全风险和解决方法

1. 前言 阿里云对象存储OSS&#xff08;Object Storage Service&#xff09;是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;可提供99.9999999999%&#xff08;12个9&#xff09;的数据持久性&#xff0c;99.995%的数据可用性。多种存储类型供选择&#xff0c;全面…

mysql批量修改列备注

--把表名&#xff0c;字段名&#xff0c;备注导入到这个表里&#xff0c;表明和字段名一定要一致&#xff01;&#xff01;&#xff01; CREATE TABLE supplement_clumn_comment ( table varchar(200) DEFAULT NULL COMMENT 表名, columns varchar(200) DEFAULT NULL COMME…

11.链表

数组的分类&#xff1a;便于遍历 静态数组&#xff1a;int arr[10]数据过多造成空间溢出&#xff0c;数据过小空间浪费 动态数组&#xff1a;malloc calloc realloc 合理利用空间不能快捷的插入或删除数据&#xff08;会涉及到大量的数据移动&#xff09; 知识点一&#xff1…

玉米粒计数检测数据集VOC+YOLO格式107张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;107 标注数量(xml文件个数)&#xff1a;107 标注数量(txt文件个数)&#xff1a;107 标注类别…

如何快速入门Element-UI:打造高效美观的前端界面

Element-UI 是一款基于 Vue.js 的开源组件库,提供了丰富的 UI 组件,可以帮助开发者快速构建美观、响应式的前端界面。本文将详细介绍如何快速入门 Element-UI,包括环境搭建、组件使用、样式定制及常见问题解决方法,帮助你高效地使用 Element-UI 进行前端开发。 一、环境搭…

Spring (48)Feign

Feign是一个声明式的Web服务客户端&#xff0c;它让编写Web服务客户端变得更加容易。它的目标是通过简化HTTP API客户端的编码工作来减少开发人员的负担。使用Feign可以创建一个接口&#xff0c;并在接口上声明方法与远程服务上的一个HTTP资源相绑定。Spring Cloud整合了Feign&…

ABC351

C 栈的应用 #include<bits/stdc.h>using namespace std;stack<int>stk;int main() {int n;cin>>n;for(int i1;i<n;i){int a;cin>>a;while(!stk.empty()&&astk.top()){stk.pop();a;}stk.push(a);}cout<<stk.size()<<endl;retur…

java面试题: HashMap、HashSet 和 HashTable 的区别

HashMap 常用方法 HashMap 是一个基于哈希表的 Map 接口的实现。它允许使用 null 值和 null 键。 java 复制 // 创建一个HashMap HashMap<KeyType, ValueType> map new HashMap<>(); // 添加元素 map.put(key, value); // 获取元素 ValueType value map.get…

二分#背包#快排#LCS详解

二分#背包#快排#LCS详解 文章目录 二分#背包#快排#LCS详解1. 二分搜索2. 01背包问题3. 快速排序4. 最长公共子序列 1. 二分搜索 在处理大规模数据集时&#xff0c;查找操作的效率显得尤为重要。二分搜索是一种在有序数组中查找目标值的高效算法&#xff0c;其时间复杂度为O(lo…

集群与分片:深入理解及应用实践

目录 引言什么是集群&#xff1f; 集群的定义集群的类型 什么是分片&#xff1f; 分片的定义分片的类型 集群与分片的关系集群的应用场景 负载均衡高可用性 分片的应用场景 大数据处理数据库分片 集群与分片的架构设计 系统架构设计数据存储设计 案例分析 Hadoop 集群Elastics…

【python报错】关于 xlrd.biffh.XLRDError: Excel xlsx file; not supported 解决方法【已解决】

【Python报错】关于xlrd.biffh.XLRDError: Excel xlsx file; not supported解决方法【已解决】 在使用Python进行数据分析时&#xff0c;经常需要处理Excel文件。xlrd库是一个流行的用于读取Excel文件的库&#xff0c;但如果你在使用xlrd打开.xlsx文件时遇到了xlrd.biffh.XLRDE…