1. SQL 联合查询
在数据库查询中,我们经常需要从多个表中获取数据,而SQL联合查询(UNION)可以将多个SELECT语句的结果合并成一个结果集返回。使用UNION需要注意以下几点:
返回的列数必须相同。
返回的列的数据类型必须兼容。例如,一个INT类型的列不能与一个VARCHAR类型的列合并。
下面我们来看一个SQL联合查询的例子:
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 10
UNION
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 20;
上面的查询语句将返回员工表中部门ID为10和20的所有员工的第一名和姓氏。
2. XML解析
XML是可扩展标记语言(Extensible Markup Language)的缩写,它是用来存储和传输数据的一种标记语言,常用于Web领域中的数据传输。
解析XML需要使用专门的解析库。Java中常用的XML解析库有DOM和SAX。下面我们分别介绍一下这两种库的用法。
2.1 DOM解析XML
DOM(Document Object Model)解析XML是将整个XML文档加载到内存中,然后将其解析成一个树形结构,通过节点遍历的方式获取到XML文档中的信息。DOM解析的优点是易于操作,缺点是当XML文档较大时,会占用较大的内存。
下面是一个使用DOM解析XML的例子:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("example.xml"));
// 获取根节点
Element root = doc.getDocumentElement();
// 获取所有子节点
NodeList list = root.getChildNodes();
// 遍历子节点
for(int i=0;i
Node node = list.item(i);
if(node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
// 获取节点属性
String id = element.getAttribute("id");
// 获取节点文本
String name = element.getElementsByTagName("name").item(0).getTextContent();
String age = element.getElementsByTagName("age").item(0).getTextContent();
System.out.println("id=" + id + ",name=" + name + ",age=" + age);
}
}
2.2 SAX解析XML
SAX(Simple API for XML)解析XML是一种基于事件驱动的解析方式,它将XML文档作为一系列的事件流来处理,相对于DOM来说,SAX解析的优点是速度快、占用内存少,缺点是操作稍微有些复杂。
下面是一个使用SAX解析XML的例子:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
String currentTag = null;
String name = null;
String age = null;
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
currentTag = qName;
if(currentTag.equals("student")){
String id = attributes.getValue("id");
System.out.print("id=" + id + ",");
}
}
public void characters(char[] ch, int start, int length) throws SAXException {
String value = new String(ch, start, length).trim();
if(!"".equals(value)){
if(currentTag.equals("name")){
name = value;
}
if(currentTag.equals("age")){
age = value;
}
System.out.println("name=" + name + ",age=" + age);
}
}
};
parser.parse(new File("example.xml"),handler);
总结
SQL联合查询和XML解析都是非常常用的技术,在实际应用中更多的是综合使用,例如从多个XML文件中获取数据,然后将其存储到数据库中。不同的解析方式适用于不同的场景,需要根据实际情况进行选择。