黑马程序员技术交流社区

标题: 【石家庄校区】XML~~~数据库 [打印本页]

作者: 人贵自知    时间: 2018-1-11 15:48
标题: 【石家庄校区】XML~~~数据库
本帖最后由 小石姐姐 于 2018-1-12 11:13 编辑

XML
在后期作为一个配置文件使用.一般情况下参照文档去写.
枚举.映射.可扩展性,可维护性.
xml概述:
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/3c3ea65635ec4f2d9342ab61a808a40f/clipboard.png
xml出了描述复杂的数据以外,还可以作为配置文件使用.
特点:没有预定义表桥,所使用的标签都需要用户自定义.
作用:        
用于描述数据,而非显示数据.
擅长表示一对多的,包含嵌套的数据关系.
应用场景:
作为数据载体,通过网络传递数据
作为应用程序的配置文件
标签:
Tag,也叫做'元素(element)'
格式
<person></person> : 开始便签和结束标签 , 包含表前体
<name /> : 自封闭标签,不包含标签体
XML文件
以.xml结尾
文档声明(实际上属于处理指令)
必须出现在文档的第一行
元素(即标签)
包含标签体
<Student><name></name><age>18</age></Student>子标签完善父标签
不包含标签体
<Student name="zhangsan" age="18" />
一个xml只能有一个根标签
可以包含字母 , 数字 , 减号 , 下划线 , 英文据点 .但必须遵守下面规则
1.严格区分大小写 2.不能以xml开头 3 , 只能以字母或者下划线开头 4,不能插入空格和制表符 5 , 不能插入冒号.
元素中的属性名不能重复
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/c84895c60ff64a1caa175d387fa0ba19/clipboard.png
标注的写法习惯性的就不写</student> 直接写成<student name="zhangsan" age="18"/>
元素的属性
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/4627dc541ac74220bb7a9d8789e0cf4c/clipboard.png

注释
XML声明之前不能有注释
注释不能嵌套
CDATA区
CDATA区的内容只会被当做普通字符串解析 , 即使有标签也不会被解析
处理指令了解一下
特殊字符
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/82af010889d24f389fbaab1cd92dc81d/clipboard.png
处理指令(PI
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/86fc46bebd7f43c5b6e7f441a0682fc2/clipboard.png
:)
DTD约束
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/e5c656b40a1142a7a15dcaccf1cac3e2/clipboard.png
约束例子
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/16099613f29c41ab83c4e7ca073f2470/clipboard.png
声明了一个根标签  书架, (数量)
声明了一本书
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/dfefe717d6a04ec9b203e3abb5fa26e8/clipboard.png
<!DOCTYPE 书架 SYSTEM "book.dtd">
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/5f151872e4e940b2a55ceaac807597a7/clipboard.png
Schema
,xsd --- xml schema document
XML Schema 通常称之为模式文档(约束文档)   对应的xml为实例文档.
xmlns = xml namespace(名称空间)
解析:把xml中的信息提取出来
DOM解析:Document Object
将整棵树一口气加载到内存当中,我们可以方便的操作任意的标签和属性,
但是当这棵树特别大的时候就会出现内存溢出的问题
SAX解析:(第三方开源解析器)
节点: 标签,属性,文本甚至是换行都称之为节点
一个节点一个节点的开始解析
由于一个节点一个节点的进行解析,不能出现溢出,但是不能随意获取节点.需要一个一个的进行解析
如何使用Java解析XML
XML解析开发包:
JAXP:实现DOM和SAX两种
Dom4J:是开源组织推出的解析开发包.Dom for java
Log4J:是一款和日志有关的.         
Document
Element getRootElement()
Element
List elements() : 获取所有的子元素
List elements(String name):根据指定的元素名称来获取相应的子元素对象
Element element(String name) 根据指定的元素名称获取一个子元素对象
String elementText(String name) : 根据指定的元素名称,来获取子元素中的文本
String getText() : 获取当前元素对象的文本
void setText(String text) : 设置当前元素对象的文本
String attributeValue(String name) : 根据指定的属性名称获取其对应的值
public Element addAttribute(String name, String value)
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/d2c5c6126a6b48e7a543d5d1b70f1c96/clipboard.png
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/43ef6c4ba7834da79684c7bef88c3532/clipboard.png

-------------------------------------------------------

