java数据库编程——执行查询操作(二)

【0】README

1) 本文部分文字描述和source code 均转自 core java volume 2 , 旨在理解 java数据库编程——执行查询操作(二) 的基础知识 ;
2) 本文和 java数据库编程——执行查询操作(一) 是姊妹篇, 共同组成了 java数据库编程——执行查询操作的全部内容, for java数据库编程——执行查询操作(一), please visit http://blog.csdn.net/PacosonSWJTU/article/details/50628980 ;
3)for database connection config, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/database.properties


【1】SQL转义

1)转义定义: 转义语法支持各种数据库普遍支持的特性, 但是数据库使用的是与数据库相关的语法变体, 因此,将转义语法转译为 特定数据库的语法是JDBC 驱动程序的任务之一。 (干货——将转义语法转译为 特定数据库的语法是JDBC 驱动程序的任务之一)
2)转义主要用于下列特性(Character):

  • C1)日期和时间字面常量;
  • C2)调用标量函数;
  • C3)调用存储过程;
  • C4)外连接;
  • C5) 在 like 子句中的 转义字符;
  • 2.1)应该使用d, t, ts 来表示 DATE, TIME 和 TIMESTAMP的值:

    {d, ‘2008-01-24’}
    {t, ‘23:59:59’}
    {ts, ‘2008-01-24 23:59:59.999’}

  • 2.2)标量函数: 是指仅返回一个值的函数;要调用函数, 需要嵌入标准的函数名和参数: (干货——标量函数定义)
    {fn left(?, 20)}
    {fn user() }

  • 2.3 )存储过程: 是在数据库中执行的用数据库相关的语言编写的过程。要调用存储过程, 需要使用 call 转移命令, 其中在存储过程没有任何参数的时候, 就不用加上括号。另外,应该用=来捕获存储过程的返回值; (干货——存储过程定义)

    {call PROC1(?, ?)}
    {call PROC2}
    {call ?=PROC3(?)}

  • 2.4)外连接;

  • 2.5) _ 和 % 字符在 LIKE 子句中具有特殊含义: 用来匹配一个字符或一个字符序列。 目前并不存在任何在字面上使用它们的标准方式, 所以如果想要匹配所有包含_ 字符的字符串, 就必须使用下面结构: (干货——_ 和 % 字符在 LIKE 子句中具有特殊含义)
    …. where ? like %!_% {escape ‘!’}
    这里, 我们将 ! 定义为 转移字符, 而 !_ 组合表示字面常量下划线; (干货—— 叹号! 定义为转移字符)

【2】多结果集

0)多结果集定义: 在执行存储过程,或在使用允许在单个查询中提交多个select 语句的数据库时,一个查询有可能会返回多个结果集。 (干货——多结果集定义)
1)下面是获取结果集的步骤: (干货——获取结果集的步骤)

  • step1)使用execute 方法来执行 sql 语句;
  • step2) 获取第一个结果集或更新计数;
  • step3)重复调用 getMoreResults 方法以移动到下一个结果集;
  • step4) 当不存在更多的结果集或更新计数时, 完成操作;

  • 1.1) 如果由多结果集构成的链中的下一项是结果集, execute 和 getMoreResults 方法将返回 true, 而如果在链中的下一项不是更新计数,getUpdateCount 方法将返回-1;

  • 1.2)下面的循环遍历所有结果集:
boolean isResult = stat .execute(command);
boolean done = false;
while(!done)
{if(isResult){ResultSet result = stat.getResultSet()do sth with result}else{int updateCount = stat.getUpdateCount();if(updateCount >= 0)do sth with updateCountelsedone = true;}if(!done)isResult = stat.getMoreResults();
}

2)看个多结果集的荔枝:

  • 2.1)for souce code, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/execute_select/OneCommitMultipleSelect.java
  • 2.2)key source code at a glance:
