数据表为什么又叫透明表?

部署运行你感兴趣的模型镜像

大家如果经常进行 SAP 的报表开发,对透明表就一定不会陌生,对透明表可以进行各种标准的数据表操作,获得可一个报表开发需求时,只要找到相关的透明表,也就可以着手开发报表了。但是肯定有很多朋友对透明表这个称呼感觉到很奇怪——明明是个存储实际数据的物理表,为什么是“透明”的呢?

这就要从解释“透明”这个词开始。透明,指光线能够通过的,比如玻璃、清水等等。到了近代科学中,为了解释比较抽象的科技概念,将这个词做了一些引申,指从使用者角度来看可以忽略的事物,这些事务多数是一些逻辑概念上的通讯协议。比如,TCP/IP 协议在我们访问一个网站时就可以看成是透明的,GSM/CDMA 协议在我们使用手机时可以看成时透明的,有线电视协议在我们看电视时可以看成是透明的……这样,我们就比较容易理解透明表了。

透明表,在 ABAP 字典里指那些结构定义与在数据库中的结构完全相同的表,也就是说,对于 ABAP 中的透明表,必定在后台数据库中存在一个同名的数据库表,并且这两个表中的字段数量和名字也完全相同。由于这个特性,所有对 ABAP 字典中的透明表的数据操作都相当于直接对数据库表进行操作,这就是“透明”的含义。
不过需要注意的是,从 R/3 4.0 版以后,ABAP 字典中透明表的字段顺序可能与数据库的字段顺序不一致,但是这个不一致并不会影响用户使用 SELECT * 这种语法从数据库表读取数据,这时读出的字段顺序都会由 ABAP 运行时环境自动根据 ABAP 字典中的定义重新排列。

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