* `org.dom4j.io.SAXReader`类: SAX解析器
        * 构造方法:
                * `SAXReader()`: 创建一个SAX解析器
        * 成员方法:
                * `Document        read(String systemId)`: 读取XML文件, 返回一个Document对象
* `org.dom4j.io.OutputFormat`类: 配置XML输出格式
        * `static OutputFormat createPrettyPrint()`: 创建一个用户输出美观格式的OutputFormat对象
        * `void        setEncoding(String encoding)`: 设置字符集
* `org.dom4j.io.XMLWriter`类: 用于向XML中写入数据的输出流
        * 构造方法:
                * `XMLWriter(OutputStream out)`: 使用字节流创建一个XMLWriter对象
        * 成员方法:
                * `void        write(Document doc)`: 将Document对象中的数据写入到XML文件
* `org.dom4j.Document`接口: 代表一个XML文档
        * `Element getRootElement()`: 获取根元素对象. 需要用根元素获取其他子元素
* `org.dom4j.Element`接口: 代表一个元素
        * 获取元素信息
                * `String getName()`: 获取元素名
        * 元素增删改查
                * 获取元素
                        * `List<Element> elements()`: 获取调用元素对象的所有子元素
                        * `List<Element> elements(String name)`: 获取所有的指定名称的子元素
                        * `Element element(String name)`: 获取第一个该名称的子元素对象
                        * `Element getParent()`: 获取当前元素的父元素对象
                * 添加元素
                        * `Element addElement(String elementName)`: 在当前元素下添加指定名称的子元素
                * 删除元素
                        * `boolean remove(Element child)`: 删除子元素
        * 操作元素中的文本
                * `String elementText(String name)`: 获取第一个该名称的子元素的文本内容
                * `String getText()`: 获取当前元素对象的文本
                * `void setText(String text)`: 设置当前元素对象的文本
        * 操作元素的属性
                * `String attributeValue(String name)`: 根据指定的属性名获取属性值
                * `Element addAttribute(String name, String value)`: 添加或修改指定属性名的属性值
* `org.dom4j.DocumentHelper`类:
        * `static Element createElement(String name)`: 使用指定名称作为元素名, 创建一个元素对象
数据库
DMSD = Datebase Management System .(数据库管理系统)
存储数据的创库本质也是一个文件系统,按照特定的格式存储数据,用户可以对数据进行增删改查.
数据管理系统(MySql)---直接和我们打交道的
MYSQL ; (***常用***)免费开源数据库,小型数据库被Oracle收购了.Mysql6.x版本开始收费
Cracle : (***常用***)收费的大型数据库 , Oracle收购了SUN公司
DB2 : IBM出品收费数据库 , 一般大型国企, 银行 , 政府部门.
SQlServer : 微软出品收费数据库  C# ,  .NET使用
SyBase : 已经淡出历史舞台, 建模数据的工具 PowerDesigner
SQLite  : 嵌入式小型数据库. 移动设备 , 机顶盒 , 安卓手机就是使用这个
* 记住关系:
    * 数据库程序有数据库
    * 数据库中有表
    * 表中有记录
    * 数据库程序 > 库 > 表 > 记录
对应关系有什么用
    * 有了这种映射关系, 以后我们会直接通过特殊的方式将JavaBean的各个属性一一对应存入数据库
    * 我们在设计表时, 也会参考这种面向对象的方式, 设计表的字段(也就是事物的属性)
扩展: 目前数据库分类
关系型数据库
*MySQL , Oracle
非关系型数据库
*MongBo
MySQL数据库 , 服务器
用户通过---数据管理系统(DBMS, 操作数据库, 就是MySQL)---在数据仓库中创建自己的---数据库(库)---,而真正存储数据的不是数据库, 是数据库中的---表---.数据(记录).
数据表 -->  类                                   表中每行数据
列 - > 类字段 , 成员变量                     new Cloth("A001","杂牌");
记录1--> 类的对象1
记录2-->累的对象2

