java 多张表事务处理_Java中的多表&事务&DCL&一个多表操作例子

准备sql:

创建部门表

CREATE TABLE dept(

id INT PRIMARY KEY AUTO_INCREMENT,

NAME VARCHAR(20)

);

INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');

# 创建员工表

CREATE TABLE emp (

id INT PRIMARY KEY AUTO_INCREMENT,

NAME VARCHAR(10),

gender CHAR(1), -- 性别

salary DOUBLE, -- 工资

join_date DATE, -- 入职日期

dept_id INT,

FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键)

);

INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);

INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);

INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);

INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);

INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);

连接:

交叉连接:

交叉连接得出的结果就是所有表中数据的所有组合关系,表一x表二. 叫做笛卡尔积.

一般情况下, 一旦我们发现结果集中包含笛卡尔积的情况, 都是因为条件不够完整导致的.

-- 简化前

SELECT * FROM emp CROSS JION dept;

-- 简化后

SELECT * FROM emp,dept;

62ad74377ebc348997ef2430702d4e19.png

内连接查询(不写关键字,where条件AND条件):

有两个集合A,B .取这两个集合的所有组成情况。要完成多表查询,两个表的积会出现无用数据,我们要消除无用的数据所以我们应使用内连接和外连接。

隐式内连接:

使用where条件消除无用数据

-- 查询所有员工信息和对应的部门信息

SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;

bccd2beb07fb30b212e12a3929b4708d.png

-- 查询员工表的名称,性别。部门表的名称

SELECT

t1.name, -- 员工表的姓名

t1.gender,-- 员工表的性别

t2.name -- 部门表的名称

FROM

emp t1,

dept t2

WHERE

t1.`dept_id` = t2.`id`;

596e4b578f7a92f6997a81c271eccc62.png

显式内连接(写关键字inner join 表 on 条件):

语法: select 字段列表 from 表名1 [inner] join 表名2 on 条件(写不写inner都行)

SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;

SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;

fa81c4ea0b538c09d31dd01d584ffc31.png

内连接查询:

先写From字句,明确从那些表查询

如果这些表中包含主外键关系,先把主外键关系的条件

如果还有其他额外的额外条件,添加

最后在补充select字句的内容。

外链接查询:

左外和右外可以互相转化,一般写左外。<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java导入Excel表到数据库多张表的示例代码: ```java import java.io.File; import java.io.FileInputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Iterator; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelImporter { public static void main(String[] args) { String excelFilePath = "path/to/excel/file.xlsx"; try { FileInputStream inputStream = new FileInputStream(new File(excelFilePath)); Workbook workbook = new XSSFWorkbook(inputStream); Iterator<Sheet> sheetIterator = workbook.iterator(); while (sheetIterator.hasNext()) { Sheet sheet = sheetIterator.next(); String tableName = sheet.getSheetName(); Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Iterator<Cell> cellIterator = row.cellIterator(); // 获取数据库连接 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/database", "username", "password"); // 构建插入语句 StringBuilder sql = new StringBuilder(); sql.append("INSERT INTO ").append(tableName).append(" VALUES ("); for (int i = 0; i < row.getLastCellNum(); i++) { sql.append("?,"); } sql.deleteCharAt(sql.length() - 1); sql.append(")"); // 创建预编译语句 PreparedStatement statement = connection.prepareStatement(sql.toString()); int cellIndex = 0; while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); statement.setString(cellIndex + 1, cell.getStringCellValue()); cellIndex++; } // 执行插入语句 statement.executeUpdate(); // 关闭连接和语句 statement.close(); connection.close(); } } workbook.close(); inputStream.close(); System.out.println("Excel导入到数据库成功!"); } catch (Exception e) { e.printStackTrace(); } } } ``` 请注意,上述代码的数据库连接信息需要根据实际情况进行修改。此外,还需要添加Apache POI和MySQL驱动的依赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值