数据库编程

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语句

  1. // 创建Statement对象
  2. Statement stmt = connection.createStatement();
  1. // 发送Insert语句
  2. int count = stmt.executeUpdate("INSERT INTO users(username, password) VALUES ('lily', 'lily123')");
  1. // 发送查询SQL语句
  2. ResultSet rs = stmt.executeQuery("SELECT id, username, password FROM users");

4)处理结果

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

5)释放资源

  1. try {
  2. if (rs != null)
  3. rs.close();
  4. if (stmt != null)
  5. stmt.close();
  6. if (connection != null)
  7. connection.close();
  8. } catch (SQLException e) {
  9. e.printStackTrace();
  10. }

关于PreparedStatement  

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

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

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

连接到数据库

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

  2)使用DataSource类的getConnection();

  1. /**
  2. * 加载配置文件中JDBC连接所需要数据
  3. */
  4. private static void loadProperties() {
  5. InputStream in = Thread.currentThread().getClass()
  6. .getResourceAsStream("/jdbc.properties");
  7. Properties prop = new Properties();
  8. try {
  9. prop.load(in);
  10. } catch (IOException e) {
  11. throw new RuntimeException(e);
  12. }
  13. driver = prop.getProperty("driver");
  14. url = prop.getProperty("url");
  15. user = prop.getProperty("user");
  16. password = prop.getProperty("password");
  17. }
  1. /* 通过静态代码块加载数据库驱动 */
  2. static {
  3. loadProperties(); // 读取配置文件
  4. try {
  5. Class.forName(driver); // 加载驱动
  6. } catch (ClassNotFoundException e) {
  7. throw new RuntimeException(e);
  8. }
  9. }
  1. /**
  2. * 获取连接对象
  3. *
  4. * @return 连接对象
  5. * @throws SQLException
  6. * 无法建立连接,则抛出异常
  7. */
  8. public static Connection getConnection() throws SQLException {
  9. return DriverManager.getConnection(url, user, password);
  10. }

数据库会话

  1. /**
  2. * 开启会话
  3. */
  4. public void open() {
  5. if (null == conn)
  6. try {
  7. conn = JdbcResourceManager.getConnection();
  8. } catch (SQLException e) {
  9. throw new JdbcSessionException("数据库会话创建失败", e);
  10. }
  11. }
  12.  
  13. /**
  14. * 关闭数据库会话,释放资源
  15. */
  16. public void close() {
  17. try {
  18. JdbcResourceManager.close(rs);
  19. rs = null;
  20. } catch (SQLException e) {
  21. throw new JdbcSessionException("数据库会话ResultSet关闭失败", e);
  22. } finally {
  23. try {
  24. JdbcResourceManager.close(pstmt);
  25. pstmt = null;
  26. } catch (SQLException e) {
  27. throw new JdbcSessionException("数据库会话Statement关闭失败", e);
  28. } finally {
  29. try {
  30. JdbcResourceManager.close(conn);
  31. conn = null;
  32. } catch (SQLException e) {
  33. throw new JdbcSessionException("数据库会话Connection关闭失败", e);
  34. }
  35. }
  36. }
  37. }

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

  1. /**
  2. * 执行更新SQL语句
  3. *
  4. * @param sql
  5. * 更新的SQL语句,如INSERT、UPDATE、DELETE语句
  6. * @param params
  7. * 用于替换更新语句中"?"占位符的参数列表
  8. * @return 受影响行数
  9. */
  10. public int executeUpdate(String sql, Object... params) {
  11. try {
  12. pstmt = conn.prepareStatement(sql);
  13. if (null != params) {
  14. for (int i = 0; i < params.length; i++) { // 为每个?占位符设置参数
  15. pstmt.setObject(i + 1, params[i]);
  16. }
  17. }
  18. return pstmt.executeUpdate();
  19. } catch (SQLException e) {
  20. throw new JdbcSessionException("执行更新操作失败", e);
  21. }
  22. }

  用于执行SELECT语句的方法:

  1. /**
  2. * 执行查询SQL语句
  3. *
  4. * @param sql
  5. * 待执行查询的SQL语句,如 SELECT 语句
  6. * @param params
  7. * 用于替换查询语句中"?"占位符的参数列表
  8. * @return 查询结果集ResultSet对象
  9. */
  10. public ResultSet executeQuery(String sql, Object... params) {
  11. try {
  12. pstmt = conn.prepareStatement(sql);
  13. if (null != params) {
  14. for (int i = 0; i < params.length; i++) { // 为每个?占位符设置参数
  15. pstmt.setObject(i + 1, params[i]);
  16. }
  17. }
  18. return rs = pstmt.executeQuery();
  19. } catch (SQLException e) {
  20. throw new JdbcSessionException("执行查询操作失败", e);
  21. }
  22. }

