【数据库学习】数据库安全、SQL Server、SQList、android之sqlite

来源:互联网 发布:八门神器修改数据闪退 编辑:程序博客网 时间:2024/06/06 01:18

1,安全性

1)SQL注入

SQL执行时,2种方式:
①字符串处理(拼接),然后执行SQL
用户输入的时候,可以通过输入sql语句来进行SQL注入。
②传参,执行SQL –>交给SQL引擎(推荐)

2,SQL Server

1)多重排序查询:

先按字段5排序,再按字段6排序
默认为asc:升序排列。desc:降序排序。
order by 字段5,字段6 asc

2)联表查询

     select a.title,b.type_name     from news_table as a,name_table as b     where a.type_id=b.type_id ;     select 字段1,字段2,字段3,字段4 from

3)等于:=

不等于:<>

4)存储过程

sql尽量放在存储过程中。
面对大量数据,用orcle比sql server稳定。

3,mysql命令行:

##1)查看数据库:

show databases;

2)建库:

create database children;

3)调用数据库

use children;

4)建表

主键、非空。

create table product(no char(10) primary key,code char(10) not null unique,online char(1),bind  char(1));

外键:

foreign key(no) references product(no)

5)更新

update near_log set lnt=99 where no=001;

6)插入

insert into product values('001','001','N','N');

7)删除

delete from all_log where lnt=34.342342;delete from all_log;
drop table user;

4,android之sqlite

##1)概念
sqlite是一款轻量级数据库,是遵守ACID(指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability))的关系型数据库管理系统。在嵌入式设备中,可能只需要几百K的内存就够了。

2)安全性

android手机root之后,就可以在/data/data/包名/database/目录中查看sqlite数据库。所以,对于敏感信息,应该考虑加密。

SQLite不支持加密,所以我们针对数据库文件加密。现有两种解决方案:

i>对数据库中的数据进行加密

①优点:
加密速度快。
程序无须变动,只针对数据进行加密。
②缺点:
来回加密,造成处理数据缓慢。
仅对数据加密,依然可以看到数据表的sql语句,可能猜测到表的作用。
③实现:
一是:对明文数据进行加密返回密文数据
二是:对密文数据进行解密返回明文数据

ii>对数据库文件进行加密

①优点
对整个文件进行了加密,用户通过编辑器看不到任何有用的数据。
进行数据库打开时,使用程序即可解密文件。
②缺点
需要修改sqlite源码,这个工作难度比较大。
③实现(太难,本人并没有进行实验)
a.修改sqlite源代码,追加对数据库文件进行加密的功能。
b.编译含有加密功能的程序源代码,生成各自平台需要使用的库文件。
c.将加密sqlite库文件引入各自平台中,修改数据库访问层代码。
d.进行程序的部署,测试。

3)demo

i>在AndroidManifest.xml中添加权限:

    <!-- 在SDCard中创建与删除文件权限 -->    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />        <!-- 往SDCard写入数据权限 -->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

ii>添加继承SQLiteOpenHelper的MyHeper类,用于创建使用数据库。

