热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java数据库编程、XML解析技术

数据库编程JDBC概述是JavaDatabaseConnecive,即数据库连接技术的简称,它提供了连接各种常用数据库的能力。是一种用于执行SQL语句的

数据库编程

 

JDBC概述

  是Java Database Connecive,即数据库连接技术的简称,它提供了连接各种常用数据库的能力。

  是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

JDBC组成

  通常JDBC有两部分组成:JDBC API和JDBC Driver。

  1)主要使用JDBC API完成三件事情:与数据库建立连接、执行SQL语句、处理结果。

  2)JDBC Driver常见的有以下几类:

                  JDBC-ODBC桥加ODB(驱动程序):缺点却是执行效率低、功能不够强大

                  JDBC+本地驱动:安全性比较差。

                  JDBC网络纯Java驱动程序:将JDBC转换为与DBMS无关的网络协议,又被某服务器转换为一种DBMS协议,以操作各种数据库

                  本地协议纯Java驱动程序:缺点是访问不同的数据库需要下载专用的JDBC驱动。

JDBC应用步骤

  1. 加载JDBC Driver
  2. 创建数据库连接(Connection)
  3. 创建一个Statement
  4. 执行sql语句(CRUD操作语句)
  5. 处理sql结果
  6. 关闭Statement
  7. 关闭连接Connection

1)加载JDBC Driver

  

1 try {
2 //加载MySQL JDBC驱动
3 Class.forName("com.mysql.jdbc.Driver");
4 } catch (ClassNotFoundException e) {
5 e.printStackTrace();
6 }

2)创建数据库连接

1 Connection connection = null;
2 String url = "jdbc:mysql://localhost:3306/jdbc"; // 连接字符串
3 String user = "root"; // 用户名
4 String pass = "123456"; // 密码
5 try {
6 // 创建Connection对象
7 connection = DriverManager.getConnection(url, user, pass);
8 } catch (SQLException e) {
9 e.printStackTrace();
10 }

3)创建Statement对象,执行SQL语句

// 创建Statement对象
Statement stmt = connection.createStatement();

// 发送Insert语句
int count = stmt.executeUpdate("INSERT INTO users(username, password) VALUES ('lily', 'lily123')");

// 发送查询SQL语句
ResultSet rs = stmt.executeQuery("SELECT id, username, password FROM users");

4)处理结果

// 循环处理查询结果集
while (rs.next()){System.out.println("编号:" + rs.getInt(1) + ", 用户名:" + rs.getString("username") + ", 密码:" + rs.getString("password"));
}

5)释放资源

try {if (rs != null)rs.close();if (stmt != null)stmt.close();if (connection != null)connection.close();
}
catch (SQLException e) {e.printStackTrace();
}

 

关于PreparedStatement  

  从代码易读性上来说,因为PreparedStatement使用“?”来代替参数,所以SQL语句较使用Statement更容易阅读。

  从安全性上来说,PreparedStatement是通过“?”来传递参数的,避免了拼sql而出现sql注入的问题,所以安全性较好。在开发中,推荐使用PreparedStatement。

String username = "admin";
String password
= "admin";
// 创建Statement对象
Statement stmt = connection.createStatement();
// 发送SQL语句并执行
ResultSet rs = stmt.executeQuery("SELECT id, username, password FROM users WHERE username='" + username + "' AND password='" + password + "'");// 创建PreparedStatement对象
PreparedStatement pstmt = connection.prepareStatement("SELECT id, username, password FROM users WHERE username=? AND password=?");
// 设置pstmt参数
pstmt.setString(1, username);
pstmt.setString(
2, password);
// 执行SQL语句
ResultSet rs2 = pstmt.executeQuery();

 

连接到数据库

  1)使用DriverManager类的静态方法getConnection();

  2)使用DataSource类的getConnection();

/*** 加载配置文件中JDBC连接所需要数据*/
private static void loadProperties() {InputStream in = Thread.currentThread().getClass().getResourceAsStream("/jdbc.properties");Properties prop = new Properties();try {prop.load(in);} catch (IOException e) {throw new RuntimeException(e);}driver = prop.getProperty("driver");url = prop.getProperty("url");user = prop.getProperty("user");password = prop.getProperty("password");
}

