当前位置: 首页 > 编程日记 > 正文

PreparedStatement

该 PreparedStatement接口继承Statement,并与之在两方面有所不同:

  PreparedStatement 实例包含已编译的 SQL 语句。这就是使语句“准备好”。包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指定。相反的,该语句为每个 IN 参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX 方法来提供。

  由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。

  作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代 IN 参数占位符的值。同时,三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。这些方法的 Statement 形式(接受 SQL 语句参数的形式)不应该用于 PreparedStatement 对象。

  1、创建 PreparedStatement 对象

  以下的代码段(其中 con 是 Connection 对象)创建包含带两个 IN 参数占位符的 SQL 语句的 PreparedStatement 对象:

PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");

  pstmt 对象包含语句 "UPDATE table4 SET m = ? WHERE x = ?",它已发送给DBMS,并为执行作好了准备。

  2、传递 IN 参数

  在执行 PreparedStatement 对象之前,必须设置每个 ? 参数的值。这可通过调用 setXXX 方法来完成,其中 XXX 是与该参数相应的类型。例如,如果参数具有Java 类型 long,则使用的方法就是 setLong。setXXX 方法的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数的值。例如,以下代码将第一个参数设为 123456789,第二个参数设为 100000000:

pstmt.setLong(1, 123456789);
pstmt.setLong(2, 100000000); 

  一旦设置了给定语句的参数值,就可用它多次执行该语句,直到调用clearParameters 方法清除它为止。在连接的缺省模式下(启用自动提交),当语句完成时将自动提交或还原该语句。

  如果基本数据库和驱动程序在语句提交之后仍保持这些语句的打开状态,则同一个 PreparedStatement 可执行多次。如果这一点不成立,那么试图通过使用PreparedStatement 对象代替 Statement 对象来提高性能是没有意义的。

  利用 pstmt(前面创建的 PreparedStatement 对象),以下代码例示了如何设置两个参数占位符的值并执行 pstmt 10 次。如上所述,为做到这一点,数据库不能关闭 pstmt。在该示例中,第一个参数被设置为 "Hi"并保持为常数。在 for 循环中,每次都将第二个参数设置为不同的值:从 0 开始,到 9 结束。