package com.corejava.chapter4;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;public class OneCommitMultipleSelect
{private static String cur_dir = System.getProperty("user.dir") + File.separator +  "com" + File.separator + "corejava" + File.separator +  "chapter4" + File.separator;// insert and select blob objpublic static void main(String[] args){try{try(Connection conn = getConnection()){// query starts. one sql commits multiple select statements.// String sql = "select id from student;select name from student";String sql = "call multi_select()";Statement stat = conn.createStatement();                                                boolean isResult = stat.execute(sql);boolean done = false;if(isResult){ResultSet result = stat.getResultSet();while(result.next()) // print result set named id {System.out.println("student.id = " + result.getInt(1));}}// 重复调用 getMoreResults 方法以移动到下一个结果集if((isResult = stat.getMoreResults())){ResultSet result = stat.getResultSet();while(result.next()) // print result set named 'name' {System.out.println("student.name = " + result.getString(1));}}System.out.println("the last stat.getMoreResults() == " + stat.getMoreResults());stat.close();conn.close();}}catch(Exception e){e.printStackTrace();}}public static Connection getConnection() throws IOException, SQLException{Properties prop = new Properties();try(InputStream in = Files.newInputStream(Paths.get(cur_dir + "database.properties"))){prop.load(in);}String drivers = prop.getProperty("jdbc.drivers");if(drivers != null){System.setProperty("jdbc.drivers", drivers); // register drivers for accessing database }String url = prop.getProperty("jdbc.url");String user = prop.getProperty("jdbc.username");String pass = prop.getProperty("jdbc.password");return DriverManager.getConnection(url, user, pass);}
}
  • 2.3)relative printing results as follows:
    这里写图片描述

Complementary)

  • C1)怎样创建+查看+调用存储过程;
    这里写图片描述
    这里写图片描述

  • C2)在创建存储过程的命令行代码中, delimiter // 以及 最后的 end// 是什么意思?
    它其实就是一个分隔符而已, 表明分隔符内的 分号; 并不表示输入结束,输入结束的标志是配对的 ‘//’: for detailed info , please visit http://database.51cto.com/art/201011/235017.htm


【3】获取自动生成键

1)当我们向数据库插入一个新行, 且其键自动生成时,可以实现下面的代码来获取这个键:

stmt.executeUpdate(insertStatement, Statement.RETURN_GENERATED_KEYS); // 自动生成主键;
ResultSet rs = stmt.getGeneratorKeys(); // 返回自动生成键的结果集;
if(rs.next())
{int key = rs.getInt(1);...
}

2)看个获取自动生成键的荔枝:

  • 2.1)for souce code, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/execute_select/MyGetPrimaryKey.java
  • 2.2)key source code at a glance:
public static void main1(String[] args) throws SQLException, IOException{       try{try(Connection conn = getConnection()){String sql = "insert employee(name, salary, address) values('zhangsan',1000,'beijing')";Statement stat = conn.createStatement();stat.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);ResultSet rs = stat.getGeneratedKeys();if(rs.next()){System.out.println(rs.getInt(1)); // print generated keys}}}catch(Exception e){e.printStackTrace();}}public static Connection getConnection() throws IOException, SQLException{Properties prop = new Properties();try(InputStream in = Files.newInputStream(Paths.get(cur_dir + "database.properties"))){prop.load(in);}String drivers = prop.getProperty("jdbc.drivers");if(drivers != null){System.setProperty("jdbc.drivers", drivers); // register drivers for accessing database }String url = prop.getProperty("jdbc.url");String user = prop.getProperty("jdbc.username");String pass = prop.getProperty("jdbc.password");return DriverManager.getConnection(url, user, pass);}
  • 2.3)relative printing results as follows:
  • 这里写图片描述

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

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

相关文章

Shell入门(十)之echo

一、echo参数 echo [参数选项] 字符串 参数选项 -e 解析字符串中的转义字符,如\n -E 这是默认设置,不解析转义字符 -n 不输出换行,可以使用echo -e 字符串"\c" 代替 #!/bin/bash a"abc\n" echo $a echo -e…

vaadin_Vaadin提示:延迟加载和商品标识

vaadin延迟加载 在Vaadin中使用网格,树或任何其他多值组件时,您通常希望显示数据库表中的数据,并且通常数据库中有多行。 在这种情况下,加载数千甚至数百万条记录是没有意义的,这将是一个巨大的性能问题。 对于此用例&…

com.mysql.jdbc.NotUpdatable: Result Set not updatable (references no primary keys).(解决方法)

【1】异常详细信息 com.mysql.jdbc.NotUpdatable: Result Set not updatable (references no primary keys). This result set must come from a statement that was created with a result set type of ResultSet.CONCUR_UPDATABLE, the query must select only one table, …

jdk 取整数_JDK 15中的确切绝对整数

jdk 取整数JDK 15 Early Access Build b18向Math和StrictMath类引入了新方法,这些方法将在提供的值超出方法所支持的范围时抛出ArithmeticException ,而不会溢出。 这些方法为Java中的“绝对值”概念带来了Math.addExact , Math.subtractExac…

java数据库编程——可滚动和可更新的结果集

【0】README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程——可滚动和可更新的结果集 的基础知识 ; 2)for database connection config, please visit :…

Spring入门(四)之BeanFactory

一、BeanFacotry访问一个Spring bean容器的根接口。这是一个Bean容器基本客户端视图;进一步的接口如ListableBeanFactory和configurablebeanfactory供特定用途。此接口由包含许多bean定义的对象来实现,每个对象都有唯一的字符串名称标识。根据bean定义&a…

apache derby_Apache Derby数据库JVM安全策略

apache derby抽象 我已经发布了许多有关Derby的博客: Derby数据库备份 同一主机上的多个Derby网络服务器 Apache Derby数据库用户和权限 与Maven和内存中Derby数据库的集成测试 这本不打算是一个系列。 但是多年来,我越来越多地使用Derby。 我开始将…

java数据库编程——事务

【0】README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程——事务 的基础知识 ; 2)for database connection config, please visit : https://github.co…

