android 之sqlite数据库Dao三层模型

 DAO是什么

       DAO(数据访问对象)在web程序设计中是业务逻辑层和数据库之间的一个层级。用来接收业务请求并对数据库进行处理。

       了解DAO,首先要知道web开发的层级。

       现在的web开发主要使用的是MVC的设计模式。所以按照“显示-业务-控制器”的理念。我们将web分为客户层、显示层、业务层、数据层(DAO)和资源层(数据库)。

       客户层就是客户使用的浏览器。这一端基本上不用我们处理。

       显示层就是显示在用户浏览器上的各种画面,现在广泛使用JSP。

       业务层是整个项目的核心。对多个DAO操作进行组合。

       数据层(DAO)是专门提取出来处理数据库的操作对象。是一个个原子性的对象。

       资源层主要是数据库的操作层,可以对数据进行增删改查。但是如果直接使用资源层操作处理数据库,会让代码变得复杂混淆难以重用。所以我们将操作提炼出来,也就成了DAO层。       

       DAO的组成

       一个DAO一共由六个类或者接口组成。他们分别是:

       DatabaseConnection:专门负责数据库的打开和关闭。

       VO:由属性、setter和getter方法组成。它的每一个属性和表中的字段相对应,每一个VO类实例化的对象,就表示了表中的一条记录。这个类的名字和表名要一致。假设表名为xxx

       DAO:这是一个接口,来预先定义一系列增删改查的操作。命名规则为IxxxDAO.Java。

       Impl:DAO的真实实现类,命名规则为xxxDAOImpl。这个类最好放到DAO的子包里面。要给这个类写一个构造方法,传入一个connection的对象。然后复写DAO中定义的方法即可。

       Proxy:代理实现类,就是打开关闭数据库,然后调用Impl来实现。命名规则是xxxDAOProxy

       Factory:工厂类,通过工取得DAO的实例化对象。命名规则是DAOFactory。实际使用此DAO操作时,只需要导入VO所在的包和工厂包即可。

       DAO接口的设计

       DAO接口是用来预定义操作的。

       增加表单中的条目

       publicBoolean doCreat(VO对象) throws Exception;

       查找并返回所有符合关键字的VO

       publicList类> findAll(String keyWord) throws Exception;

       查找符合ID的单个VO

       publicVO类 findById(int id) throws Exception;

       DAO模型

       在模式I中,使用这样的封装之后,只需要调用方法,就可以对数据库进行操作。

       比如在JSP提交页面后的跳转页面里,用scriptlet定义一段代码,实例化一个VO,并根据表单赋值,然后调用插入的方法,就可以可以成功插入一个新的VO了。

       在MVC模式中,也会使用DAO。区别是在JSP和DAO之间加入了Servlet,使得数据层和表示层进一步的分离。


在andorid中用sqlite数据库实现:

1.Utils类

package com.bool.utils;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by root on 7/15/17.
 */

public class DBHelper extends SQLiteOpenHelper {

    public DBHelper(Context context){
        super(context,"person.db",null,1);
    }
    public void onCreate(SQLiteDatabase db){
        db.execSQL("create table person(id integer primary key autoincrement," +
                "name varchar(20),age integer not null,sex varchar(10))");
    }

    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
        db.execSQL("alter table person add column account varchar(20)");
    }


}

两个模型:
package com.bool.model;

/**
 * Created by root on 7/15/17.
 */

public class CorePage {
    private int totalRecod; //总记录数
    private int totalPage;  //总页数
    private int step;   //步长
    private int privous;    //上一页
    private int thisPage;   //当前页面
    private int next;   //下一页

    public CorePage() {
    }

    public CorePage(int totalRecod, int totalPage, int step, int privous, int thisPage, int next) {
        this.totalRecod = totalRecod;
        this.totalPage = totalPage;
        this.step = step;
        this.privous = privous;
        this.thisPage = thisPage;
        this.next = next;
    }

    public int getTotalRecod() {
        return totalRecod;
    }

    public void setTotalRecod(int totalRecod) {
        this.totalRecod = totalRecod;
    }

    public int getTotalPage() {
        if(totalRecod%step!=0){
            totalPage = totalRecod/step;
        }else{
            totalPage = ((int)(totalRecod/step))+1;
        }
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public int getStep() {
        return step;
    }

    public void setStep(int step) {
        this.step = step;
    }

    public int getPrivous() {

        if(thisPage > 1){
            privous = thisPage-1;
        }else{
            privous=-1;
        }
        return privous;
    }

    public void setPrivous(int privous) {
        this.privous = privous;
    }

    public int getThisPage() {
        return thisPage;
    }

    public void setThisPage(int thisPage) {
        this.thisPage = thisPage;
    }

    public int getNext() {
        next=thisPage+1;
        return next;
    }

    public void setNext(int next) {
        this.next = next;
    }

    @Override
    public String toString() {
        return "CorePage{" +
                "totalRecod=" + totalRecod +
                ", totalPage=" + totalPage +
                ", step=" + step +
                ", privous=" + privous +
                ", thisPage=" + thisPage +
                ", next=" + next +
                '}';
    }
}

package com.bool.model;

/**
 * Created by root on 7/15/17.
 */

public class Person {
    private int id;
    private String name;
    private int age;
    private String sex;