public class cloth(){
String number;
String name;
}
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/93399b1442cd42b4beab30fd1c5c62ec/clipboard.png
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/abd9a9fe7c0746cc9f1bfeb3fef5853a/clipboard.png
win + r --> services.msc -- > net start mysql --> net stop mysql
GUI界面  : SQLyog , Novicat  , sequle pro
命令行登陆mysql的两种方法:
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/bcd9d8e10e0e4d2389d44e7e6319fd06/clipboard.png
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/f8e47e72191c4da5b72a5c2382853c88/clipboard.png
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/7bbf238d56a644ffb2dda95037634275/clipboard.png
SQLyog   (MySQL的图形化工具, 不用再命令台编写 , 可以再SQLyog中编写)
## SQL语句介绍和分类   按照作用分类
* DDL: Data Defination Language, 数据定义语言, 用来定义数据库对象(库, 表等)
        * `CREATE`
        * `ALTER`
        * `DROP`
    * DML: Data Manipulation Language, 数据操作语言, 对表中的记录进行增, 删, 改
        * `INSERT`
        * `DELETE`
        * `UPDATE`
    * DQL: Data Query Language, 数据查询语言, 对表中的记录进行查
        * `SELECT`
        * `FROM`
        * `WHERE`
    * DCL: Data Control Language, 数据控制语言, 创建修改用户, 权限
SQL语法特点
SQL 语句不区分大小写(默认情况下数据也不区分大小写, 但可以设置)
但按照惯例SQL关键字用大写 ; 数据库名 , 表明 , 字段名等用小写 , 这样便于阅读
一条SQL 语句可以单行或者多行书写 , 一条语句的结尾必须用 " ; "
字符串和日期要使用单引号或者双引号包裹 ,  推荐使用单引号 .
注释:
空格+#+注释
/**/
通用语法
int
double
varchar(可变字符串型 -- 长度可变):最大200个, 根据实际存入的字符长度大小来开辟空间,有计算参与,占用内存 , 但节省空间
char 不可变长度,
data
扩展: 除此之外常用的日期时间类型还有如下:
            * `TIME`: 时间类型, `HH:mm:ss`格式的字符串
            * `DATETIME`: 日期时间类型, `yyyy-MM-dd HH:mm:ss`格式的字符串. 如果没有指定值则默认值是null
            * `TIMESTAMP`: 时间戳类型, `yyyy-MM-dd HH:mm:ss`格式的字符串. 如果没有指定值则默认值是当前系统时间*
* CHAR和VARCHAR的区别
VARCHAR(200), 可变长度字符, 存储占用的内存空间是可变的, 如果实际数据容量小于指定的字符长度大小, 那么就会按照实际的字符数来开辟内存大小
            * 优点: 节省内存
            * 缺点: 因为每次存入数据时都会判断数据的实际大小, 来动态修改内存空间, 所以需要占用资源, 效率低
        * CHAR(200), 固定长度字符, 存储占用的内存空间是不可变的. 无论实际存入的数据容量是多大, 都占用这么大的空间
            * 优点: 插入数据时不需要额外操作, 效率高
            * 缺点: 可能会浪费空间
