【0】README

【1】java数据库编程——执行SQL 语句相关

1)执行 SQL 命令前, 首先需要创建一个 Statement 对象: 要创建 statement 对象,不需要调用 DriverManager.getConnection 方法所获得的 Connection对象;(干货——Statement object == 语句对象)

step1) Statement stat = conn.createStatement();

step2) 将要执行的 SQL 语句放入字符串中,如:

String command = “update ….”;

step3) 然后,调用Statement 接口中的executeUpdate 方法:

stat.executeUpdate(command); // executeUpdate 方法:将返回受SQL命令影响的行数, 或者对于不返回行数的语句返回0; (干货——executeUpdate返回受SQL命令影响的行数,或者0)

2)execute系列方法: (干货——execute系列方法:executeUpdate + executeQuery + execute)

2.1)executeUpdate 方法:既可以执行诸如 insert, update, 和 delete之类的操作(DML), 也可以执行诸如 create , drop 之类的数据定义语句(DDL);

2.2)executeQuery方法: 执行 select 查询语句时 必须使用 executeQuery 方法;

2.3)execute 方法: 可以执行任意的sql 语句, 通常只用于用户提供的交互式查询;

3)查询结果(ResultSet 类型): executeQuery 方法返回一个ResultSet类型的对象, 可以通过它来每次一行地迭代遍历所有查询结果;

ResultSet rs = stat.executeQuery(“select * from books”);

3.1)分析结果集时通常可以使用类似如下循环语句的代码:

while(rs.next() )

{

look at a row of the result set

}

Warnning)

W1)ResultSet接口的 迭代协议与 java.util.Iterator 接口稍有不同。 对于ResultSet 接口, 迭代器初始化时被设定在第一行之前的位置,必须调用 next 方法将它移动到第一行; (干货——ResultSet接口的 迭代协议与 java.util.Iterator 接口稍有不同)

W2)另外,它没有hasNext方法, 我们需要不断地调用 next, 直至该方法返回 false;

W3)结果集中行的顺序是任意的, 不能为行序强加任何意义; (干货——ResultSet结果集中行的顺序是任意的, 不能为行序强加任何意义)

3.2)查看每一行,需要知道每一列的内容:

String str = rs.getString(1);

double price = rs.getDouble(1);

3.3)不同的数据类型有不同的访问器:比如 getString 和 getDouble; 每个访问器都有两种形式,一种接收数字类型参数,一个接收字符串类型参数;

Warning) 数据库的列序号从1开始算 ;

3.4)当使用 字符串参数时, 指的是结果集中以该字符串为列名的列;如,

rs.getDouble(“price”) 返回列名为 Price 的列所对应的值;

3.5)当get方法的类型和列的数据类型不一致时, 每个get 方法都会进行合理的类型转换;

【2】管理连接、语句和结果集

1)每个Connection对象都可以创建一个或多个 Statement对象;

1.1)同一个Statement对象可以用于不相关的命令和查询;

1.2)但是,一个Statement对象最多只能有一个打开的结果集;

1.3)需要说明的是: 至少有一种常用的数据库(Microsoft SQL Server) 的JDBC驱动程序只允许同时存在一个活动的 Statement 对象。使用 DatabaseMetaData 接口中的 getMaxStatements 方法可以获取JDBC 驱动程序支持的同时活动的语句对象的总数;

1.3.1)这看上去很有局限性。实际上,我们通常并不需要同时处理多个 结果集。对数据库进行组合查询比使用 java 程序遍历多个结果集要高效得多; (干货——我们通常并不需要同时处理多个 结果集,对数据库进行组合查询比使用 java 程序遍历多个结果集要高效得多)

1.4)close方法:使用完 ResultSet , Statement , Connection对象后,立即调用 close方法;

1.5)closeOnCompletion方法: 在java 7中, 可以在 Statement 上调用 closeOnCompletion 方法, 在其所有结果集都被关闭后, 该语句会立即被自动关闭; (干货——java7引入的新方法closeOnCompletion)

1.6)如果所用连接都是短时的,无需考虑关闭语句和结果集。 只需要将 close 语句放 在 带资源的try语句中, 以便确保最终连接对象不可能继续保持打开状态:

try (Connnection conn =…)

{

Statement stat = conn.createStatement();

ResultSet result = stat.executeQuery(queryStr);

process query result

}

Attention) 应该使用带资源的try 语句块来关闭连接,并使用一个单独的 try /catch 块处理异常。 分离 try 程序块可以 提高代码的可读性和可维护性;

【3】分析 SQL 异常(SQLException)

1) java 6 改进了 SQLException 类,让其实现了 Iterable接口, 其 iterator() 方法可以产生一个 Iterable< Throwable>;

1.1) 这个迭代器是可以迭代这两个链, 首先迭代第一个 SQLException 的成因链, 然后迭代下一个 SQLException ,以此类推;如,

