`

(五) 执行查询操作

阅读更多

五. 执行查询操作
5.1 预备语句
预备语句(prepared statement) : 一个带有宿主变量的查询语句,每次查询的时候时只需要为该变量填入不同的字符串就可以反复多次地使用该语句。
在PreparedStatement预备语句中,每个宿主变量都用“?”来表示。如果存在一个以上的变量,那么在设置变量值时必须注意"?"的位置。
e.g. 

 

String publishQuery = "SELECT * FROM table WHERE name=?"
PreparedStatement publishQueryStat = conn.prepareStatement(publishQuery);
 

(1)在执行预备语句之前,必须使用setXXX方法将变量绑定到实际值上。和ResultSet方法中得get方法类似。第一个参数是需要赋值的变量的位置,位置1标示第一个"?",第二个参数是赋予宿主变量的值。
(2)重用预备语句,需要通过set或调用clearParameters方法,否则所有宿主的变量的绑定都不会改变。也就是说,想要在一个查询到另一个查询中,重用预备语句,只需要使用setXXX方法。
(3)执行execute/executeQuery/executeUpdate
e.g.  Result rs = publishQueryStmt.executeQuery();
注意:
(1)因为效率问题,当能通过复杂的SQL进行查询的情况下,不要通过JAVA代码来遍历结果集
(2)executeUpdate方法中的sql可以使用select子句。
e.g. String sql = "UPDATE books SET books.price=? where books.id=(select id from publish where publish.name=?)"

5.2 读写LOB
在SQL中二进制大对象称为BLOB,字符串大对象称为CLOB

(1)读取LOB,需要执行SELECT语句,然后在ResultSet上调用getBlob和getClob方法,这样就可以获得Blob和Clob对象。
要从Blob中获取二进制数据,可以调用getBytes或getInputStream。
要从Clob中获取字符数据,可以调用getSubString或getCharacterStream
e.g.

 

PreparedStatement stat = conn.prepareStatement("SELECT cover FROM book_covers WHERE isbn=?")
stmt.setInt(1, isbn);
ResultSet result = stmt.executeQuery();
if(result.next){
     Blob coverBlob = result.getBlob(1);
     Image coverImage = ImageIO.read(coverBlob.getInputStream());
}
 


(2)将LOB置于数据库中,需要在Connection对象上调用调用createBlob或createClob,然后获取一个用于该LOB的输出流或写出器,并将该对象存储到数据库中。
e.g. 

 

        Blob coverBlob = connection.createBlob();
        int offset = 0;
        OupputStream out = coverBlob.setBinaryStream(offset);
        ImageIO.write(coverImage, "PNG", out);
        PreparedStatement stat = conn.prepareStatement("INSERT INTO cover VALUES(?,?)")
        stmt.set(1, isbn);
        stmt.set(2, coverBlob);
        stmt.executeUpdate();

 


5.3 SQL转义
转义主要用于特征:
(1)日期和时间字面常量
日期和时间字面常量在随数据库的不同而变化很大,要嵌入日期或时间字面常量,需要按照ISO 8601格式指定它的值。之后驱动程序会将其转换为本地格式。
其中d-DATE {d '2011-11-11'}, t-TIME {t '23:59:59'}, ts-TIMESTAMP {ts '2011-11-11 23:59:59'}
e.g.MySQL环境下例子
1)建表
String sql = String createTable = "CREATE TABLE test_table(d DATE, t TIME, ts TIMESTAMP)";
2)输入

 

String sql = "INSERT INTO test_table VALUES({d '2001-11-11'},{t '23:59:59'},{ts '2011-11-11 23:59:59'})";
connection.createStatement().executeUpdate(sql);

 

String sql = "INSERT INTO test_table values(?,?,?)";
PreparedStatement prepStat = conn.prepareStatement(sql);
long dateNumber = new java.util.Date().getTime();
for(int i=0;i<ch.length&&i<str.length;i++){
    prepStmt.setDate(1, new Date(dateNumber));
    prepStmt.setTime(2, new Time(dateNumber));
    prepStmt.setTimestamp(3, new Timestamp(dateNumber));
    prepStmt.executeUpdate();
}
prepStmt.close();
 


3)输出

 

Statement stat = conn.createStatement();
boolean haveResult = stmt.execute("select * from test_table");
if(haveResult){
    do{
        ResultSet result = stmt.getResultSet();
        while(result.next()){
        System.out.println(result.getDate(1)+","+result.getTime(2)+","+result.getTimestamp(3));
    }while(stmt.getMoreResults());
}  
 


(2)调用标量函数(scalar function)
是指仅返回一个数值的函数。在不同数据库中函数名存在差异,JDBC规范提供了标准的名字,并将其转义为数据库相关的名字。
e.g.  {fn left(?,20)}
        {fn user()}
具体支持内容在JDBC规范中
(3)调用存储过程
是在数据库中执行的用数据库相关的语言编写的过程。要调用存储过程,需要使用call转义命令,其中在存储过程没有任何参数的时候,就不用加上括号。另外,应该用=来捕获存储过程的返回值。
e.g.  {call PROC1(?,?)}
        {call PROC2}
        {call ? = PROC3(?)}
(4)外连接(outer join)
两个表的外连接并不要求每个表的行都要根据连接条件进行匹配
e.g. SELECT * FROM {oj books LEFT OUTER JOIN publisher ON books.publisher_id = publisher.publisher_id}
这个查询的执行结果中包含有publisher_id在publisher表中没有任何匹配的书,其中publisher_id为null值的行,就表示不存在任何匹配。
如果使用RIGHT OUTER JOIN就可以包括没有任何匹配图书的出版商,而使用FULL OUTER JOIN可以同时返回这两类没有任何匹配的信息。
使用转义的原因 : 并非所有的数据库对于这些连接都使用标准写法,因此需要使用转义语法。
(5)在LIKE子句中的转义字符
由于在LIKE子句中_和%具有特殊含义(用来匹配一个字符或一个字符序列),所以不存在任何在字面上使用他们的标准方式。
e.g. 匹配所有包含_字符的字符串的结构
  ... WHERE ? LIKE %!_%{escape '!'}
这里我们将!定义为转义字符,而!_组合表示字符常量下划线_。

5.4 多结果集
在执行存储过程,或在使用允许在单个查询中提交多个SELECT语句的数据库时,一个查询可能会返回多个结果集。
(1)使用execute方法来执行SQL语句。
(2)获取第一个结果集或更新计数。
(3)重复调用getMoreResult方法移动到下一个结果集(这个调用会自动关闭前一个结果集)。
(4)当不存在更多的结果集或更新计数时,完成操作。
注意 : 如果由多个结果集构成的链的下一个是结果集,execute方法和getMoreResult方法将返回true,如果在链的下一项不是更新计数,getUpdateCount方法将返回-1。

 

    try{
            PreparedStatement prepStat = null;
            try{
                String sql = "SELECT * FROM test_table where key=? ";
                prepStat = conn.prepareStatement(sql);
                prepStmt.setString(1, "a");
                boolean hasResult = prepStmt.execute();
                if(hasResult){
                    do{
                        ResultSet result = prepStmt.getResultSet();
                        while(result.next()){
                            System.out.println(result.getInt("id"));
                        }
                    }while(prepStmt.getMoreResults());
                }
            }finally{
                prepStmt.close();
            }
        }catch(SQLException e){
            for(Throwable t : e){
                e.printStackTrace();
            }
        }
 



5.5 获取自动生成键
大多数数据库都支持某种在数据库中对行自动计数的机制,不同提供商提供的数据库之间存在着很大的差异,而这些自动生成键经常用作主键。
JDBC中没有提供独立与提供商的自动生成键的解决方案,但是提供了获取自动生成键的有效途径。
e.g.  向数据库中插入新行,自动生成键的实现

        stmt.executeUpdate(insertStatement, Statement.RETURN_GENERATED_KEYS);
        ResultSet rs = stmt.getGeneratedKeys();
        if(rs.next()){
            int key = rs.getInt(1);
        }
 

 

 

分享到:
评论

相关推荐

    SQL Server数据库查询速度慢原因及优化方法

    例如耽搁查询 的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作UPDATE,INSERT, DELETE还不能并行处理。 ...

    LINUX操作系统(电子教案,参考答案)

    2.2.2 查询、修改日期与时间 14 2.2.3 观看月历 15 2.2.4 清屏 16 2.2.5 获取注册信息 16 2.2.6 与其他用户作简单通讯 17 2.2.7 观看主机配置情况 18 2.2.8 寻找命令使用方法 18 2.3 退出Linux 19 2.3.1 注销 19 ...

    非常实用c#操作Access数据库的例子(application)

    4.执行查询,返回DataSet OleDbConnection connection = new OleDbConnection(connectionString); DataSet ds = new DataSet(); connection.Open(); OleDbDataAdapter da = new OleDbDataAdapter(sql, connection); ...

    LTE华为后台U2000操作指导书2017整理

    五. LTE常用命令的操作 7 4.1 eNodeB MML常用命令 7 4.2 机房操作命名解析 11 1、 MML命令界面 11 2、 常用命令解析 11 小区级命令查询 16 3、 查询小区RRU数目及其框号/槽号(DSP CELL) 16 4、 查询扇区配置信息...

    Oracle数据库实验操作

    实验27:查询结果的集合操作 63 实验28:高级分组rollup,cube操作 65 实验29:树结构的查询start with子句 66 实验30:高级dml操作 68 第二部分pl/sql基础 69 匿名块的编写 69 实验31:书写一个最简单的块,运行并...

    MySQL 事务(五).pdf

    这份PDF文档《MySQL事务(五).pdf》是关于MySQL数据库事务管理的深入指南,作为系列教程的第五部分,它详尽地介绍了事务处理的概念、原则以及在实际数据库操作中的应用。内容包括: 事务基础:解释事务的概念和...

    《计算机操作系统》期末复习指导

    操作系统的五大类型是批处理操作系统、分时操作系统、实时操作系统、网络操作系统、分布式操作系统。 多道程序设计:即在系统内(内存)同时存放并运行几道相互独立的程序。 多道程序设计的基础:是将...

    Java课程设计实训大作业:记事本+简易计算器+聊天系统+日历+中英查询(含源代码+运行截图+实训报告)

    进阶任务五:自选主题开发一个应用软件(如在线聊天系统,学籍管理系统等)下面给的软件界面只是参考,同学们可以根据自己的想法进行设计。 1.软件界面美观、功能完善软件,导航清晰,操作方便,使用菜单栏、工具栏...

    SQLServer安全及性能优化

     执行查询的性能  单个用户或应用程序的活动  逻辑磁盘的读写  语句级别上的CPU占用  Standart模板的事件类 优化数据库性能可以从五个层次来进行:  优先级一:减少数据的访问【减少磁盘访问】  ...

    超市进销存管理系统(Visual C++)

    &lt;超市进销存管理系统&gt;此代码使用的是VC++,并且与数据库相结合(内含系统说明书)详细说明了超市进销存管理系统的各项功能,并且全部实现了前台销售结帐、基本信息管理、基本信息查询、日结查询、超市小票打印等五个...

    课程表查询 vb课程设计

    课表查询系统 三、设计任务 (1)要求用VisualBasic6.0提供的系统函数和标准控件完成设计; (2)从列表框中选择“年级、专业、日期”的信息后,显示该班级在当日所对应的课程。 (3)在设计程序的过程中,要求...

    情境四-公司管理数据库系统的查询.doc

    执行查询语句方法. (二)按照任务2查询所有'男'雇员的信息。 查询语句如下: SELECT * FROM employee WHERE 性别='男' (三)按照任务3规定的格式,列出所有雇员的姓名和薪水. 为了使查询的结果更加友好,可以改变列...

    数据库查询相关知识点

    文章目录数据库Mysql查询基础知识点重点:整个语句的执行过程如下:一.基础查询1.SELECT 子句的规定2. 为列起别名的操作3. 使用 WHERE 子句指定查询条件4.使用ORDERBY子句对查询结果排序二.分组查询1.聚合函数2...

    delphi通过fblib控件操作firebird源代码

    delphi通过fblib控件操作firebird的源代码,可以执行SQL语句,支持事务处理,包括了支持firebird数据库的DLL文件。 网上查询的资料称: firebird的embedded方式,只需要把icudt30.dll、icuin30.dll、icuuc30.dll、 ...

    oracle 11g 性能优化扫描版

    oracle 11g数据库性能优化扫描版。目录: 第一章 优化表性能 第二章 选择和优化索引 第三章 优化实例内存 第四章 监控系统性能 第五章 最小化系统资源争夺 第六章 分析操作系统性能 ...第十五章 并行执行sql

    数据库原理实验报告整合

    在已建立的学生数据库和数据表的基础上,用Select语句完成下列查询操作。 STUDENT(SNO,SNAME,SEX,DOB,DEPT,TELNO) COURSE(CNO,CNAME,CPNO,TEACHER,CREDIT) SC(SNO,CNO,SCORE) 1、 查询全体学生的学号和姓名。 ...

    LINQ 实战 1/11

    12.3.3 示例1:跟踪标准查询操作符的执行过程 337 12.3.4 限制:查询表达式冲突 338 12.3.5 示例2:非泛型的、领域相关的操作符 340 12.3.6 示例3:非序列的查询操作符 342 12.4 查询Web服务:LINQ to ...

    LINQ 实战 3/11

    12.3.3 示例1:跟踪标准查询操作符的执行过程 337 12.3.4 限制:查询表达式冲突 338 12.3.5 示例2:非泛型的、领域相关的操作符 340 12.3.6 示例3:非序列的查询操作符 342 12.4 查询Web服务:LINQ to ...

    LINQ 实战 4/11

    12.3.3 示例1:跟踪标准查询操作符的执行过程 337 12.3.4 限制:查询表达式冲突 338 12.3.5 示例2:非泛型的、领域相关的操作符 340 12.3.6 示例3:非序列的查询操作符 342 12.4 查询Web服务:LINQ to ...

    LINQ 实战 2/11

    12.3.3 示例1:跟踪标准查询操作符的执行过程 337 12.3.4 限制:查询表达式冲突 338 12.3.5 示例2:非泛型的、领域相关的操作符 340 12.3.6 示例3:非序列的查询操作符 342 12.4 查询Web服务:LINQ to ...

Global site tag (gtag.js) - Google Analytics