【jdbc】mysql批量增删改查
前言
本博文主要是对mysql批量增删改查实现的一个介绍,以及记录,方便后续使用时候可以直接加载。
mysql 和jdbc 介绍
MySQL是一种流行的关系型数据库管理系统(RDBMS),它是开源的,被广泛应用于Web开发、应用程序开发和数据分析等领域。MySQL具有高性能、可靠性和可扩展性,并提供了强大的数据库管理和查询功能。
JDBC(Java Database Connectivity)是Java语言访问关系型数据库的标准接口。它提供了一组用于连接数据库、执行SQL语句和处理结果集的API,使Java开发人员能够方便地与各种数据库进行交互。
使用JDBC连接MySQL需要以下几个步骤:
- 加载JDBC驱动程序:使用Class.forName()方法加载MySQL JDBC驱动。
- 建立连接:使用DriverManager.getConnection()方法建立与数据库的连接。
- 创建Statement对象:通过Connection对象的createStatement()方法创建Statement对象,用于执行SQL语句。
- 执行SQL语句:使用Statement对象的executeQuery()方法执行查询语句,使用executeUpdate()方法执行更新语句。
- 处理结果集:对于查询语句,使用ResultSet对象来处理查询结果。
JDBC提供了一种灵活、可扩展的方式与MySQL数据库进行交互,使开发人员能够更好地管理和操作数据库。同时,JDBC还支持事务处理、批量操作和元数据查询等功能,为开发数据库应用程序提供了强大的工具和功能。
实现
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
private String url = "jdbc:mysql://localhost:3306/sht?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC";
private String username ="root";
private String password = "";
private void getData() {
Connection conn = null;
Statement stmt = null;
try{
// 注册 JDBC 驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 打开链接
conn = DriverManager.getConnection(url,username,password);
// 执行查询
stmt = conn.createStatement();
String sql;
sql = "SELECT `cur_yield` FROM `iom_move` WHERE `machine_id` = '"+machineId+"'";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while(rs.next()){
// 通过字段检索
curYield= Integer.parseInt(rs.getString("cur_yield"));
}
String sql1 = "SELECT `regular_time` FROM `nu_order` WHERE `machine_id` = '"+machineId+"'";
rs = stmt.executeQuery(sql1);
// 展开结果集数据库
while(rs.next()){
// 通过字段检索
curRegular= Integer.parseInt(rs.getString("regular_time"));
}
// 完成后关闭
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
// 处理 JDBC 错误
se.printStackTrace();
}catch(Exception e){
// 处理 Class.forName 错误
e.printStackTrace();
}finally{
// 关闭资源
try{
if(stmt!=null) stmt.close();
}catch(SQLException se2){
}// 什么都不做
try{
if(conn!=null) conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
}
private void updateData() {
Random df =new Random();
//范围0到2,两边包括
int number =df.nextInt(3);
String speedTemp=speed;
if (number!=2){
//不是运行
speedTemp="0";
}else {
//运行
curYield++;
curRegular +=15;
}
if (curYield>yieldMax){
curYield=1;
}
try {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// Class.forName("com.mysql.jdbc.Driver");
//建立连接
Connection con = DriverManager.getConnection(url,username,password);
con.setAutoCommit(false);
//关闭自动提交
Statement stmt =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
//更新状态和时间
String a="UPDATE `iom_state` SET `machine_state` = "+status[number]+",`update_time` = '"+DateUtil.todayTime()+"' WHERE `machine_id` ="+machineId;
//速度+产量
String b="UPDATE `iom_move` SET `cur_speed` = '"+speedTemp+"',`cur_yield` = '"+curYield+"' WHERE `machine_id` ="+machineId;
stmt.addBatch(a);
stmt.addBatch(b);
if (number ==2){
//效率
String c="UPDATE `nu_order` SET `regular_time` = '"+curRegular+"'WHERE `machine_id` ="+machineId;
stmt.addBatch(c);
}
stmt.executeBatch();
con.commit();
//关闭连接
con.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
额外补充
需求实现部分就先到这!接下来,是一些个人平时整理的c++要点概要,如有需要可以进行阅读!
结构体
- 第一种是最基本的结构体定义, 其定义了一个结构体 A。
struct A { int a;};
- 第二种则是在定义了一个结构体 B 的同时定义了一个结构体 B 的变量 m。
struct B { int b;}m;
- 第三种结构体定义没有给出该结构体的名称, 但是定义了一个该结构体的变量 n, 也就是说,若是想要在别处定义该结构体的变量是不行的, 只有变量 n 这种在定义结构体的同时定义变量才行。
struct { int c;}n;
- 第四种结构体定义在第一种结构定义的基础上加了关键字
typedef
, 此时我们将struct D{int d}
看成是一个数据类型, 但是因为并没有给出别名, 直接用 D 定义变量是不行的。 如D test;
,不能直接这样定义变量 test。 但struct D test;
可行。
typedef struct D { int d;};
- 第五种结构体定义在第四种结构体定义的基础上加上了别名 x, 此时像在第四种结构体定义中说得那样, 此时的结构体 E 有别名 x, 故可以用 x 定义 E 的结构体变量。 用 E 不能直接定义, 需要在前面加
struct,
如struct E test;
。
typedef struct E { int e;}x;
- 第六种结构体定义在第五种的基础上减去了结构体名, 但是若是直接使用 y 来定义该结构体类型的变量也是可以的。 如
y test;
。 (常用)
typedef struct { int f;}y;
使用内联函数的时候要注意:
函数重载
- C++函数重载的判断依据
- 函数形参的个数;
- 函数形参的类型;
- 形参的顺序;
- 不能把返回值作为函数重载的条件, 原因是编译器在编译时不会去判断函数的返回类型,函数只有调用后, 编译器才会去验证返回类型, 所以返回值不能作为函数重载的依据;
- 常函数 const 可以作为函数重载判断依据, 原因: 重载[]运算符时, 有没有 const 的区别是: 有 const 只读, 没有 const 读写都可以。
- 注意事项:
- 形参的个数或类型至少要有一项是不同的;
- 编译器不以返回值来区分函数。
虚函数和纯虚函数
纯虚函数是指在 C++中, 函数可以用“virtual”和“= 0”关键字来声明。 该函数是一个虚函数,但是在声明时, 没有定义它的函数体。 它是一个空函数, 只提供函数声明, 而不提供实际实现。 由于它编译器不能确定如何实现, 因此需要在子类中实现它。 因此, 纯虚函数也被称为抽象函数。 形如:
class <类名>
{
virtual <类型><函数名>(<参数表>)=0;
…
};
虚函数和纯虚函数的特性:
- 虚函数可以在类中声明, 也可以在类的外部声明, 编译器会自动将它们转换为虚函数;但是纯虚函数只能在类中声明, 而不能在类的外部声明。
- 虚函数可以有实现, 也可以没有实现; 而纯虚函数没有实现, 不可以有实现。
- 虚函数可以在子类中覆盖, 也可以不被覆盖; 而纯虚函数必须在子类中覆盖, 否则编译器将报错。
- 虚函数可以被多态调用, 也可以被静态调用; 而纯虚函数只可以被多态调用, 不可以被静态调用。