pstmt.setString(1, "Hi");
for (int i = 0; i < 10; i++) {
 pstmt.setInt(2, i);
 int rowCount = pstmt.executeUpdate();


  3、IN 参数中数据类型的一致性

  setXXX 方法中的 XXX 是 Java 类型。它是一种隐含的 JDBC 类型(一般 SQL 类型),因为驱动程序将把 Java 类型映射为相应的 JDBC 类型(遵循该 JDBCGuide中§8.6.2 “映射 Java 和 JDBC 类型”表中所指定的映射),并将该 JDBC 类型发送给数据库。例如,以下代码段将 PreparedStatement 对象 pstmt 的第二个参数设置为 44,Java 类型为 short:

pstmt.setShort(2, 44); 

  驱动程序将 44 作为 JDBC SMALLINT 发送给数据库,它是 Java short 类型的标准映射。

  程序员的责任是确保将每个 IN 参数的 Java 类型映射为与数据库所需的 JDBC 数据类型兼容的 JDBC 类型。不妨考虑数据库需要 JDBC SMALLINT 的情况。如果使用方法 setByte ,则驱动程序将 JDBC TINYINT 发送给数据库。这是可行的,因为许多数据库可从一种相关的类型转换为另一种类型,并且通常 TINYINT 可用于SMALLINT 适用的任何地方


jdbc(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.statement要求开发者付出大量的时间和精力。在使用statement获取jdbc访问时所具有的一个共通的问题是输入适当格式的日期和时间戳:2002-02-05 20:56 或者 02/05/02 8:56 pm。


通过使用java.sql.preparedstatement,这个问题可以自动解决。一个preparedstatement是从java.sql.connection对象和所提供的sql字符串得到的,sql字符串中包含问号(?),这些问号标明变量的位置,然后提供变量的值,最后执行语句,例如:

stringsql = "select * from people p where p.id = ? and p.name = ?";
preparedstatement ps = connection.preparestatement(sql);
ps.setint(1,id);
ps.setstring(2,name);
resultset rs = ps.executequery(); 
使用preparedstatement的另一个优点是字符串不是动态创建的。下面是一个动态创建字符串的例子:

stringsql = "select * from people p where p.i = "+id;


这允许jvm(javavirtual machine,java虚拟机)和驱动/数据库缓存语句和字符串并提高性能。preparedstatement也提供数据库无关性。当显示声明的sql越少,那么潜在的sql语句的数据库依赖性就越小。由于preparedstatement具备很多优点,开发者可能通常都使用它,只有在完全是因为性能原因或者是在一行sql语句中没有变量的时候才使用通常的statement。一个完整的preparedstatement的例子:

package jstarproject;
import java.sql.*;

public class mypreparedstatement {

private final string db_driver="com.microsoft.jdbc.sqlserver.sqlserverdriver";
private final string url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=pubs";

public mypreparedstatement() 
  {
  }
  public void query() throws sqlexception{
    connection conn = this.getconnection();
    string strsql = "select emp_id from employee where emp_id = ?";
    preparedstatement pstmt = conn.preparestatement(strsql);
    pstmt.setstring(1,"pma42628m");
    resultset rs = pstmt.executequery();

while(rs.next()){
       string fname = rs.getstring("emp_id");
       system.out.println("the fname is " + fname);
    }
    rs.close();
    pstmt.close();
    conn.close();

}
  private connection getconnection() throws sqlexception{
//    class.
    connection conn = null;
    try {
      class.forname(db_driver);
      conn = drivermanager.getconnection(url,"sa","sa");
    }
    catch (classnotfoundexception ex) {}
    return conn;
  }
  //main
  public static void main(string[] args) throws sqlexception {
    mypreparedstatement jdbctest1 = new mypreparedstatement();
    jdbctest1.query();
  }
}

为什么要始终使用PreparedStatement代替Statement?为什么要始终使用PreparedStatement代替Statement?


在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement.
基于以下的原因:
一.代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:

stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");

perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();

不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心.

为什么 PreparedStatement 很重要, 以及怎样"正确"使用他们.

数据库有一个艰苦的工作. 它们不断地从许多客户端读取 SQL 查询, 对数据进行尽 
可能高效的 查询. 处理语句可能成为一个代价较高的操作, 但是现在数据库都是很 
好的设计, 这样这个困难 被减到最小. 但是这些优化需要应用程序开发者的协助, 
这篇文章给你展示一下怎样正确使用 PreparedStatement 来漂亮地帮助数据库执行 
这些优化.

一个数据库怎样执行一条语句?

显然, 不要希望这里有许多细节; 我们只看一下对这篇文章比较重要的部分. 当一个 
数据库接收 到一条语句的时候, 数据库引擎首先解析这条语句, 查看语法错误. 一 
旦语句解析了, 数据库 需要找出最有效的方法来执行这条语句. 这个计算起来代价 
很大. 数据库检查什么索引(如果有 的话)能有所帮助, 或者它是否能全部读出一张 
表中所有的记录. 数据库根据这些关于数据库所 存数据的统计数字来找出最好的 
办法. 一旦制订出查询方案, 就可以由数据库引擎来执行.

需要 CPU 来产生访问方案. 理想的情况, 如果我们把相同的语句给数据库发送两 
次, 我们期望 数据库重用第一条记录的访问方案. 这会比第二次重新产生方案要使 
用较少的 CPU.

语句缓冲

数据库可以进行调节来做语句缓冲. 通常包含一些类型的语句缓冲. 缓冲使用语句 
本身作为关键 字, 访问方案和相应的语句存储在缓冲区中. 这样就允许数据库引擎 
对以前执行过的语句所使用 的访问方案进行重用. 举个例子来说, 如果我们向数据 
库发送这样一条语句 "select a, b from t where c = 2", 计算好的访问方案就放入缓冲 
区了. 如果我们以后再使用同样的语 句, 数据库就能重用以前的访问方案, 这样就 
能节省 CPU.

但是要注意, 整条语句是一个关键字. 例如, 如果我们后来发送的语句是 "select a,b 
from t where c = 3", 那么就不会找出以前的访问方案. 因为 "c=3" 和 "c=2" 是不一 
样的. 所以, 例如:

For(int I = 0; I < 1000; ++I) 

PreparedStatement ps = conn.prepareStatement("select a,b from t 
where c = " + I); 
ResultSet rs = Ps.executeQuery(); 
Rs.close(); 
Ps.close(); 
}

这里不会用到缓冲. 每次循环向数据库发送一条不同的 SQL 语句. 每次循环都重新 
计算新的访问 方案, 用这种方法我们会浪费大量的 CPU 周期. 但是, 看看下一个片 
段:

PreparedStatement ps = conn.prepareStatement("select a,b from t where c 
= ?"); 
For(int I = 0; I < 1000; ++I) 

ps.setInt(1, I); 
ResultSet rs = ps.executeQuery(); 
Rs.close(); 

ps.close();

这样就会高效得多. 发送给数据库的语句在 sql 中使用 @#?@# 符号来参数化. 这意味着 
每次循环 发送的是同一条语句, 在 "c=?" 部分带有不同的参数. 这样就允许数据库 
重用语句的访问方案, 是程序在数据库内部运行得更高效. 这基本上能使你的程序 
运行得更快, 或者使数据库用户能更多 地使用 CPU.

PreparedStatement 和 J2EE 服务器

当我们使用 J2EE 服务器的时候, 事情会变得更加复杂. 通常情况下, 一个预先准备 
好的语句 (prepared statement) 是和一个单独的数据库连接相关联的. 当连接关闭时, 
语句就被丢弃 了. 一般来说, 一个胖客户端应用程序在得到一个数据库连接后会一 
直保持到程序结束. 它会使用 两种方法创建所有的语句: 急切创建(eagerly) 或者 懒 
惰创建(lazily). Eagerly是说, 当程序启动时全部创建. Lazily是说随用随创建. 急切 
的方法会在程序启动时有些延时, 但是一旦程序启动以后, 运行很好. 懒惰的方法启 
动很快, 但是当程序运行时, 预先准备的语句在第一次使用是创建. 这就会造成性能 
不平衡, 知道所有的 语句都准备好了, 但是最终程序会和急切方法一样快. 哪一种 
最好要看你需要的是快速启动还是 均衡的性能.

一个 J2EE 应用程序所带来的问题就是它不能像这样工作. 它只在一个请求的生存 
时间中保持一个 连接. 这意味着在他处理每一个请求时都会重新创建语句, 就不象 
胖客户端只创建一次, 而不是每 个请求都创建那样有效,

当 J2EE 服务器给你的程序一个连接时, 并不是一个真正的连接, 而是一个经过包装 
的. 你可以 通过查看那个连接的类的名字来检验一下. 它不是一个数据库的 JDBC 
连接, 是你的服务器创建 的一个类. 通常, 如果你调用一个连接的 close 方法, 那么 
jdbc 驱动程序会关闭这个连接. 我们希望的是当 J2EE 应用程序调用 close 的时候, 
连接会返回到连接池中. 我们通过设计一个 代理的 jdbc 连接类来做这些, 但看起来 
就象是实际的连接. 当我们调用这个连接的任何方法时, 代理类就会把请求前递给 
实际的连接. 但是, 当我们调用类似 close 的方法时, 并不调用实际 连接的 close 方 
法, 只是简单地把连接返回给连接池, 然后把代理连接标记为无效, 这样当它 被应 
用程序重新使用时, 我们会得到异常.

包装是非常有用的, 因为它帮助 J2EE 应用程序服务器实现者比较聪明地加上预先 
准备语句的 支持. 当程序调用 Connection.prepareStatement 时, 由驱动程序返回一 
个 PreparedStatement 对象. 当应用程序得到它时, 保存这个句柄, 并且在请求完成 
时, 关闭 请求之前关闭这个句柄. 但是, 在连接返回到连接池之后, 以后被同样或者 
另一个应用程序重用时, 那么, 我们就理论上希望同样的 PreparedStatement 返回给 
应用程序.

J2EE PreparedStatement 缓冲

J2EE PreparedStatement 缓冲由 J2EE 服务器内部的连接池管理器使用一个缓冲区 
来 实现. J2EE 服务器在连接池中保存一个所有数据库的预先准备语句的一个列表. 
当一个程序 调用一个连接的 prepareStatement 方法时, 服务器先检查这个语句是否 
已经有了, 如果 是, 相应的 PreparedStatement 就在缓冲区内, 就返回给应用程序, 如 
果不是, 请求就 会传递给 jdbc 驱动程序, 请求/预先准备语句 对象就会加入到缓冲 
区里.

对于每一个连接我们需要一个缓冲区, 因为这是 jdbc 驱动程序的工作要求. 任何返 
回的 preparedStatement 都是针对这个连接的.

如果我们要利用缓冲区的优势, 要使用和前面相同的规则. 我们需要使用参数话的 
查询, 这样 它们就会和已经在缓冲区的某一个匹配. 大多数应用程序服务器都允许 
你调整缓冲区的大小.

总之, 对于预先准备语句, 我们应该使用参数化的查询. 这样允许数据库重用已经存 
在的访问 方案, 从而减轻数据库的负担. 这样的缓冲区是这个数据库范围的, 所以 
你可以安排你所有的 应用程序, 使用相似的参数化的 SQL, 就会提高这样的缓冲区 
方案的效率, 因为一个应用程序 可以使用另一个应用程序的语句. 一个应用服务器 
的优势也在于此, 因为访问数据库的逻辑应该 集中在数据访问层上(OR 映射, 实体 
bean 或者直接 JDBC).

最后, 预先准备语句的正确使用也让你利用应用程序服务器的预先准备语句的缓冲 
区的好处. 会提高你的应用程序的性能, 因为应用程序通过对以前的预先准备语句 
的重用减少 JDBC 驱动程序调用的次数. 这样使它能和胖客户端的效率竞争, 并且 
去掉了不能保持一个长期 连接的坏处.

如果你使用参数化的预先准备语句, 就可以提高数据库和你的服务器端的代码的效 
率. 这些提高 都会允许你的应用程序提高性能.   

相关文章:

百度ERNIE 2.0发布!16项中英文任务表现超越BERT和XLNet

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;2019 年 3 月&#xff0c;百度正式发布 NLP 模型 ERNIE&#xff0c;其在中文任务中全面超越 BERT 一度引发业界广泛关注和探讨。今天&#xff0c;百度发布了 ERNIE 2.0&#xff0c;指出其在…

WindowsServer2012史记7-茴香豆的五种写法和四种”显示计算机”的方法

消失的"计算机"&#xff1f;【这周九叔工作比较忙&#xff0c;还有其他琐事缠身&#xff0c;因此SystemCenter2012SP1系列的发布稍慢&#xff0c;抱歉了各位。】众所周知&#xff0c;WindowsServer2012和Windows8一样&#xff0c;默认桌面上是没有"计算机"…

设计模式之状态模式(State)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…

CYQ学习主要摘要4

http://www.cnblogs.com/cyq1162/archive/2010/11/03/1867642.html Xml的处理 http://www.cnblogs.com/cyq1162/archive/2010/11/23/1885299.html 3.5版本 http://www.cnblogs.com/cyq1162/archive/2010/12/27/1918317.html 无线分级 http://www.cnblogs.com/cyq1162/archive/2…

知识图谱、深度学习、AutoML,推荐系统与新技术结合将碰撞出怎样的火花?

近日&#xff0c;来自意大利米兰理工大学 Maurizio 团队发表的一篇极具批判性的文章火了。这篇文章剑指推荐系统领域的其他数十篇论文&#xff0c;并通过多项试验证明这些论文中基于深度学习的推荐算法大部分都存在不同程度的数据集缺失和源码缺失的问题&#xff0c;导致根本无…

python-range用法

2019独角兽企业重金招聘Python工程师标准>>> 详细记录python的range()函数用法 转载于:https://my.oschina.net/lxwgmail/blog/135228

设计模式之观察者模式(Observer)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…

中科院、百度研究院等联合提出UGAN,生成图片难以溯源

作者 | 中国科学院、北京航空航天大学、百度研究院团队译者 | 凯隐编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;导读&#xff1a;生成对抗网络&#xff08;GAN&#xff09;是近年大热的深度学习模型&#xff0c;中国科学院相关团队注意到&#xff0c;…

搜索引擎的时效性需求满足

“全、准、快、新”是搜索引擎的四大评价指标&#xff0c;其中的“新”指代的就是时效性。随着互联网的发展&#xff0c;网民对信息获取的时效性要求越来越高。同时越来越多的网民更多的参与到创造互联网内容中去&#xff0c;互联网上的新信息也在迅速的膨胀。这都给搜索引擎时…

如何卸载sql2008,完全清除

1.先把SQL Server卸载&#xff0c;再把安装时产生的“Microsoft SQL Server”文件夹删掉,在运行注册表,把HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQLServer&#xff0c;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server全部删掉&#xff0c;(注意要把Mic…

别再说学不会:超棒的Numpy可视化学习教程来了

作者 | Jay Alammar译者 | 苏南下来源 | 机器会学ML&#xff08;ID&#xff1a;AI_Learning007&#xff09;导读&#xff1a;学习 Python&#xff0c;尤其是基于 Python 的学习机器学习算法&#xff0c;最基础的 NumPy 用法必须得熟悉。网上这方面的教程不少&#xff0c;但大多…

设计模式之备忘录模式(Memento)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…

型网站的架构设计问题----大型高并发高负载网站的系统架构

随着中国大型IT企业信息化速度的加快&#xff0c;大部分应用的数据量和访问量都急剧增加&#xff0c;大型企业网站正面临性能和高数据访问量的压力&#xff0c;而且对存储、安全以及信息检索等等方面都提出了更高的要求…… 本文中&#xff0c;我想通过几个国外大型IT企业及网站…

java之php、Android、JAVA、C# 3DES加密解密

异常如下1.javax.crypto.BadPaddingException: Given final block not properly padded1&#xff09;要确认下是否加密和解密都是使用相同的填充算法&#xff08;也就是说&#xff0c;是否都是使用PKCS5Padding&#xff09;2&#xff09;确认下你要解密的字节数组是否正确。jav…

设计模式之中介者模式(Mediator)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…

谷歌引入自动网络设计,高效解决大规模深度推荐模型的特征嵌入问题

来源 | 深度传送门&#xff08;ID:gh_5faae7b50fc5&#xff09;导读&#xff1a;本文主要介绍Google在大规模深度推荐模型上关于特征嵌入的最新论文。 一、背景大部分的深度学习模型主要包含如下的两大模块&#xff1a;输入模块以及表示学习模块。自从NAS[1]的出现以来&#xf…

什么是POM maven

POM是项目对象模型(Project Object Model)的缩写&#xff0c;下面援引一下百度百科中对于POM的解释 定义 Maven是以项目为中心的设计。POM是Maven对一个单一项目的描述。没有POM的话&#xff0c;Maven是毫无用处的——POM是Maven的核心。是POM实现的并驱动了这种以模型来描述的…

新的Mac下如何配置开发者账号信息

1&#xff1a;把p12文件下载来&#xff0c;打开&#xff0c;添加到钥匙串 2&#xff1a;在xcode中的Organizer中的 Provisioning Profiles项中&#xff0c;点击 “New”&#xff0c; 添加账号信息&#xff0c;从网络获取相关文件。 转载于:https://www.cnblogs.com/willbin/arc…

5G+AI重新定义生老病死?

作者 | 胡巍巍来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;5G时代&#xff0c;我们的生老病死&#xff0c;或将被重新定义。5G手术&#xff0c;让生命不再受制于距离海南的神经外科专家凌至培&#xff0c;使用5G技术&#xff0c;跨越南北为一位北京的患者&#…

设计模式之命令模式(Command)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…

QTP的那些事---页面弹出框的处理,页面等待加载的处理

处理方法&#xff1a;先判断父类对象是否存在&#xff0c;如果存在&#xff0c;判断相关的static文本对象是否存在&#xff0c;如果存在&#xff0c;则点击弹出框中的按钮即可&#xff1b; 例如如下的代码&#xff1a; 设置循环判断dialog对象是否存在&#xff0c;如果存在&…

如何衡量一个项目的交付质量???

昨天与部门开会讨论项目的完整规范交付流程&#xff0c;参会的涉及到项目相关的所有人员&#xff0c;总结一下供大家讨论交流&#xff1a; 1、小插曲&#xff1a;我们把客户的干系人、自己的干系人对项目的影响做了一个排名并打分&#xff0c;结果很有意思&#xff1a;客户的领…

华人“霸榜”ACL最佳长短论文、杰出论文一作,华为、南理工等获奖

作者 | 夕颜、一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;7 月 31 日晚&#xff0c;自然语言处理领域最大顶会 ACL 2019 在佛罗伦萨进行到了第四天&#xff08;7 月 29 日-8 月 1 日&#xff09;&#xff0c;当天&#xff0c;组委会最终从提…

设计模式之访问者模式(Visitor)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…

关闭Windows 8的metro UI的方法汇总

http://www.ssdax.com/570.html 上面就是windows8新出现的Metro UI&#xff0c;点击开始菜单就会出现&#xff0c;取代了windows长久以来的开始菜单&#xff0c;有了非常大的突破 不过我发现很多人都在找怎么关闭windows8 的Metro UI&#xff0c;下面介绍两个如何关闭Metro的方…

coredata Lightweight Migration 心得

关于coredata 网上的相关资料比较少&#xff0c;大部分是基本用法。于是便找到苹果官方文档进行深入学习。 分享一下心得&#xff0c;如果用了coredata 必须懂得 coredata Migration&#xff0c;否则app版本更新 core data model schema 变化很大可能导致持久化coredata 出错&a…

设计模式之职责链模式(Chain of Responsibility)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…

澎思科技与新加坡国立大学等高校共研AI产品加快技术应用落地

2019年7月31日&#xff0c;中国人工智能企业澎思科技宣布新加坡研究院正式揭牌成立&#xff0c;并宣布成立澎思技术委员会&#xff0c;推动全球视野下的人工智能技术研究。同时&#xff0c;澎思科技与新加坡国立大学、新加坡南洋理工学院等重量级机构签订战略合作。未来&#x…

codility上的问题 (22)

问题描述&#xff1a; 用1 * 1&#xff0c; 1 * 2的矩形覆盖一个n行m列的矩形&#xff0c;问有多少种方法。 数据范围 : n [1..10^6], m [ 1..7] 要求复杂度&#xff1a; 时间 O(log(n) * 8 ^m)) 空间 O(4^m) 分析&#xff1a;这个题跟之前那个木块砌墙问题一样…… 稍作修…

session 与 cookie的区别

session和cookie是网站浏览中较为常见的两个概念&#xff0c;也是比较难以辨析的两个概念&#xff0c;但它们在点击流及基于用户浏览行为的网站分析中却相当关键。基于网上一些文章和资料的参阅&#xff0c;及作者个人的应用体会&#xff0c;对这两个概念做一个简单的阐述和辨析…