任务描述 本关任务:查询client中邮箱非空的客户信息,列出客户姓名,邮箱和电话。 相关知识 为了完成本关任务,你需要掌握: JDBC的体系结构; JDBC的核心组件; 使用步骤; JDBC的体系结构 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。 Java 具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是 Java应用程序各种不同数据库之间进行对话的方法。 JDBC可以在各种平台上使用Java,如Windows,Mac OS和各种版本的UNIX。 JDBC API支持用于数据库访问的两层和三层处理模型,但通常,JDBC体系结构由两层组成: JDBC API:这提供了应用程序到JDBC管理器连接。 JDBC驱动程序API:这支持JDBC管理器到驱动程序连接。 JDBC API使用驱动程序管理器和特定于数据库的驱动程序来提供异构数据库透明连接,如下图所示: JDBC的核心组件 JDBC的核心组件包括: DriverManager: 此类管理数据库驱动程序列。使用通信子协议将来自java应用程序的连接请求适当的数据库驱动程序匹配。 Driver:此接口处理数据库服务器的通信,我们很少会直接Driver对象进行交互。而是使用DriverManager对象来管理这种类型的对象。 Connection:该界面具有用于联系数据库的所有方法。连接对象示通信上下文,即,数据库的所有通信仅通过连接对象。 Statement:使用从此接口创建的对象将SQL语句提交到数据库。除了执行存储过程之外,一些派生接口还接受参数。 ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。它作为一个迭代器,允许我们遍历其数据。 SQLException:此类处理数据库应用程序中发生的任何错误 使用步骤 构建JDBC应用程序涉及以下六个步骤: 导入包:需要包含包含数据库编程所需的JDBC类的包。大多数情况下,使用import java.sql.*就足够了。 注册JDBC驱动程序:要求您初始化驱动程序,以便您可以打开数据库的通信通道。 打开连接:需要使用DriverManager.getConnection()方法创建一个Connection对象,该对象数据库的物理连接。 执行查询:需要使用类型为Statement的对象来构建和提交SQL语句到数据库。 从结果集中提取数据:需要使用相应的ResultSet.getXXX()方法从结果集中检索数据。 释放资源:需要明确地关闭所有数据库资源,而不依赖于JVM的垃圾收集。 建立JDBC连接所涉及的编程可简单概括为以下四个步骤 导入JDBC包:将Java语言的import语句添加到Java代码中导入所需的类。 注册JDBC驱动程序:此步骤将使JVM将所需的驱动程序实现加载到内存中,以便它可以满足您的JDBC请求。 数据库URL配置:这是为了创建一个格式正确的地址,指向要连接到的数据库。 创建连接对象:最后,调用DriverManager对象的getConnection()方法来建立实际的数据库连接。 Class.forName(); 注册驱动程序最常见的方法是使用Java的Class.forName()方法,将驱动程序的类文件动态加载到内存中,并将其自动注册。 try { Class.forName("com.mysql.cj.jdbc.Driver"); }catch(ClassNotFoundException ex) { System.out.println("Error: unable to load driver class!"); System.exit(1); } 数据库URL配置 加载驱动程序后,可以使用DriverManager.getConnection()方法建立连接。为了方便参考,特列出三个重载的DriverManager.getConnection()方法 - getConnection(String url) getConnection(String url,Properties prop) getConnection(String url,String user,String password) 以下是常用的DBMS连接方式: RDBMS JDBC驱动程序名称 网址格式 MYSQL8 com.mysql.cj.jdbc.Driver jdbc:mysql://hostname:3306/databaseName?serverTimezone=UTC MySQL com.mysql.jdbc.Driver jdbc:mysql://hostname:3306/databaseName ORACLE oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@hostname:port Number:databaseName DB2 COM.ibm.db2.jdbc.net.DB2Driver jdbc:db2:hostname:port Number / databaseName SYBASE com.sybase.jdbc.SybDriver jdbc:sybase:Tds:hostname:port Number / databaseName 注意MySQL8先前的版本所使用的驱动程序是不同的。 创建数据库连接对象 String URL = "jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC"; String USER = "username"; String PASS = "password" Connection conn = DriverManager.getConnection(URL, USER, PASS); 完整的连接地址: jdbc:mysql://127.0.0.1:3306/dbname?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=UTC" 关闭数据库连接 为确保连接关闭,您可以在代码中提供一个“finally”块。一个finally块总是执行,不管是否发生异常。 要关闭上面打开的连接,你应该调用close()方法如下: conn.close(); JDBC执行SQL语句 一旦获得了连接,我们可以数据库进行交互。JDBC Statement和PreparedStatement接口定义了能够发送SQL命令并从数据库接收数据的方法和属性。 接口 推荐使用 Statement 用于对数据库进行通用访问。在运行时使用静态SQL语句时很有用。Statement接口不能接受参数。不过你可以通过字符串运算,将参数值拼接成一条SQL语句。 PreparedStatement 当您计划多次使用SQL语句时使用。PreparedStatement接口在运行时接受输入参数。 创建Statement对象 在使用Statement对象执行SQL语句之前,需要使用Connection对象的createStatement()方法创建Statement的一个实例,如下例所示: Statement stmt = null; try { stmt = conn.createStatement( ); . . . } catch (SQLException e) { . . . } finally { . . . } 执行Statement对象 创建Statement对象后,您可以使用它来执行一个SQL语句,其中有三个执行方法之一。 boolean execute(String SQL):如果可以检索到ResultSet对象,则返回一个布尔值true; 否则返回false。使用此方法执行SQL DDL语句或需要使用真正的动态SQL时。 int executeUpdate(String SQL):返回受SQL语句执行影响的行数。使用此方法执行预期会影响多个行的SQL语句,例如INSERT,UPDATE或DELETE语句。 ResultSet executeQuery(String SQL):返回一个ResultSet对象。当您希望获得结果集时,请使用此方法,就像使用SELECT语句一样。 关闭Statement对象 就像关闭一个Connection对象以保存数据库资源一样,由于同样的原因,还应该关闭Statement对象。 调用close()方法即可关闭Statement对象。如果先关闭Connection对象,它也会关闭Statement对象。但是,应始终显式关闭Statement对象,以确保正确清理。 Statement stmt = null; try { stmt = conn.createStatement( ); . . . } catch (SQLException e) { . . . } finally { stmt.close(); } PreparedStatement PreparedStatement的接口扩展了Statement接口,其优点是可以动态地提供参数。如果语句被多次执行,其执行效率比Statement高。 PreparedStatement pstmt = null; try { String SQL = "Update Employees SET age = ? WHERE id = ?"; pstmt = conn.prepareStatement(SQL); . . . } catch (SQLException e) { . . . } finally { pstmt.close(); } JDBC中的所有参数都用?符号代替,这被称为参数标记(又叫占位符)。在执行SQL语句之前,必须为每个参数提供值。 用setXXX(参数序号,参数值)方法将值绑定到对应参数,其中XXX代要绑定到输入参数的值的Java数据类型。如果忘记提供值,将收到一个SQLException。参数的序号从1开始。 记得调用close()方法,显示关闭PreparedStatement对象。 ResultSet ResultSet对象维护指向结果集中当前行的游标。有多种类型的“游标”,如果没有指定任何ResultSet类型,则取缺省值TYPE_FORWARD_ONLY。 类型 类型描述 ResultSet.TYPE_SCROLL_INSENSITIVE 光标可以向前和向后滚动,结果集对创建结果集后发生的数据库的其他更改不敏感。 ResultSet.TYPE_SCROLL_SENSITIVE 光标可以向前和向后滚动,结果集对创建结果集之后发生的其他数据库所做的更改敏感。 ResultSet.TYPE_FORWARD_ONLY 光标只能在结果集中向前移动。 ResultSet的遍历 用ResultSet的next()方法取得游标当前行的值,并用getXXX(列名)方法获列这一行某个列的值,XXX是列匹配的数据类型,next()会推进游标到下一行,如果next()返回false示数据集已取完(或者是空集)。 示例: resultSet = statement.executeQuery("select * from student;"); while (resultSet.next()) { System.out.println(resultSet.getString("sno")); System.out.println(resultSet.getString("sname")); System.out.println(resultSet.getInt("sage")); } 编程要求 正确使用JDBC,查询金融应用场景数据库finance的client(客户)中邮箱不为空的客户信息,列出客户姓名,邮箱和电话.一个展示结果的示例如下(字体颜色是平台自动加的,不是编程要求): 姓名 邮箱 电话 夏雅惠 57433144004@qq.com 18962433158 钟庭玮 59434199077@163.com 18110434192 注:标题以及字段值之间用制符隔开。第1列和第2列间用一个制符,第2列和第3列间,标题用4个制符,字段值用两个制符隔开。 JDBC驱动程序(mysql-connector-java-8.0.23.jar)由平台提供,直接使用即可,不用特别设置。 请在右侧代码文件编辑器适当的位置补充代码,实现上述编程要求。 附client的结构: 1 client(客户) 字段名称 数据类型 约束 说明 c_id INTEGER PRIMARY KEY 客户编号 c_name VARCHAR(100) NOT NULL 客户名称 c_mail CHAR(30) UNIQUE 客户邮箱 c_id_card CHAR(20) UNIQUE NOT NULL 客户身份证 c_phone CHAR(20) UNIQUE NOT NULL 客户手机号 c_password CHAR(20) NOT NULL 客户登录密码 测试说明 平台首先编译你的程序,然后运行编译后的代码,如果在所有的测试用例上运行的结果都预期结果完全一致,即可通关。 开始你的任务吧,祝你成功! /* 请在适当的位置补充代码,完成指定的任务 提示: try { } catch 之间补充代码 */ import java.sql.*; public class Client { public static void main(String[] args) { Connection connection = null; Statement statement = null; ResultSet resultSet = null; try { } catch (ClassNotFoundException e) { System.out.println("Sorry,can`t find the JDBC Driver!"); e.printStackTrace(); } catch (SQLException throwables) { throwables.printStackTrace(); } finally { try { if (resultSet != null) { resultSet.close(); } if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException throwables) { throwables.printStackTrace(); } } } }
最新发布
12-01
以下是完成该任务的完整 Java 代码,使用 JDBC 查询 `client` 中邮箱非空(即 `c_mail IS NOT NULL`)的客户信息,并输出 **客户姓名、邮箱和电话**,字段之间用制符分隔,符合题目要求。 ```java import java.sql.*; public class Client { public static void main(String[] args) { Connection connection = null; Statement statement = null; ResultSet resultSet = null; try { // 1. 加载并注册MySQL JDBC驱动(MySQL 8.x) Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 定义数据库连接参数 String URL = "jdbc:mysql://127.0.0.1:3306/finance?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=UTC"; String USER = "root"; // 假设用户名为root String PASS = "password"; // 假设密码为password,平台会自动配置真实值 // 3. 获取数据库连接 connection = DriverManager.getConnection(URL, USER, PASS); // 4. 创建Statement对象 statement = connection.createStatement(); // 5. 编写SQL查询:查询邮箱不为空的客户信息 String sql = "SELECT c_name, c_mail, c_phone FROM client WHERE c_mail IS NOT NULL"; // 6. 执行查询,获取结果集 resultSet = statement.executeQuery(sql); // 7. 输出标题行,列间用制符分隔 // 第1列和第2列:一个制符;第2列和第3列:四个制符(根据示例格式) System.out.println("姓名\t邮箱\t\t\t\t电话"); // 注意:上面的 \t 数量根据题意调整: // - 标题中“邮箱”到“电话”之间用了4个制符(可能为了对齐长邮箱),我们按示例模仿 // 实际上从输出效果看,“邮箱”字段内容较长,需多留空白。 // 我们改为更清晰的方式:标题使用固定宽度制符模拟对齐 // 但题目明确说明:“标题用4个制符”,字段值“用两个制符” // 所以修正如下: // 重新打印标准标题(严格按照题目描述): System.out.println("姓名\t邮箱\t\t\t\t电话"); // 遍历结果集 while (resultSet.next()) { String cName = resultSet.getString("c_name"); String cMail = resultSet.getString("c_mail"); String cPhone = resultSet.getString("c_phone"); // 字段值之间:第1列第2列一个\t,第2列第3列两个\t System.out.println(cName + "\t" + cMail + "\t\t" + cPhone); } } catch (ClassNotFoundException e) { System.out.println("Sorry, can't find the JDBC Driver!"); e.printStackTrace(); } catch (SQLException throwables) { System.out.println("Database access error!"); throwables.printStackTrace(); } finally { // 8. 关闭资源 try { if (resultSet != null) { resultSet.close(); } if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException throwables) { throwables.printStackTrace(); } } } } ``` --- ### ✅ 代码解释: 1. **`Class.forName("com.mysql.cj.jdbc.Driver")`** 动态加载 MySQL 8 的 JDBC 驱动,注册到 DriverManager 中。 2. **数据库连接 URL** 使用了完整的 JDBC URL 格式: ```text jdbc:mysql://127.0.0.1:3306/finance ``` 指向名为 `finance` 的数据库,添加了防止乱码和时区问题的参数。 3. **创建 Statement 并执行查询** ```java SELECT c_name, c_mail, c_phone FROM client WHERE c_mail IS NOT NULL ``` 只选出邮箱不为空的记录。 4. **处理 ResultSet** 使用 `resultSet.next()` 遍历每一行,通过列名获取字段值。 5. **格式化输出** - 标题:`姓名\t邮箱\t\t\t\t电话` → 即“邮箱”后有4个`\t` - 数据行:`cName\tcMail\t\tcPhone` → “邮箱”后仅2个`\t`,满足题目差异要求 6. **finally 块关闭资源** 按顺序关闭 `ResultSet` → `Statement` → `Connection`,避免资源泄漏。 --- ### 💡 注意事项(平台环境): - 平台已提供 `mysql-connector-java-8.0.23.jar`,无需手动引入。 - 用户名和密码可能是预设的(如 root/password),实际由平台控制,可保持硬编码或留待注入。 - 如果平台使用其他账号密码,请根据实际情况修改 `USER` 和 `PASS`。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值