1.创建数据库
格式:
create database 数据库名:默认使用安装MySQL时设置的UTF-8编码
create database 数据库名  CREATE DATABASE 库名 CHARACTER SET '字符集';`
show databases 查看所有数据库
drop database 数据库名  删除指定库名
use 数据库名
创建数据库同时指定字符集和字符校对规则:
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/5de527ccc8494153b577860a0c34bb98/clipboard.png

  * `CREATE DATABASE 库名 CHARACTER SET '字符集' COLLATE '校对规则';`
            * 校对规则可以指定是否区分大小写字母, `SHOW COLLATION LIKE 'utf8%';`可以查看支持的校对规则, 其中`-ci`表示CASE INSENSITIVE, 即大小写不敏感
            * 默认是`utf8_general_ci`, 若要大小写敏感可以修改为`utf8_bin`
sql :
create table 表名(
列名 数据类型(长度) 约束,
列明2 数据类型(长度) 约束,
.....
列明n 数据类型(长度) 约束
);
// VARCHAR和CHAR一般需要手动指定长度, 日期数字等其他类型有默认长度一般不需要指定
* 约束:
        * constraint
        * 作用: 就是对列中记录的值进行限制, 如果插入的数据不符合约束规则, 则该操作会被立刻终止
* 扩展:
        * 约束的种类:
                * **主键约束**: `PRIMARY KEY`, 限制该列的记录值不能为空不且唯一(能重复), 相当于同时设定了`NOT NULL`和`UNIQUE`
                * **自增约束**: `AUTO_INCREMENT`, 设置该列的记录值可以自动增加
                        * 默认从几开始? 1
                        * 能用于什么类型? 只能用于数字类型(如INT, DOUBLE, 小数1.23自增后是2)
                * 外键约束: `FOREIGN KEY`, 主要是连接另一个表的主键
                * 非空约束: `NOT NULL`, 限制该列的记录值不能为空
                * 唯一约束: `UNIQUE`, 唯一, 限制该列的记录值不能重复
                * 检查约束: `CHECK (条件)`, 限制该列插入的记录值是否符合要求
                * 默认值约束: `DEFAULT 值`, 限制该列记录如果没有插入值, 则使用默认值
SQL代码的保存
* 列出当前数据库的所有表
        * `SHOW TABLES;`
* 查看表的结构
        * `DESC 表名;`: desc=description描述
* 删除表
        * `DROP TABLE 表名;`

* 修改表的结构
        * 格式: `ALTER TABLE 表名 操作关键字 列名 数据类型 约束;`
                * 操作关键字
                        * `ADD`: 增加列.
                                * `ALTER TABLE 表名 ADD 新列名 数据类型 约束;`
                        * `MODIFY`: 修改指定列的数据类型和约束(不能修改列名).
                                * `ALTER TABLE 表名 MODIFY 要修改的列名(不能修改列名) 新数据类型 新约束;`
                        * `CHANGE`: 修改指定列的列名+数据类型+约束.
                                * `ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型 新约束;`
                        * `DROP`: 删除列.
                                * `ALTER TABLE 表名 DROP 列名;`
* 修改表名
        * 格式: `RENAME TABLE 旧表名 TO 新表名;`
数据(记录)
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/21395eb5619a4c57a94feb4fa2917aaa/clipboard.png
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/b2b04cc5fda243a488112ed05cd33abf/clipboard.png

delete from 不能删除自增计数器计数过的 ,再次添加会继续添加.
修改:
命令台乱码问题
命令台默认的是windows默认的字符集 GBK, 而数据库装的时候选择的是utf-8
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/6eff6a1aea5f4b999a5b0e83c883e761/clipboard.png

C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/d5d13a2b81aa4960aa38dd34d39f9d23/clipboard.png
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/ed2271be92dc48daa6e87fed3efaeba1/clipboard.png
## 命令行乱码问题
* 乱码原因: 存入记录的字符编码和数据库编码不一致, windows的cmd是GBK编码, 而数据库是utf-8编码
* 临时方法:
```sql
# 将数据库数据修改为Windows的GBK
SET NAMES 'GBK';  
## 数据表添加记录: 其他格式
```sql
INSERT INTO 表名
(非自增列名1, 非自增列名2, ..., 非自增列名n)
VALUES
(值1, 值2, ..., 值n);
* 插入记录格式3: 不指定列名, 给所有列添加值
    * 不指定列名, 为所有列添加值
    * 该方式适用于为所有列添加值, 可以省去写列名. 但**不能省略主键**
```sql
INSERT INTO 表名
VALUES
(值1, 值2,...,值n);
```
* 批量插入记录:
    * 适用于批量插入记录
```sql
INSERT INTO 表名
(列1, 列2)
VALUES
(记录1值1, 记录1值2),
(记录2值1, 记录2值2);
INSERT INTO 表名
VALUES
(记录1值1, 记录1值2),
(记录2值1, 记录2值2);
基本查询
# 查询指定字段
SELECT 列名1, 列名2 FROM 表名;
# 查询所有字段
SELECT * FROM 表名;
# DISTINCT去重
SELECT DISTINCT 列名1, 列名2 FROM 表名;
# AS给字段取别名
SELECT 列名 AS 别名 FROM 表名;
# 对查询结果进行数学计算
SELECT 列名+值 FROM 表名;
注意:
    * 插入记录能从中间插入吗? 都是从最后插入的, 只是排序不同
    * 如果删除一条记录, 导致自增的id中间断号, 有问题吗? 没问题, 如果想补可以补上
https://github.com/search?l=Java&q=%E8%B7%B3%E4%B8%80%E8%B7%B3&type=Repositories&utf8=%E2%9C%93
## 更新记录(修改记录)
* 更新记录语句(修改记录中的值)
```sql
# 语法
UPDATE 表名 SET
列名1 = 新值,
列名2 = 新值;
# 修改指定条件的记录
UPDATE 表名 SET
列名1 = 新值, 列名2 = 新值
WHERE 条件;
```
* 更新(修改)指定的记录
    * 如果不加`WHERE`条件, 则所有数据都会被修改
* 扩展:
    * WHERE: 条件子句
        * 作用: 筛选符合条件的结果, 然后对这些结果进行操作









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2