import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;public class MyHelper extends SQLiteOpenHelper {    private String Tag = "MyHelper";        private static String DB_NAME = "luoDB.db";  //数据库名称        public static String TABLE_NAME_TASK = "Task"; //联班任务_fra_task表名    /**super(参数1,参数2,参数3,参数4),其中参数4是代表数据库的版本,     * 是一个大于等于1的整数,如果要修改(添加字段)表中的字段,则设置     * 一个比当前的 参数4大的整数 ,把更新的语句写在onUpgrade(),下一次     * 调用     */    public MyHelper(Context context) {        super(context, DB_NAME, null, 1);    }    @Override    public void onCreate(SQLiteDatabase db) {        //Create table        try{            String sql = "CREATE TABLE "+TABLE_NAME_TASK + "("                          + "TaskCode TEXT PRIMARY KEY,"                          + "TaskState TEXT,"                          + "TaskName TEXT"                          + ");";            db.execSQL(sql);        //创建表        }catch(Exception e){            LogUtil.i(Tag, "onCreate" + e.getMessage());        }    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }}

iii>创建DatabaseUtil进行数据库操作。

import java.util.ArrayList;import java.util.List;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.text.style.TtsSpan.DateBuilder;/** * task数据操作。 ①存入数据库:每次getList的时候调用。每次删除所有数据,插入所有内容到数据库。 * ②删除内容:每次存入数据库的时候调用。删除所有数据。private。 ③更新:没有此功能。 ④取数据:两种情况下调用: * -----i>切换任务、保障等Tab且未收到服务器让重新getList的命令。(所以只有第一次登录才需要第一次进入taskFragment时获取数据) * -----ii>切换已降落(有实落)、未降落Tab. 另外,取到的数据为列表返回。 *  * @author luo * */public class DatabaseUtil {    private String Tag = "DatabaseUtil";    private MyHelper helper;    public DatabaseUtil(Context context) {        super();        try {            context.deleteDatabase("luoDB.db");            helper = new MyHelper(context);        } catch (Exception e) {            LogUtil.e(Tag, "DatabaseUtil" + e.getMessage());        }    }    /**     * 插入数据 插入数据之前,删除所有数据     *      * @param taskList     * @return     */    public boolean Insert(List<Task> taskList) {        SQLiteDatabase db = helper.getWritableDatabase();        try {            DeleteALL(db);            for (Task task : taskList) {                String sql = "insert or replace into " + MyHelper.TABLE_NAME_TASK                        + "(TaskCode,FlightNumStr,TaskName,TaskState,"                        + "ThisPlanLanding,ThisActualLanding,ThisPlanOff,ThisActualOff,"                        + "Gate,AircraftNumber,BoardingGate,AircraftType,IsDelay) values (" + "'" + task.TaskCode                        + "' ," + "'" + task.TaskName + "' ," + "'" + task.TaskState + "'" + ")";                db.execSQL(sql);            }            return true;        } catch (SQLException e) {            LogUtil.i(Tag, "Insert" + e.getMessage());            return false;        } finally {            db.close();        }    }    /**     * 删除所有数据     */    private void DeleteALL(SQLiteDatabase db) {        try {            db.execSQL("delete from " + MyHelper.TABLE_NAME_TASK);        } catch (Exception e) {            LogUtil.i(Tag, "Delete" + e.getMessage());        }    }    /**     * 查询所有数据     */    public List<Task> queryAll() {        List<Task> list = new ArrayList<Task>();        try {            SQLiteDatabase db = helper.getReadableDatabase();            Cursor cursor = db.query(MyHelper.TABLE_NAME_TASK, null, null, null, null, null, null);            while (cursor.moveToNext()) {                Task task = new Task();                task.TaskCode = cursor.getString(cursor.getColumnIndex("TaskCode"));                task.TaskName = cursor.getString(cursor.getColumnIndex("TaskName"));                task.TaskState = cursor.getString(cursor.getColumnIndex("TaskState"));                list.add(task);            }            db.close();        } catch (Exception e) {            LogUtil.i(Tag, "queryAll" + e.getMessage());        }        return list;    }    public List<Task> queryByThisActualLanding(Boolean actual) {        SQLiteDatabase db = helper.getReadableDatabase();        List<Task> list = new ArrayList<Task>();        Cursor cursor = null;        /**         * public Cursor query (String table, String[] columns, String         * selection, String[] selectionArgs,String groupBy, String         * having,String orderBy,String limit)参数如下:         * table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。         * columns:要查询出来的列名。相当于select语句select关键字后面的部分。         * selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”         * selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。         * |------在 selection 中需要嵌入字符串的地方用 ? 代替,然后在 selectionArgs         * 中依次提供各个用于替换的值就可以了. groupBy:相当于select语句group by关键字后面的部分         * having:相当于select语句having关键字后面的部分 orderBy:相当于select语句order         * by关键字后面的部分,如:personid desc, age asc升序;         * limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。         */        cursor = db.query(MyHelper.TABLE_NAME_TASK, new String[] { "TaskCode", "TaskName", "TaskState" },                "TaskCode<>'' ", null, null, null, "TaskCode asc");        // Cursor cursor = db.query(table, columns, selection, selectionArgs,        // groupBy, having, orderBy)        while (cursor.moveToNext()) {            Task task = new Task();            task.TaskCode = cursor.getString(cursor.getColumnIndex("TaskCode"));            task.TaskName = cursor.getString(cursor.getColumnIndex("TaskName"));            task.TaskState = cursor.getString(cursor.getColumnIndex("TaskState"));            list.add(task);        }        db.close();        return list;    }}

4)其它

###①多条件查询:
and连接。
###②模糊查询:

i>使用这种query方法%号前不能加’

            cursor = db.query(MyHelper.TABLE_NAME_TASK,                     new String[] { "TaskCode","TaskName"}, "TaskName like ?",                    new String[]{"%" + TaskName + "%"}, null, null, null);      

ii>使用这种query方法%号前必须加’

            Cursor  c_test = mDatabase.query(tab_name,                     new String[]{tab_field02},                    tab_field02+"  like '%" + str[0] + "%'", null, null, null, null);

iii>使用这种方式必须在%号前加’

            String current_sql_sel = "SELECT  * FROM "+tab_name                                     +" where "+tab_field02                                    +" like '%"+str[0]+"%'";            Cursor c_test = mDatabase.rawQuery(current_sql_sel, null);

多重排序,字符串排序

cursor = db.query(MyHelper.TABLE_NAME_TASK,                     new String[] { "TaskCode",  "TaskName","TaskState"}, "TaskName like ?",                    new String[]{"%" + TaskName+ "%"}, null, null,                    "(case"                    + " when TaskState like '" + TaskState.STATE2 + "' then 2"                    + " when TaskState like '" + TaskState.STATE1 + "' then 1"                    + " else 3"                    + " end)"                    + ",TaskCode asc");
0 0