算法九之基数排序

一、基数排序 (1)基数排序的简介 基数排序不同于其他的排序算法,它不是基于比较的算法。基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。它是一种稳定的排序算法。  通常用于对数的排序选择的是最低位优先法&#xff…

在Spring中使用多个动态缓存

在第三篇有关Spring(长时间)的缓存管理器的文章中,我想通过展示如何配置多个动态创建缓存的缓存管理器来扩展前 两个 。 Spring具有CompositeCacheManager ,从理论上讲,它应该允许使用多个缓存管理器。 它通过询问基础…

java数据库编程——元数据(metadata)+web 与企业应用中的连接管理

【0】README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程——元数据(metadata)web 与企业应用中的连接管理 的基础知识 ; 2)for database co…

托管 非托管_如何在托管的Kubernetes上备份Neo4J

托管 非托管在下面的视频中,我将解释如何对在托管Kubernetes环境中运行的Neo4J实例进行完整和增量备份。 我们将使用其他Pod进行远程备份,并将备份数据存储在托管环境提供的持久卷上。 如果您想知道如何将Neo4J部署到托管Kubernetes,请查看以…

java国际化——Locale+数字格式

【0】README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java国际化——Locale数字格式 的基础知识 ; 2) java 编程语言是第一个设计成为全面支持国际化的语言。 2.1)…

Linux指令类型(一)change指令

一、change指令 chattr chgrp chmod chown chfn chsh chroot 二、ch指令详细介绍 &#xff08;1&#xff09;chattr 全名&#xff1a;change attribute 作用&#xff1a;chattr命令用于改变文件属性 语法&#xff1a;chattr [-RV][-v<版本编号>]…

restful rest_HATEOAS的RESTful服务。 REST:刷新器

restful rest在这篇文章中&#xff0c;我们将介绍有关HATEOAS的RESTful服务的综合文章。 REST&#xff1a;刷新器。 1.简介 “不好了&#xff01; 请&#xff0c;不要再发表有关REST的文章&#xff01;” 你们中的许多人可能会尖叫&#xff0c;这是正确的。 已经出版了太多的…

Unicode® Character Name Index

【0】README 0.1&#xff09; there are unicodes for varients of alphabet a, for that of b, c, or d and so on, please visit http://unicode.org/charts/charindex.html [A] A WITH ACUTE, LATIN CAPITAL LETTER 00C1 A WITH ACUTE, LATIN SMALL LETTER 00E1 A WITH…

java8 hash算法

一、hash算法哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值&#xff0c;这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母&#xff0c;随后的哈希都将产生不同的值。要找到散列为同…

exchanger_如何通过示例在Java中使用Exchanger

exchanger大家好&#xff0c;如果您在并发Java应用程序中工作&#xff0c;那么您可能听说过java.util.concurrent包的Exchanger类。 Java中的Exchanger是Java 1.5中与CountDownLatch &#xff0c; CyclicBarrier和Semaphores一起引入的另一个并发或同步实用程序。 顾名思义&…

Java Enumeration接口与Iterator接口

一、Enumeration接口 Enumeration接口中定义了一些方法&#xff0c;通过这些方法可以枚举&#xff08;一次获得一个&#xff09;对象集合中的元素。 这种传统接口已被迭代器取代&#xff0c;虽然Enumeration 还未被遗弃&#xff0c;但在现在代码中已经被很少使用了。尽管如此&a…