Android SQLite数据库应用之Prepared Statement、事务操作

来源:互联网 发布:软件研发部组织结构图 编辑:程序博客网 时间:2024/05/01 12:30

前文Android SQLite数据库应用之基本介绍中介绍了Android SQLite数据库的基本知识及常用类,本文在此基础上继续讲解Prepared Statement、事务操作在SQLite数据库中的应用。

Prepared Statement

1. 何谓Prepared Statement
所谓Prepared Statement,即预先编译参数化的SQL语句
2. 为什么需要Prepared Statement
为了帮助大家更加清晰的了解Prepared Statement的应用场景,我们先来了解下SQL语句的整体执行流程,分为以下几个步骤:
(1):SQL语句传输到数据库系统
(2):数据库系统验证、解析SQL
(3):数据库系统计算最优的访问计划,即Access Plan
(4):根据最优的Access Plan访问数据,返回数据
在上述几个步骤中,步骤(3)极为耗时。出于性能方面的考虑,数据库系统将SQL语句及对应的最优Access Plan以Key-Value的形式缓存。这样以来,当相同的SQL语句经过(1)、(2)两步后,数据库会直接根据SQL语句(Key)从缓存中找出最优Access Plan直接使用,提升了效率。那么Prepared Statement究竟是如何达到上述提升效率的目的呢?请看如下场景:
例如我们使用SQL语句向人员信息表中插入人员信息,SQL语句为insert into userInfo(name) values('MrWang'); 插入完毕后,又需要插入姓名为MissPang的人员的信息,则这时SQL语句为insert into userInfo(name) values('MissPang');注意,这两条SQL语句虽然结构相同,但仍旧是不同的SQL语句,也就是说执行完第一条插入语句后数据库缓存的Access Plan并不能用于第二次的插入,尽管这两条SQL语句仅仅是name的值不同。如果我们要大量执行这种插入操作,效率可想而知。试想,如果能够构造一个参数化的SQL语句,用占位符替代语句中需要经常变化的字段的值,然后在每次执行SQL前设置该字段值,这样做的好处是数据库系统会将参数化的SQL语句编译后缓存(如上文所述),Key为参数化的SQL,当下次插入执行时会直接使用缓存中的Access Plan,并将动态的字段值传入,这样便提高了效率。
3. 如何使用Prepared Statement

String sql = "insert into userInfo(name,age) values(?,?);";SQLiteDatabase db = getWritableDatabase();SQLiteStatement statement = db.compileStatement(sql);statement.bindString(1,"MrWang");statement.bindLong(23);statement.executeInsert();

以上就是Prepared Statement的基本用法,是不是感觉很简单呢。除了能提升效率,Prepared Statement另一个非常重要的作用是防SQL注入,具体的原理这里不再解释。


事务(Transaction)

1. 何谓Transaction
所谓事务,是一种操作序列,它包含一组数据库操作,这些操作要么全部执行,要么全不执行。
2.事务的四大属性

  • 原子性(Atomicity):事务是一个完整的操作。
  • 一致性(Consistency):当事务完成时,数据必须处于一致状态。
  • 隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的。
  • 持久性(Durability):事务完成后,它对于系统的影响是永久性的。

3.如何使用事务

SQLiteDatabase db = getWritableDatabase();db.begbinTransaction();try{/* Do Something*/db.setSuccessful();}finnaly{db.endTransaction();}

至此,对Prepared Statement及事务操作的介绍结束,相信大家已对它们有了更深一步的认识,本文没有给出具体的使用实例,只是起一个抛砖引玉的作用。文中如有差错,还望各位指出,谢谢。


参考:
http://www.2cto.com/database/201409/338157.html
http://baike.baidu.com/link?url=bXE9pik6Zz6KbT6pgJ8wD_vxf85VBVkNE_4uhpatztc08yyapnNkPfhPsKh5Rl9_8uzuPL37hFxDbj3yPlL60K

0 0
原创粉丝点击