    public Person() {
    }

    public Person(int id, String name, int age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

dao接口:

package com.bool.dao;

import com.bool.model.CorePage;
import com.bool.model.Person;

import java.util.List;

/**
 * Created by root on 7/15/17.
 */

public interface PersonDao {
    public void add(Person p);
    public void remove(int id);
    public void update(Person p);
    public Person findById(int id);
    public List findByCoreBar(CorePage cp);
    public List findAll();

}

Dao实现类:

package com.bool.daoImp;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.bool.dao.PersonDao;
import com.bool.model.CorePage;
import com.bool.model.Person;
import com.bool.utils.DBHelper;

import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by root on 7/15/17.
 */

public class PersonDaoImp implements PersonDao {
    DBHelper helper = null;
    public PersonDaoImp(Context context){
        helper = new DBHelper(context);

    }
    @Override
    public void add(Person p) {
        SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues value = new ContentValues();
        value.put("name",p.getName());
        value.put("age",p.getAge());
        value.put("sex",p.getSex());
        db.insert("person",null,value);
        db.close();
    }

    @Override
    public void remove(int id) {
        SQLiteDatabase db = helper.getWritableDatabase();
        db.delete("person","id=?",new String[]{id+""});
        db.close();
    }

    @Override
    public void update(Person p) {
        SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name",p.getName());
        values.put("age",p.getAge());
        values.put("sex",p.getSex());
        db.update("person",values,"id=?",new String[]{p.getId()+""});
        db.close();
    }

    @Override
    public Person findById(int id) {
        SQLiteDatabase db = helper.getReadableDatabase();
        Person person = null;
        Cursor cursor = db.query("person",null,"id=?",new String[]{id+""},null,null,null);
        if(cursor.moveToNext()){
            person = new Person();
            person.setId(cursor.getInt(0));
            person.setName(cursor.getString(1));
            person.setAge(cursor.getInt(2));
            person.setSex(cursor.getString(3));
        }
        db.close();
        return person;
    }

    @Override
    public List findByCoreBar(CorePage cp) {
        SQLiteDatabase db = helper.getReadableDatabase();
        Cursor cursor = db.rawQuery("select * from person limit "+((cp.getThisPage()-1)*cp.getStep())+","+cp.getStep(),null);
        List list = new ArrayList();
        while(cursor.moveToNext()){
            Person person = new Person();
            person.setId(cursor.getInt(0));
            person.setName(cursor.getString(1));
            person.setAge(cursor.getInt(2));
            person.setSex(cursor.getString(3));
            list.add(person);
        }
        db.close();
        return list;
    }

    @Override
    public List findAll() {
        SQLiteDatabase db = helper.getReadableDatabase();
        Cursor cursor = db.rawQuery("select * from person",null);
        List list = new ArrayList();
        while(cursor.moveToNext()){
            Person person = new Person();
            person.setId(cursor.getInt(0));
            person.setName(cursor.getString(1));
            person.setAge(cursor.getInt(2));
            person.setSex(cursor.getString(3));
            list.add(person);
        }
        db.close();
        return list;
    }

    public int getCount(){
        SQLiteDatabase db = helper.getReadableDatabase();
        Cursor cursor = db.rawQuery("select count(*) from person",null);
        int count = -1;
        if(cursor.moveToNext()){
            count = cursor.getInt(0);
        }
        return count;
    }
}
测试代码:

package com.example.root.myapplication;

import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.bool.dao.PersonDao;
import com.bool.daoImp.PersonDaoImp;
import com.bool.model.CorePage;
import com.bool.model.Person;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        PersonDaoImp personDaoImp = new PersonDaoImp(this);
        Person person = new Person();
        person.setName("bool");
        person.setAge(15);
        person.setSex("男");
        personDaoImp.add(person); //添加person

        person.setId(1);
        person.setAge(18);
        personDaoImp.update(person); //更新person

        Person person1 = personDaoImp.findById(1); //查找person

        Log.e("person","person1:"+person1);

        CorePage cp = new CorePage();
        cp.setTotalRecod(personDaoImp.getCount());
        cp.setStep(5);
        cp.setThisPage(1);
        List list = personDaoImp.findByCoreBar(cp);    //通过分页条查询

        for (Person p:
             list) {
            Log.e("core page query person",p.toString());
        }

        List list2 = personDaoImp.findAll();    //查询所有
        for (Person p :
                list2) {
            Log.e("all person",p.toString());
        }

        personDaoImp.remove(1);

        List list3 = personDaoImp.findAll();
        Log.e("total recod count:",list3.size()+"");

    }
}

输出结果:android 之sqlite数据库Dao三层模型_第1张图片


基本文档结构:

android 之sqlite数据库Dao三层模型_第2张图片

你可能感兴趣的:(android)