/* 通过静态代码块加载数据库驱动 */
static {loadProperties(); // 读取配置文件try {Class.forName(driver); // 加载驱动} catch (ClassNotFoundException e) {throw new RuntimeException(e);}
}

/*** 获取连接对象* * @return 连接对象* @throws SQLException* 无法建立连接,则抛出异常*/
public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, user, password);
}

数据库会话

/*** 开启会话*/
public void open() {if (null == conn)try {conn = JdbcResourceManager.getConnection();} catch (SQLException e) {throw new JdbcSessionException("数据库会话创建失败", e);}
}
/*** 关闭数据库会话,释放资源*/
public void close() {try {JdbcResourceManager.close(rs);rs = null;} catch (SQLException e) {throw new JdbcSessionException("数据库会话ResultSet关闭失败", e);} finally {try {JdbcResourceManager.close(pstmt);pstmt = null;} catch (SQLException e) {throw new JdbcSessionException("数据库会话Statement关闭失败", e);} finally {try {JdbcResourceManager.close(conn);conn = null;} catch (SQLException e) {throw new JdbcSessionException("数据库会话Connection关闭失败", e);}}}
}

执行INSERT、UPDATE、DELETE语句的方法:

/*** 执行更新SQL语句* * @param sql* 更新的SQL语句,如INSERT、UPDATE、DELETE语句* @param params* 用于替换更新语句中"?"占位符的参数列表* @return 受影响行数*/
public int executeUpdate(String sql, Object... params) {try {pstmt = conn.prepareStatement(sql);if (null != params) {for (int i = 0; i // 为每个?占位符设置参数pstmt.setObject(i + 1, params[i]);}}return pstmt.executeUpdate();} catch (SQLException e) {throw new JdbcSessionException("执行更新操作失败", e);}
}

  用于执行SELECT语句的方法:

/*** 执行查询SQL语句* * @param sql* 待执行查询的SQL语句,如 SELECT 语句* @param params* 用于替换查询语句中"?"占位符的参数列表* @return 查询结果集ResultSet对象*/
public ResultSet executeQuery(String sql, Object... params) {try {pstmt = conn.prepareStatement(sql);if (null != params) {for (int i = 0; i // 为每个?占位符设置参数pstmt.setObject(i + 1, params[i]);}}return rs = pstmt.executeQuery();} catch (SQLException e) {throw new JdbcSessionException("执行查询操作失败", e);}
}

 

JDBC之DAO模式

主要功能:是实现对持久化数据的访问。 

DAO的组成部分包括以下四个内容:

  • 数据库操作辅助类:实现数据库操作辅助功能,如获取连接,关闭连接等
  • 实体类:用于数据传递
  • DAO接口:约定DAO功能
  • DAO接口的实现类:具体实现DAO功能

 

使用JDBC处理MySQL大文本和大数据

向MySQL中存储大文本,可调用JDBC API中PreparedStatement的如下方法:

// 将指定参数设置为给定 Reader 对象
void setCharacterStream(int parameterIndex, Reader reader) throws SQLException
// 将给定参数设置为给定 Reader 对象,该对象具有给定字符数长度(int型)
void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException
// 将指定参数设置为给定 Reader 对象,该对象具有给定字符数长度(long型)
void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException

从MySQL数据库中获取大文本列字段值,则可以使用ResultSet的如下方法:

// 以 java.io.Reader 对象的形式获取此 ResultSet 对象的当前行中指定列的值
Reader getCharacterStream(int columnIndex) throws SQLException
Reader getCharacterStream(String columnLabel)
throws SQLException// 以 String 的形式获取此 ResultSet 对象的当前行中指定列的值
String getString(int columnIndex) throws SQLException
String getString(String columnLabel)
throws SQLException

向MySQL中存储二进制数据,可调用JDBC API中PreparedStatement的如下方法:

// 将指定参数设置为给定输入流。
void setBinaryStream(int parameterIndex, InputStream x)
// 将指定参数设置为给定输入流,该输入流将具有给定字节数(int型)。
void setBinaryStream(int parameterIndex, InputStream x, int length)
// 将指定参数设置为给定输入流,该输入流将具有指定字节数(long型)。
void setBinaryStream(int parameterIndex, InputStream x, long length)

需要从MySQL数据库中获取二进制列字段值,则可以使用ResultSet的如下方法:

// 以未解释字节的流的形式获取此 ResultSet 对象的当前行中指定列的值。
InputStream getBinaryStream(int columnIndex)
// 以未解释的 byte 流的形式获取此 ResultSet 对象的当前行中指定列的值。
InputStream getBinaryStream(String columnLabel) // 以 Java 编程语言中 Blob 对象的形式获取此 ResultSet 对象的当前行中指定列的值。
Blob getBlob(int columnIndex)
// 以 Java 编程语言中 Blob 对象的形式获取此 ResultSet 对象的当前行中指定列的值。
Blob getBlob(String columnLabel)

 

 

XML解析技术

 

XML概述:

  被设计用来传输和存储数据的可扩展标记语言。

  通过XML我们可以自定义自己的标签:

tomlilyI will go home this weekend!

  XML是一种树结构。树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构

  XML文档必须包含根元素,该元素是所有其他元素的父元素

XML语法规则

  XML声明,如:

    

  它定义XML的版本(1.0)和所使用的编码(utf-8)字符集。

  所有的XML元素都是成对出现的,有一个开始标签,就必须有一个关闭标签。

  XML标签对大小写敏感,标签与标签是不同的。

  XML文档必须有根元素,标签如果需要嵌套,必须正确嵌套,在内层打开的标签就必须在内层关闭。

  XML标签如果需要添加属性,属性值必须加引号。

  在XML中编写注释的语法与HTML的语法很相似,都是 。

  在XML中,空格会被保留,不像HTML中,加再多的空格最终都只合并为一个。

 

XML命名规则

XML元素必须遵循以下命名规则:

  • 名称可以包含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字母 xml(或者 XML、Xml 等等)开始
  • 名称不能包含空格
  • 可使用任何名称,没有保留的字词。

 

DTD 

  作用:是定义XML文档的合法构建模块

声明一个元素:

  

空元素:

  

PCDATA 的元素通过圆括号中的#PCDATA进行声明:

  

带任何元素的内容:

  

带有子元素(序列)的元素: 

 

注意:

当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。“mail”元素的完整声明是:







声明只出现一次的元素:  

  

声明最少出现一次的元素:  

  

声明出现0次或多次的元素: 

  

声明出现0次或1次的元素:   

  

声明属性
  


CDATA - (未解析)字符数据 

  CDATA部分不能包含字符串“]]>”,也不允许嵌套的CDATA部分。

  标记CDATA部分结尾的“]]>”不能包含空格或换行。

内部的DOCTYPE声明


DOCTYPE mail[




]
>
tomlilyI will go home this weekend!

外部文档声明




XML文件:



tomlilyI will go home this weekend!

 

使用dom4j操作xml   

  1. 创建Document对象

    Document document = DocumentHelper.createDocument();

    Element root = document.addElement(“students”); // 根元素节点

  2. 读取XML文件时,获取Document对象

    SAXReader reader = new SAXReader();

    Document document = reader.read(new File(“student.xml”));

  3. 字符串解析为XML时,获取Document对象

    String text = “tom“;

    Document document = DocumentHelper.parseText(text);

/*** 创建XML文件* * @throws IOException*/
public void createXml() throws IOException {// 创建Document对象Document document = DocumentHelper.createDocument();// 根元素节点Element root = document.addElement("students");root.addComment("all students info"); // 添加注释Element student = root.addElement("student"); // 根元素节点添加子节点student.addAttribute("id", "001"); // 添加节点属性Element name = student.addElement("name");name.addText("tommy"); // 设置节点文本Element age = student.addElement("age");age.addText("18");// 设置XML美化格式OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("utf-8"); // 编码字符集设置// xml写入器XMLWriter writer = new XMLWriter(new FileWriter("students.xml"), format);// 写操作
writer.write(document);writer.flush();writer.close();
}

 

/*** 修改xml文件* * @throws Exception*/
public void modifyXml() throws Exception {// 创建SAXReader对象SAXReader reader = new SAXReader();Document document = reader.read(new File("students.xml"));/** 修改内容之一: 如果student节点中id属性的内容为001,则修改成1001。因为查找节点使用到了Xpath,所以还需要将 jaxen-1.1-beta-6.jar 包添加到项目中 */List list = document.selectNodes("/students/student/@id");Iterator it = list.iterator();while (it.hasNext()) {Attribute attr = (Attribute) it.next();if ("001".equals(attr.getValue()))attr.setValue("1001");}/*** 修改内容之二: name项内容若为"tommy",则改为"tom"*/list = document.selectNodes("/students/student/name");it = list.iterator();while (it.hasNext()) {Element name = (Element) it.next();if ("tommy".equals(name.getText())) {name.setText("tom");}}/** 修改内容之三: 将id="1001"的学生age节点删除,再添加birth节点 */list = document.selectNodes("/students/student/@id");it = list.iterator();while (it.hasNext()) {Attribute attr = (Attribute) it.next();if ("1001".equals(attr.getValue())) {Element parent = attr.getParent();Iterator iterator = parent.elementIterator("age");if (iterator.hasNext()) {Element elem = (Element) iterator.next();parent.remove(elem);}Element birth = parent.addElement("birth");birth.setText("1995-01-01");break;}}/* 将document中的内容写入文件中 */// 设置XML美化格式OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("utf-8"); // 编码字符集设置// xml写入器XMLWriter writer = new XMLWriter(new FileWriter("students.xml"), format);writer.write(document);writer.close();
}

/*** 遍历节点* * @throws Exception*/
public void readXml() throws Exception {// 创建SAXReader对象SAXReader reader = new SAXReader();// 加载xml文件Document document = reader.read(new File("students.xml"));// 获取根元素节点Element root = document.getRootElement();// 递归遍历所有节点内容
read(root);
}
/*** 读节点信息* * @param element* student节点*/
private void read(Element element) {for (int i = 0, size = element.nodeCount(); i ) {Node node = element.node(i); // 获取元素的子节点if (node instanceof Comment) // 注释节点continue;if (node instanceof Element) { // 元素节点Element elem = (Element) node;System.out.print(elem.getName() + " : ");if ("student".equals(node.getName())) { // 是student节点
System.out.println();Iterator attr = elem.attributes().iterator(); // student节点属性while (attr.hasNext()) {Attribute at = (Attribute) attr.next();System.out.println(at.getName() + " : " + at.getValue());}}read((Element) node);} else if (node instanceof Text) { // 文本节点if (!"".equals(node.getText().trim()))System.out.println(node.getText());}}
}

 

XPath 简介

  在XPath中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。
  
节点关系:父、子、同胞、先辈、后代

 

  

转:https://www.cnblogs.com/wwg1426802735/p/4491613.html



推荐阅读
  • MySQL入门_MySQL入门篇!聊聊数据库与MySQL的相关概念
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL入门篇!聊聊数据库与MySQL的相关概念相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • ODBC和JDBC是做什么的?
    ODBC和JDBC是做什么的?数据库分享到:专业回答清水无月2006-07-2900:19什么是JDBC?JDBC,全称为JavaData ... [详细]
  • VB.NET怎么位运算?注意只能对整型执行按位运算。浮点值必须转换为整型后,才能执行按位运算。按位运算采用二进制(以2为基)形式计算两个整数值。它们比较对应位置上的位,然后基于比较 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 语法:CREATE[索引类型]INDEX索引名称ON表名(列名)WITHFILLFACTOR填充因子值0~100GOUSE库名GOIFEXISTS(SELECT*FR ... [详细]
  • Qt提供了QtSql模块来提供平台独立的基于SQL的数据库操作。这里我们所说的“平台独立”,既包括操作系统平台,有包括各个数据库平台。另外, ... [详细]
  • 升序|都会_Hive与优化方法
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Hive与优化方法相关的知识,希望对你有一定的参考价值。Hive与优化方法 ... [详细]
  • 《ACCESS实例教程(数据库的编程)》由会员分享,可在线阅读,更多相关《ACCESS实例教程(数据库的编程)(31页珍藏版)》请在人人文库网上搜索。1 ... [详细]
author-avatar
qtl4431541
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有