JDBC之DAO模式

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

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

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

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

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

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

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

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

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

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

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

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

XML解析技术

XML概述:

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

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

  1. <mail>
  2. <from>tom</from>
  3. <to>lily</to>
  4. <detail>I will go home this weekend!</detail>
  5. </mail>

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

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

XML语法规则

  XML声明,如:

  1.     <?xml version="1.0" encoding="utf-8"?>

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

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

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

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

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

  在XML中编写注释的语法与HTML的语法很相似,都是 <!– This is a comment –>。

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

XML命名规则

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

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

DTD 

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

声明一个元素:

  <!ELEMENT 元素名称 (元素内容)>

空元素:

  <!ELEMENT 元素名称 EMPTY>

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

  <!ELEMENT 元素名称 (#PCDATA)>

带任何元素的内容:

  <!ELEMENT 元素名称 ANY>

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

 <!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>

  1. 注意:

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

  1. <!ELEMENT mail (from,to,detail)>

  1. <!ELEMENT mail (from,to,detail)>
  2. <!ELEMENT from (#PCDATA)>
  3. <!ELEMENT to (#PCDATA)>
  4. <!ELEMENT detail (#PCDATA)>
  5. 声明只出现一次的元素:  
  1.   <!ELEMENT 元素名称 (子元素名称)>
  1. 声明最少出现一次的元素:  
  1.   <!ELEMENT 元素名称 (子元素名称+)>
  1. 声明出现0次或多次的元素: 
  1.   <!ELEMENT 元素名称 (子元素名称*)>
  1. 声明出现0次或1次的元素:   
  1.   <!ELEMENT 元素名称 (子元素名称?)>
  1. 声明属性
      
    <!ATTLIST 元素名称 属性名称 属性类型 默认值>
  1. CDATA - (未解析)字符数据 

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

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

  1. <script>
  2. <![CDATA[
  3. function matchwo(a,b)
  4. {
  5. if (a < b && a < 0)
  6. return 1;
  7. else
  8. return 0;
  9. }
  10. ]]>
  11. </script>

内部的DOCTYPE声明

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE mail[
  3. <!ELEMENT mail (from,to,detail)>
  4. <!ELEMENT from (#PCDATA)>
  5. <!ELEMENT to (#PCDATA)>
  6. <!ELEMENT detail (#PCDATA)>
  7. ]>
  8. <mail>
  9. <from>tom</from>
  10. <to>lily</to>
  11. <detail>I will go home this weekend!</detail>
  12. </mail>

外部文档声明

  1. <!ELEMENT mail (from,to,detail)>
  2. <!ELEMENT from (#PCDATA)>
  3. <!ELEMENT to (#PCDATA)>
  4. <!ELEMENT detail (#PCDATA)>

XML文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE mail SYSTEM "mail.dtd">
  3. <mail>
  4. <from>tom</from>
  5. <to>lily</to>
  6. <detail>I will go home this weekend!</detail>
  7. </mail>

使用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);

  1. /**
  2. * 创建XML文件
  3. *
  4. * @throws IOException
  5. */
  6. public void createXml() throws IOException {
  7. // 创建Document对象
  8. Document document = DocumentHelper.createDocument();
  9. // 根元素节点
  10. Element root = document.addElement("students");
  11. root.addComment("all students info"); // 添加注释
  12. Element student = root.addElement("student"); // 根元素节点添加子节点
  13. student.addAttribute("id", "001"); // 添加节点属性
  14. Element name = student.addElement("name");
  15. name.addText("tommy"); // 设置节点文本
  16. Element age = student.addElement("age");
  17. age.addText("18");
  18. // 设置XML美化格式
  19. OutputFormat format = OutputFormat.createPrettyPrint();
  20. format.setEncoding("utf-8"); // 编码字符集设置
  21. // xml写入器
  22. XMLWriter writer = new XMLWriter(new FileWriter("students.xml"), format);
  23. // 写操作
  24. writer.write(document);
  25. writer.flush();
  26. writer.close();
  27. }
  1. /**
  2. * 修改xml文件
  3. *
  4. * @throws Exception
  5. */
  6. public void modifyXml() throws Exception {
  7. // 创建SAXReader对象
  8. SAXReader reader = new SAXReader();
  9. Document document = reader.read(new File("students.xml"));
  10. /** 修改内容之一: 如果student节点中id属性的内容为001,则修改成1001。因为查找节点使用到了Xpath,所以还需要将 jaxen-1.1-beta-6.jar 包添加到项目中 */
  11. List list = document.selectNodes("/students/student/@id");
  12. Iterator it = list.iterator();
  13. while (it.hasNext()) {
  14. Attribute attr = (Attribute) it.next();
  15. if ("001".equals(attr.getValue()))
  16. attr.setValue("1001");
  17. }
  18. /**
  19. * 修改内容之二: name项内容若为"tommy",则改为"tom"
  20. */
  21. list = document.selectNodes("/students/student/name");
  22. it = list.iterator();
  23. while (it.hasNext()) {
  24. Element name = (Element) it.next();
  25. if ("tommy".equals(name.getText())) {
  26. name.setText("tom");
  27. }
  28. }
  29. /** 修改内容之三: 将id="1001"的学生age节点删除,再添加birth节点 */
  30. list = document.selectNodes("/students/student/@id");
  31. it = list.iterator();
  32. while (it.hasNext()) {
  33. Attribute attr = (Attribute) it.next();
  34. if ("1001".equals(attr.getValue())) {
  35. Element parent = attr.getParent();
  36. Iterator iterator = parent.elementIterator("age");
  37. if (iterator.hasNext()) {
  38. Element elem = (Element) iterator.next();
  39. parent.remove(elem);
  40. }
  41. Element birth = parent.addElement("birth");
  42. birth.setText("1995-01-01");
  43. break;
  44. }
  45. }
  46. /* 将document中的内容写入文件中 */
  47. // 设置XML美化格式
  48. OutputFormat format = OutputFormat.createPrettyPrint();
  49. format.setEncoding("utf-8"); // 编码字符集设置
  50. // xml写入器
  51. XMLWriter writer = new XMLWriter(new FileWriter("students.xml"), format);
  52. writer.write(document);
  53. writer.close();
  54. }
  1. /**
  2. * 遍历节点
  3. *
  4. * @throws Exception
  5. */
  6. public void readXml() throws Exception {
  7. // 创建SAXReader对象
  8. SAXReader reader = new SAXReader();
  9. // 加载xml文件
  10. Document document = reader.read(new File("students.xml"));
  11. // 获取根元素节点
  12. Element root = document.getRootElement();
  13. // 递归遍历所有节点内容
  14. read(root);
  15. }
  16.  
  17. /**
  18. * 读节点信息
  19. *
  20. * @param element
  21. * student节点
  22. */
  23. private void read(Element element) {
  24. for (int i = 0, size = element.nodeCount(); i < size; i++) {
  25. Node node = element.node(i); // 获取元素的子节点
  26. if (node instanceof Comment) // 注释节点
  27. continue;
  28. if (node instanceof Element) { // 元素节点
  29. Element elem = (Element) node;
  30. System.out.print(elem.getName() + " : ");
  31. if ("student".equals(node.getName())) { // 是student节点
  32. System.out.println();
  33. Iterator attr = elem.attributes().iterator(); // student节点属性
  34. while (attr.hasNext()) {
  35. Attribute at = (Attribute) attr.next();
  36. System.out
  37. .println(at.getName() + " : " + at.getValue());
  38. }
  39. }
  40. read((Element) node);
  41. } else if (node instanceof Text) { // 文本节点
  42. if (!"".equals(node.getText().trim()))
  43. System.out.println(node.getText());
  44. }
  45. }
  46. }

XPath 简介

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

 

  

Java数据库编程、XML解析技术的更多相关文章

  1. Java数据库编程及Java XML解析技术

    1.JDBC概述 A.  什么是JDBC? Java DataBase Connectivity:是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成.通过这些类和接口 ...

  2. XML解析技术研究(一)

      摘要:XML作为过去十年中出现的最流行的技术之一,得到了广泛的应用,而其中XML解析技术是XML应用的关键.本文介绍了XML解析技术的研究动向,分析和比较了4种XML解析技术的优劣,并归纳总结了应 ...

  3. xml解析技术

    本文总结Dom,sax解析,  使用Java作为工具解析xml文档. 1 Dom 综述:Dom解析xml通常也称为xmlDom (和htmlDom技术差不多),将xml文档封装成树,好处就是xml中的 ...

  4. Android实现XML解析技术

    转载:Android实现XML解析技术 本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为 ...

  5. 一文读懂四种常见的XML解析技术

    之前的文章我们讲解了<XML系列教程之Schema技术_上海尚学堂java培训技术干货><XML的概念.特点与作用.XML申明_上海Java培训技术干货>,大家可以点击回顾一下 ...

  6. 菜鸡的Java笔记 java数据库编程(JDBC)

    java数据库编程(JDBC)        介绍 JDBC 的基本功能            content (内容)        现在几乎所有的项目开发过程之中都不可能离开数据库,所以在java ...

  7. java面向对象下:Java数据库编程

    19.Java数据库编程: JDBC概述:        JDBC(Java Database Connection)是java中提供的一套数据库编程API,它定义了一套用来访问数据库的标准Java类 ...

  8. java数据库编程——读写LOB、可滚动和可更新的结果集、元数据

    java 数据库编程 1. 读写LOB 除了数字.字符串和日期之外,许多数据库还可以存储大对象,例如图片或其它数据.在SQL中,二进制大对象称为BLOB,字符型大对象称为CLOB. 要读取LOB,需要 ...

  9. JAVA数据库编程、JAVA XML解析技术

    JDBC概述 JDBC是JAVA中提供的数据库编程API curd :数据库增删改 链接字符串:String url = "mysql :/localhost :3306/jdbc/&quo ...

随机推荐

  1. 指定为文件头部Expires要么Cache-Control

    Cache-Control :private,no-cache.must-revalidate,max-age Expires指定页面过期时间 response.setContentType(&quo ...

  2. 在Ceph创建虚拟机的过程改进分析

    作为个人学习笔记分享.有不论什么问题欢迎交流! 近期在Gerrit中看到一个change:https://review.openstack.org/#/c/94295/ , 它主要是对当前在Ceph中 ...

  3. 正确lua简单的扩展,可以加速相关C++数据。

    很早的时候,我有一件事纠结.如果,我在这里C++打开界面脚本.使用C++其中一个目标,和.我的程序有很多不同的lua虚拟机.每个虚拟机与一个关联C++对象,它是多线程,那么如何快速应利用这个好时机lu ...

  4. 使用C/C++编译预处理时须要注意的问题

    1.宏定义不是C/C++语句,不须要使用语句结束符":",否则它也被看做宏体的一部分. 2.不要在引用宏定义的參数列表中使用增量和减量运算符,否则将导致变量的多次求值.比如: #d ...

  5. 使用live delegate on解决js后装html故障问题

    今天写一个前端的东西.每学到更多的知识.几下就能写几行代码.代码行数十个.代码几个文件量--这是真的.一直以来研究的前端遇到的问题仍然在实践百度谷歌问答. 我今天遇到这样的问题:已经写js代码,正确a ...

  6. 揭秘上海传智播客平均工资超过7k 其中一位知情人士

    大学毕业生人数破700万大关.如何破解"毕业即失业"中国式的大学困境? 2014年全国高校毕业生总数将达到727万人,比被称为"史上最难就业年"的2013年再添 ...

  7. Oracle解锁的相关操作(转)

    当某个数据库用户在数据库中插入.更新.删除一个表的数据,或者增加一个表的主键时或者表的索引时,常常会出现ora-00054:resource busy and acquire with nowait ...

  8. 【二分法】 HDU 2446 Shell Pyramid

    意甲冠军:非常多,形成一个金字塔球 文章x层 x*(x+1)/ 2 球 给你个S 金字塔的一层代表第一数字向下S球 它是其中  这层中的第几行 第几列 公式 1 : x*(x+1)*(x+2)/ 6 ...

  9. 怎么在android的XML文件里加入凝视

    android的XML文件凝视一般採用 <!--凝视内容 -->的方式进行 在XML中,形如    <Button           />      的表示方式,当中&quo ...

  10. 网站的SEO以及它和站长工具的之间秘密(转)

    博客迁移没有注意 URL 地址的变化,导致百度和 google 这两只爬虫引擎短时间内找不到路.近段时间研究了下国内最大搜索引擎百度和国际最大搜索引擎google的站长工具,说下感受. 百度的站长工具 ...