1.schema约束
***dtd语法:<!ElEMENT 元素名称 约束>
***schema符合xml的语法,xml结构
***一个xml中,只有一个dtd,可以有多个schema使用命名空间进行区分(类似于java包名)
***dtd中有PCDATA类型,但是在schema里面可以支持更多的数据类型
----比如,年龄只能是参数,在schema可以直接定义一个整数类型
***schema语法复杂,目前不能替代dtd,两种并行使用
2schema快速入门
****创建一个schema文件 后缀名 .xsd
***根节点<schema></schema>
*****在一个schema里面
***属性:
xmlns="http://www.w3.org/2001/XMLSchema"
----表示当前xml文件是一个约束文件
targetNamespace="http://www.example.org/1"
----使用schema约束文件,直接通过这个地址引入这个约束文件
elementFormDefault="qualified"
<schema xmlns="http://www.w3.org/2001/XMLSchema" //约束文件
targetNamespace="http://www.example.org/1" //引入约束文件使用这个地址,url地址,一边重复
elementFormDefault="qualified"> //元素质量
步骤:
(1)看xml中有多少个元素
<element>
(2)看简单元素和复合元素
**复杂元素
<element name="person">
<complexType>
<sequence>
子元素
</sequence>
</complexType>
</element>
(3)简单元素写在复杂元素的里面
<element name="person">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
(4)在被约束文件(xml文件)里面引入约束文件
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" //表示xnl是被约束文件
xmlns="http://www.example.org/1" //是约束文档里面targetNamespace
xsi:schemaLocation="http://www.example.org/1 1.xsd" //targetNameSpace+空格+约束文件路径
>
***<sequence>:表示元素出现的顺序
***<all>:表示元素只能出现一次
***<chioce>:元素只能出现其中的一个如name或则age
***maxOccurs="unbounded":表示元素可以出现无数次
***<any></any>:表示任意元素
***可以约束属性
***写在复杂元素里面
***写在</complexType>之前
<attribute name="id1" type="int" use="required"></attribute>
</complexType>
-- name:属性名称
-- type:属性类型
-- use:熟悉是否必须出现 required必须出现
*******引入多个schema文件,可以给schema文件起个别名
*******如果使用department的约束,使用department的别名即<dept:name></dept:name>
3.sax解析的原理
****解析xml有两种技术dom和sax
****根据xml的层级结构在内存中分配一个树形结构
*****把xml中的标签,属性,文本封装成对象
****sax方式:事件驱动,边读边解析
****在javax.xml.parsers包里面
****SAXParser
此类的实例可以从SAXParserFactory.newSAXParser()方法获得
***两个参数
***第一个参数,xml的路径
***事件处理器
****SAXParserFactory
实例newInstance()方法得到
*****当解析到开始标签的时候,自动执行startElement方法
*****当解析到文本时候,自动执行character方法
*****当解析到结束标签时候,自动执行endElement方法
4.使用jaxp的sax方式解析xml
***sax的方式不能做增删改的操作,只能查询
***打印出整个文档
****执行Parser方法,第一个参数是xml的路径,第二个参数是事件处理器
***创建一个类,继承事件驱动的类
****重写里面的三个方法
*****获取所有的name元素的值
***定义一个成员变量flag=false;
***判断开始的方法是否是name元素,如果是name元素,把flag设置为true
****如果falg的值是true,在characters方法里面打印内容
****当执行到结束的方法时候,把flag值设置成false
//打印p1.xml的内容
class MyDefault1 extends DefaultHandler{
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
System.out.print("<"+qName+">");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
System.out.print(new String(ch,start,length));
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
System.out.print("</"+qName+">");
}
}
public class TestSax {
public static void main(String[] args) throws Exception, Exception {
/**1.创建解析器工厂
* 2.创建解析器
* 3.执行parse方法
*
* 4.自己创建一个类,继承DefaultHandler
* 5.重写里面的方法
* */
//创建解析器工厂
SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
//创建解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//执行parse方法
saxParser.parse("src/p1.xml", new MyDefault1());
}
}
****获取第一个name元素的值
****定义一个成员变量index=1
***在结束方法的时候,index+1
****想要打印出第一个name元素的值
---在characters方法里面判断
---判断flag=true&&index==1,再打印内容
public class TestSax {
public static void main(String[] args) throws Exception, Exception {
/**1.创建解析器工厂
* 2.创建解析器
* 3.执行parse方法
*
* 4.自己创建一个类,继承DefaultHandler
* 5.重写里面的方法
* */
//创建解析器工厂
SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
//创建解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//执行parse方法
saxParser.parse("src/p1.xml", new MyDefault2());
}
}
//打印name标签的值
class MyDefault2 extends DefaultHandler{
Boolean flag=false;
int index=1;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
//判断qName是否是name元素
if("name".equals(qName)) {
flag=true;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
//当flag的值是true的时候,表示解析到name元素
if(flag==true&&index ==1) {
System.out.println(new String(ch,start,length));
}
}
5.使用dom4j解析xml
****dom4j:是一个组织,针对xml解析,提供dom4j解析
****dom4j不是javase的一部分,想要使用第一步需要
-----导入dom4j的jar包
----创建lib文件夹,把jar包放到lib中去,然后add to buildPath
****得到document
SAXReader saxReader=new SAXReader ()
Document document=saxReader.read();
****docuemnt的父接口是Node
***在docuemnt中找不到的方法在Node中寻找
****document里面的方法 getRootElement():获取根节点,返回Element
****Element也是一个接口,父接口是Node
---Element和Node里面方法
***getParent():获取父节点
***addElement():添加标签
6.使用dom4j查询xml
***dom4j是从上到下解析
****查询所有name元素里面的值
1.创建解析器
2.得到document
3.得到根节点
4.得到所有p1的标签
--element(qname)
***表示获取标签下面的第一个子标签
***qname:标签的名称
--elements(qname)
***获取标签下面是这个名称的所有子标签(一层)
***qname名称
--elements()
***获取标签下面的所有的子标签(一层)
5.得到name
6.得到name里面的值
public static void selectName() throws DocumentException {
/*
* 1.创建解析器
* 2.得到docuemnt
* 3.得到根节点
* 4.得到p1
* 5.得到p1下面的name
* 6.得到name里面的值
* */
//创建解析器
SAXReader reader=new SAXReader();
//得到docuemnt
Document document=reader.read("src/p1.xml");
//得到根节点
Element root = document.getRootElement();
//得到p1
List<Element> list = root.elements("p1");
//遍历list
for (Element element : list) {
//得到p1下面的name值
Element name1 = element.element("name");
//得到name中的内容
String text = name1.getText();
System.out.println(text);
}
}
***查询第一个name元素的值
/** 1.创建解析器
* 2.得到docuemnt
* 3.得到根节点
* 4.得到第一个p1元素
element("name")
* 5.得到p1下面的name* 6.得到name里面的值
* */
public static void selectSingleName() throws Exception {
/*
* 1.创建解析器
* 2.得到docuemnt
* 3.得到根节点
* 4.得到第一个p1的元素
* 5.得到第一个p1下面的name元素
* 6.得到name的值
* */
//* 1.创建解析器
//* 2.得到docuemnt
//* 3.得到根节点
SAXReader reader=new SAXReader();
Document document = reader.read("src/p1.xml");
Element root = document.getRootElement();
//得到第一个p1的元素
Element p1 = root.element("p1");
//得到第一个p1下面的name元素
Element name = p1.element("name");
//得到name的值
String text = name.getText();
System.out.println(text);
}
****获取第二个name元素的值
/*
* 1.创建解析器
* 2.得到docuemnt
* 3.得到根节点
* 4.得到所有的p1
* 5.遍历得到第二个p1
* 6.得到第二个p1下面的name
* 7.得到name的值
* */
public static void selectSecondName() throws Exception {
/*
* 1.创建解析器
* 2.得到docuemnt
* 3.得到根节点
* 4.得到所有的p1
* 5.遍历得到第二个p1
* 6.得到第二个p1下面的name
* 7.得到name的值
* */
//创建解析器
SAXReader reader=new SAXReader();
//得到docuemnt
Document document = reader.read("src/p1.xml");
//得到根节点
Element root = document.getRootElement();
//得到所有的p1
List<Element> list = root.elements();
//遍历得到第二个p1 list集合下标是从0开始的
Element p2 = list.get(1);
//得到第二个p1下面的name
Element name2 = p2.element("name");
//得到name的值
String text = name2.getText();
System.out.println(text);
}
7.使用dom4j实现添加操作
*****在第一个p1的末尾添加一个元素<sex>nv</sex>
//添加元素
public static void addSex() throws Exception {
/*
* 1.创建解析器
* 2.得到docuemnt
* 3.得到根节点
* 4.获取到第一个p1
* 5.在p1下面添加sex
* 6.在添加完成的sex下面添加文本
* 7.回写xml操作
* */
//创建解析器
SAXReader reader=new SAXReader();
//得到docuemnt
Document document = reader.read("src/p1.xml");
//得到根节点
Element root = document.getRootElement();
//获取到第一个p1
Element p1 = root.element("p1");
//在p1下面添加sex元素
Element sex1 = p1.addElement("sex");
//在添加完成的sex下面添加文本
sex1.addText("女");
//回写xml操作
OutputFormat outputFormat=OutputFormat.createPrettyPrint();
XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/p1.xml"), outputFormat);
xmlWriter.write(document);
xmlWriter.close();
}
****回写操作
1.格式化
2.new一个XMLWrite类 第一个参数是xml的文件路径,第二个参数是格式话的值
3.写入操作注意docuemnt没有“”
4.关闭流操作
6.在特定的位置添加元素
****在第一个p1下面的age标签之前添加<school>zzu.edu.cn</school>
//在age之前添加元素
public static void addAgeBefor() throws Exception {
/*
* 1.创建解析器
* 2.得到docuemnt
* 3.得到根节点
* 4.获取到第一个p1
*
* 5.获取p1下面的所有元素
* 需要创建一个school标签
* elements();返回的list集合
* 使用list里面的方法,在特定的元素添加方法
* add(index,E element) index是下标,element是元素
* 6.回写xml
*
* */
//创建解析器
SAXReader reader=new SAXReader();
//得到docuemnt
Document document = reader.read("src/p1.xml");
//得到根节点
Element root = document.getRootElement();
//获取到第一个p1
Element p1 = root.element("p1");
//获取p1下面的所有元素
List<Element> list = p1.elements();
//创建school标签
Element school = DocumentHelper.createElement("school");
//在school下面创建文本
school.addText("zzu.edu.cn");
list.add(1, school);
//回写xml
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/p1.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
}
9使用dom4j实现修改节点的操作
****修改第一个p1下面的age元素的值
public class Dom4jUtils { //封装操作
public static String path="src/p1.xml";
// 返回document封装
public static Document getDocument(String path) throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(path);
return document;
}
//封装回写操作
public static void xmlWriters(String path,Document document) throws Exception, FileNotFoundException {
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter xmlWriter=new XMLWriter(new FileOutputStream(path), format);
xmlWriter.write(document);
xmlWriter.close();
public static void modifyAge() throws Exception {
/*1.得到document
* 2.得到第一个p1元素
* 3.得到p1下面的age
* 4.修改age的值
* 5.回写xml
* */
Document document = Dom4jUtils.getDocument(Dom4jUtils.path);
Element root = document.getRootElement();
Element p1 = root.element("p1");
Element age = p1.element("age");
//修改age的值
age.setText("30");
//回写xml
Dom4jUtils.xmlWriters(Dom4jUtils.path, document);
}
10.使用dom4j删除节点操作
//删除节点操作
public static void delete() throws Exception{
/*1.得到document
* 2.得到根节点
* 3.得到第一个p1标签
* 4.得到p1下面的school标签
* 5.删除(使用p1来删除school标签)
* 6.回写xml
* */
Document document = Dom4jUtils.getDocument(Dom4jUtils.path); //看上面的封装类
Element root = document.getRootElement();
//得到第一个p1标签
Element p1 = root.element("p1");
//得到p1下面的school标签
Element school = p1.element("school");
//删除(使用p1来删除school标签)
//school.getParent();//获取到school的父节点p1
p1.remove(school);
//回写xml
Dom4jUtils.xmlWriters(Dom4jUtils.path, document); //看上面的封装类
}
*****父节点调用remove()方法来删除子节点
11.使用dom4j获取属性的操作
//获取p1中的属性id1的值
public static void getId() throws Exception {
/*1.获取document
* 2.得到根节点
* 3.得到第一个p1
* 4.得到p1的属性值
* 注意查询不需要回写
* */
//获取document
Document document = Dom4jUtils.getDocument(Dom4jUtils.path);
//得到根节点
Element root = document.getRootElement();
//得到第一个p1
Element p1 = root.element("p1");
//得到p1的属性值
String value = p1.attributeValue("id1");
System.out.println(value);
}
*****注意:实现查询操作不需要回写xml
查询属性使用attributevalue
12.使用dom4j支持xpath的操作
*****可以直接获取元素
*****第一种形式
/AAA/DDD/BBB:表示一层一层的,AAA下面DDD下面的BBB
****第二种形式
//BBB:表示得到所有的BBB
****第三种形式
/*:表示所有的形式
****第四种形式
***BBB[1]:表示第一个BBB元素
***BBB[last()]:表示最后一个BBB元素
*****第五种形式
**//BBB[@id]:表示id中有属性就给得到
*****第六种形式
**//BBB[@id='b1']:表示元素名称是BBB,在BBB上面有id的属性,并且属性值是b1
13.使用dom4j支持xpath具体操作
****默认的情况下,dom4j不支持xpath
*****如果想要在dom4j中使用xpath
***第一步导入jar包
****在dom4j里面提供了两个方法,用来支持xpath
----selectNodes("xpath表达式"):获取多个节点
----selectsingleNode(“xpath表达式”):获取单一节点
*****查询p1.xml中所有name元素的值
---//name:属于name元素的表示
---selectNodes():得到多个name的值
//查询p1.xml中所有name元素的值
public static void test1() throws Exception {
/*1.得到document
* 2.查询selectNodes(“//name”)方法得到所有name元素
* */
//得到document
Document document = Dom4jUtils.getDocument(Dom4jUtils.path);
//查询selectNodes(“//name”)方法得到所有name元素
List<Node> list = document.selectNodes("//name");
//遍历list集合
for (Node node : list) {
String text = node.getText();
System.out.println(text);
}
}
****使用xpath实现:获取第一个p1下面的name的值
---//p1[@id1='aaaa']/name
public static void test2() throws Exception{
/*1.得到document
* 2.直接使用selectSingleNode方法实现
* xpath://p1[@id1='aaa']/name
* */
//得到document
Document document = Dom4jUtils.getDocument(Dom4jUtils.path);
//直接使用selectSingleNode方法实现
Node name = document.selectSingleNode("//p1[@id1='aaa']/name");
String text = name.getText();
System.out.println(text);
}
14.实现简单得到学生管理系统
****使用xml当作数据库,存储学生信息
***创建xml文件,写一些学生信息
***增加操作
/*1.创建解析器
* 2.得到docuemnt
* 3.获取到根节点
* 4.在根节点上面获取到stu标签
* 5.在stu上面依次添加id,name,age
***addElement()
* 6.在id,name,age上添加值
****setText()
* 7.回写xml* **/
//增加
public static void addStu(Student student) throws Exception {
/*1.创建解析器
* 2.得到docuemnt
* 3.获取到根节点
* 4.在根节点上面获取到stu标签
* 5.在stu上面依次添加id,name,age
* 6.在id,name,age上添加值
* 7.回写xml
* **/
//创建解析器
SAXReader saxReader=new SAXReader();
//得到docuemnt
Document document = saxReader.read("src/student.xml");
//获取到根节点
Element root = document.getRootElement();
//在根节点上面获取到stu标签
Element stu = root.addElement("stu");
//在stu上面依次添加id,name,age
Element id1 = stu.addElement("id");
Element name1 = stu.addElement("name");
Element age1 = stu.addElement("age");
//在id,name,age上添加值
id1.setText(student.getId());
name1.setText(student.getName());
age1.setText(student.getAge());
//回写xml
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter xmlWriter=new XMLWriter(new FileWriter("src/student.xml") , format);
xmlWriter.write(document);
xmlWriter.close();
}
*****删除操作
/*1.创建解析器
* 2.得到document
*
* 3.获取到所有的id
* //id
* 4.遍历list集合
* 5.判断集合中的id和传进来的id是否相同
* 6.如果相同删除该id的父节点stu
* */
//删除(根据学生的id删除)
public static void delStu(String id) throws Exception {
/*1.创建解析器
* 2.得到document
*
* 3.获取到所有的id
* //id
* 4.遍历list集合
* 5.判断集合中的id和传进来的id是否相同
* 6.如果相同删除该id的父节点stu
* */
//创建解析器
SAXReader saxReader=new SAXReader();
//得到document
Document document = saxReader.read("src/student.xml");
//获取到所有的id
List<Node> list = document.selectNodes("//id");
//遍历
for (Node node : list) {
//得到id的值
String idv = node.getText();
//判断id是否相同
if(idv.equals(id)) {
Element stu = node.getParent();
//得到stu的父节点
Element student = stu.getParent();
//删除stu
student.remove(stu);
}
//回写xml
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/student.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
}
}
****查询操作
/*1.创建解析器
* 2.得到document
* 3.获取到所有id
* 4.返回id的集合,遍历list集合
* 5.得到每个id的节点
* 6.id节点的值
* 7.判断id的值和传递id的值是否相同
* 8.如果相同先获取到id的父节点stu
* 9.通过stu获取到name和age的值
* **/
//查询(根据id查询学生信息)
public static Student selectStu(String id) throws Exception {
/*1.创建解析器
* 2.得到document
* 3.获取到所有id
* 4.返回id的集合,遍历list集合
* 5.得到每个id的节点
* 6.id节点的值
* 7.判断id的值和传递id的值是否相同
* 8.如果相同先获取到id的父节点stu
* 9.通过stu获取到name和age的值
* **/
//创建student对象
Student student=new Student();
//创建解析器
SAXReader saxReader=new SAXReader();
//得到document
Document document = saxReader.read("src/student.xml");
//获取到所有id
List<Node> list = document.selectNodes("//id");
//得到每个id的节点
for (Node node : list) { //node是每个id的节点
String idv = node.getText();
if(idv.equals(id)) {
//得到id的父节点stu
Element stu = node.getParent();
//通过stu获取name和age的值
String namev = stu.element("name").getText();
String agev = stu.element("age").getText();
student.setId(id);
student.setName(namev);
student.setAge(agev);
}
}
return student;
}
--------------------------------全部代码如下--------------------------------
-----student.xml文件-------
<?xml version="1.0" encoding="UTF-8"?>
<student>
<stu>
<id>100</id>
<name>zhangsan</name>
<age>20</age>
</stu>
<stu>
<id>101</id>
<name>lisi</name>
<age>30</age>
</stu>
</student>
------student实体类---------
package cn.itcast.vo;
public class Student {
private String id;
private String name;
private String age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
-------实际的逻辑处理StuService类---------
package cn.itcast.service;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import cn.itcast.vo.Student;
public class StuService {
//增加
public static void addStu(Student student) throws Exception {
/*1.创建解析器
* 2.得到docuemnt
* 3.获取到根节点
* 4.在根节点上面获取到stu标签
* 5.在stu上面依次添加id,name,age
* 6.在id,name,age上添加值
* 7.回写xml
* **/
//创建解析器
SAXReader saxReader=new SAXReader();
//得到docuemnt
Document document = saxReader.read("src/student.xml");
//获取到根节点
Element root = document.getRootElement();
//在根节点上面获取到stu标签
Element stu = root.addElement("stu");
//在stu上面依次添加id,name,age
Element id1 = stu.addElement("id");
Element name1 = stu.addElement("name");
Element age1 = stu.addElement("age");
//在id,name,age上添加值
id1.setText(student.getId());
name1.setText(student.getName());
age1.setText(student.getAge());
//回写xml
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter xmlWriter=new XMLWriter(new FileWriter("src/student.xml") , format);
xmlWriter.write(document);
xmlWriter.close();
}
//删除(根据学生的id删除)
public static void delStu(String id) throws Exception {
/*1.创建解析器
* 2.得到document
*
* 3.获取到所有的id
* //id
* 4.遍历list集合
* 5.判断集合中的id和传进来的id是否相同
* 6.如果相同删除该id的父节点stu
* */
//创建解析器
SAXReader saxReader=new SAXReader();
//得到document
Document document = saxReader.read("src/student.xml");
//获取到所有的id
List<Node> list = document.selectNodes("//id");
//遍历
for (Node node : list) {
//得到id的值
String idv = node.getText();
//判断id是否相同
if(idv.equals(id)) {
Element stu = node.getParent();
//得到stu的父节点
Element student = stu.getParent();
//删除stu
student.remove(stu);
}
//回写xml
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/student.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
}
}
//查询(根据id查询学生信息)
public static Student selectStu(String id) throws Exception {
/*1.创建解析器
* 2.得到document
* 3.获取到所有id
* 4.返回id的集合,遍历list集合
* 5.得到每个id的节点
* 6.id节点的值
* 7.判断id的值和传递id的值是否相同
* 8.如果相同先获取到id的父节点stu
* 9.通过stu获取到name和age的值
* **/
//创建student对象
Student student=new Student();
//创建解析器
SAXReader saxReader=new SAXReader();
//得到document
Document document = saxReader.read("src/student.xml");
//获取到所有id
List<Node> list = document.selectNodes("//id");
//得到每个id的节点
for (Node node : list) { //node是每个id的节点
String idv = node.getText();
if(idv.equals(id)) {
//得到id的父节点stu
Element stu = node.getParent();
//通过stu获取name和age的值
String namev = stu.element("name").getText();
String agev = stu.element("age").getText();
student.setId(id);
student.setName(namev);
student.setAge(agev);
}
}
return student;
}
}
----------------测试类TestStu------------
package cn.itcast.test;
import cn.itcast.service.StuService;
import cn.itcast.vo.Student;
public class TestStu {
public static void main(String[] args) throws Exception {
//addTest();
//delTest();
seleTest();
}
//测试添加
public static void addTest() throws Exception {
Student student=new Student();
student.setId("102");
student.setName("wangwu");
student.setAge("40");
StuService.addStu(student);
}
//测试删除
public static void delTest() throws Exception {
StuService.delStu("102");
}
//测试查询
public static void seleTest() throws Exception {
Student student = StuService.selectStu("100");
System.out.println(student.toString());
}
}