for(Throwable t : sqlException)

{

do sth with t

}

1.2)可以在 SQLException 上调用 getSQLState 和 getErrorCode 方法来进一步分析它;

2) SQLException 按照层次结构树的方式组合到了一起, 如下图所示:

2.1)数据库驱动程序将非致命问题作为警告报告,我们可以从连接(Connection), 语句(Statement)或结果集(ResultSet)中获取这些警告;

2.2)SQLWarning: 是 SQLException的子类,我们可以调用 getSQLState 和 getErrorCode 来获取有关警告的更多信息; (干货——SQLWarning 定义)

2.3)要获得所有警告,使用下面的循环:

SQLWarning w = stat.getWarning()

while(w != null)

{

do wth with w

w = w.nextWarning();

}

2.4)当数据从数据库中读出并意外被截断时, SQLWarning 的 DataTruncation 子类就派上用场了; 如果数据截断发送在更新语句中, 那么DataTrucation 将会被当做异常抛出;

【4】组装数据库

1)看个荔枝:(用java 操作数据库)

step1)连接数据库。

step1.1) getConnection 方法:读取database.properties 文件中的 属性信息,并将属性jdbc.drivers 添加到系统属性中;

step1.2) 驱动程序管理器:使用属性jdbc.drivers 加载相应的驱动程序;

step1.3) getConnection方法: 使用 jdbc.url , jdbc.username, jdbc.password 等属性打开数据库连接;

step2)使用 sql 语句打开文件;

step3) 使用 泛化的execute 方法执行每条语句;

step4) 如果产生了结果集, 则打印结果;

step5) 如果运行过程中出现 SQL 异常, 则打印出这个异常以及所有可能包含在其中的与其连接在一起的相关异常;

step6)关闭数据库连接;

2)运行结果如下:

(java -classpath .;D:\Software_Cluster\Development\mysql\mysql-connector-java-5.1.17\mysql-connector-java-5.1.17-bin.jar com.corejava.chapter4.ExecSQL)

3)source code at a glance

class ExecSQL

{

private static String cur_dir = System.getProperty("user.dir") + File.separator +

"com" + File.separator + "corejava" + File.separator + "chapter4" + File.separator;

public static void main(String args[]) throws IOException

{

try

{

Scanner in = args.length == 0 ? new Scanner(System.in) : new Scanner(Paths.get(args[0]));

try (Connection conn = getConnection())

{

Statement stat = conn.createStatement();

while (true)

{

if (args.length == 0) System.out.println("Enter command or EXIT to exit:");

if (!in.hasNextLine()) return;

String line = in.nextLine();

if (line.equalsIgnoreCase("EXIT")) return;

if (line.trim().endsWith(";")) // remove trailing semicolon

{

line = line.trim();

line = line.substring(0, line.length() - 1);

}

try

{

boolean isResult = stat.execute(line);

if (isResult)

{

ResultSet rs = stat.getResultSet(); //结果集

showResultSet(rs); // 打印结果集

}

else

{

int updateCount = stat.getUpdateCount();

System.out.println(updateCount + " rows updated");

}

}

catch (SQLException ex)

{

for (Throwable e : ex)

e.printStackTrace();

}

}

}

}

catch (SQLException e)

{

for (Throwable t : e)

t.printStackTrace();

}

}

public static Connection getConnection() throws SQLException, IOException

{

Properties props = new Properties();

try (InputStream in = Files.newInputStream(Paths.get(cur_dir + "database.properties")))

{

props.load(in);

}

String drivers = props.getProperty("jdbc.drivers");

if (drivers != null) System.setProperty("jdbc.drivers", drivers);

String url = props.getProperty("jdbc.url");

String username = props.getProperty("jdbc.username");

String password = props.getProperty("jdbc.password");

return DriverManager.getConnection(url, username, password);

}

public static void showResultSet(ResultSet result) throws SQLException

{

ResultSetMetaData metaData = result.getMetaData(); // 结果集元数据

int columnCount = metaData.getColumnCount();

for (int i = 1; i <= columnCount; i++)

{

if (i > 1) System.out.print(", ");

System.out.print(metaData.getColumnLabel(i));

}

System.out.println();

while (result.next()) // 循环打印结果集

{

for (int i = 1; i <= columnCount; i++)

{

if (i > 1) System.out.print(", ");

System.out.print(result.getString(i));

}

System.out.println();

}

}

}

Java让数据库执行一条sql_java数据库编程——执行SQL 语句相关推荐

  1. java数据库编程——执行SQL 语句

    [0]README 1) 本文文字描述+source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行SQL 语句 的基础知识 : 2)for sour ...

  2. [Qt教程] 第23篇 数据库(三)利用QSqlQuery类执行SQL语句

    [Qt教程] 第23篇 数据库(三)利用QSqlQuery类执行SQL语句 楼主  发表于 2013-5-15 22:39:29 | 查看: 813| 回复: 0 利用QSqlQuery类执行SQL语 ...

  3. 【Qt入门第23篇】 数据库(三)利用QSqlQuery类执行SQL语句

    导语 SQL即结构化查询语言,是关系数据库的标准语言.前面两节中已经在Qt里利用QSqlQuery类执行了SQL语句,这一节我们将详细讲解该类的使用.需要说明,因为我们重在讲解Qt中的数据库使用,而非 ...

  4. Qt数据库(三)利用QSqlQuery类执行SQL语句(一)

    本文章原创于www.yafeilinux.com 转载请注明出处. SQL即结构化查询语言,是关系数据库的标准语言.前面已经提到,在Qt中利用QSqlQuery类实现了执行SQL语句.需要说明,我们这 ...

  5. java连接本地数据库命令_Java操作数据库时一次连接只能执行一条SQL命令

    Java操作数据库时一次连接只能执行一条SQL命令 答:× 全面深化改革要攻坚涉险,必须坚持正确的思想方法,不断探索和把握全面深化改革的内在规律,特别是要把握和处理好全面深化改革中的等重大关系 答:整 ...

  6. MySQL是如何执行一条SQL更新语句

    MySQL是如何执行一条SQL更新语句 1. SQL更新流程 2. 重做日志redolog 3. 归档日志binlog 4. 两阶段提交 1. SQL更新流程 MySQL是如何执行一条SQL查询语句的 ...

  7. Java 技术篇 - java同时连接多种数据库执行sql语句的兼容性验证,数据库类型包括:oracle、sqlserver、DB2、人大金仓、达梦、PG、瀚高、polardb

    Java 操作多类型数据库下的兼容性验证 第一章:数据库测试 ①[ oracle 数据库不支持分号]ORA-00933: SQL 命令未正确结束 ② [sqlserver 数据库不支持 commit] ...

  8. sql server 2005管理员手册_执行一条sql语句都经历了什么?

    每天都在跟 mysql 打交道,你知道执行一条简单的 select 语句,都经历了哪些过程吗? 首先,mysql 主要是由 server 层和存储层两部分构成的.server 层主要包括连接器.查询缓 ...

  9. Qt数据库:(三)利用QSqlQuery类执行SQL语句(一)

    SQL即结构化查询语言,是关系数据库的标准语言.前面已经提到,在Qt中利用QSqlQuery类实现了执行SQL语句.需要说明,我们这里只是Qt教程,而非专业的数据库教程,所以我们不会对数据库中的一些知 ...

最新文章

  1. 基于AI探索表观遗传药物发现的化学空间
  2. EasyUI-datagrid 对于展示数据进行处理(formatter)
  3. unix网络编程 ubuntu下搭建环境编译源码
  4. Python 模块初始化的时候,发生了什么?
  5. 计算机通信技术 ppt,江苏大学计算机科学与通信工程学院计算机科学系.ppt
  6. Android之解决ScrollView嵌套RecycleView导致滑动冲突或者显示不全的问题
  7. python文本聚类分析_python机器学习kmeans算法——对文本进行聚类分析
  8. 服务器维护通宵,20150405晚上凌晨通宵进行服务器系统维护
  9. 使用正则表达是搜索多个字符串,表达式中加入变量
  10. 超全的JS重新加载当前页面的几种方式
  11. android listview滑动分页加载数据,android中listview分页加载数据
  12. 对于一个小白来说,遇到的前端问题(3)
  13. 股票、期货、数字货币技术指标库TA-Lib
  14. haribote bootpack.c 主任务程序代码阅读注释
  15. 服务器导出word文档中有乱码,使用Aspose.word DOC转PDF文件乱码问题-Doc文件
  16. 不出国,雅思也有大用。来看这篇IELTS雅思考试超详细扫盲贴
  17. 你必须理解的三大软件原则1_DRY
  18. java扫描仪快捷键
  19. 价值平均定期投资策略分析(二)定期递增法
  20. rsync~inotify同步复制

热门文章

  1. 7 centos lvs nat配置_centos中lvs安装配置方法详解
  2. 华为手机投屏电脑_华为手机如何投屏到电脑?这很实用
  3. 【英语学习】【English L06】U07 Jobs L2 I have my own bakery now
  4. 【英语学习】【WOTD】glitch 释义/词源/示例
  5. 【英语学习】【Daily English】U02 Daily Routine L01 Sadly, my schedule is very tight.
  6. 基于OpenCL的数字地形分析之坡度坡向提取
  7. python endswith函数_Python Pandas Series.str.endswith()用法及代码示例
  8. mosquitto支持websocket的使用方法
  9. 绝地求生2017.7.27服务器维护,绝地求生大逃杀更新内容 7月27日更新了什么
  10. mqtt如何发送心跳 安卓_互联网推送服务原理:长连接+心跳机制(MQTT协议)