android 之sqlite数据库Dao三层模型

来源:互联网 发布:js 数组值存在 编辑:程序博客网 时间:2024/05/17 07:11

 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<VO类> 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<Person> findByCoreBar(CorePage cp);    public List<Person> 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<Person> findByCoreBar(CorePage cp) {        SQLiteDatabase db = helper.getReadableDatabase();        Cursor cursor = db.rawQuery("select * from person limit "+((cp.getThisPage()-1)*cp.getStep())+","+cp.getStep(),null);        List<Person> list = new ArrayList<Person>();        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<Person> findAll() {        SQLiteDatabase db = helper.getReadableDatabase();        Cursor cursor = db.rawQuery("select * from person",null);        List<Person> list = new ArrayList<Person>();        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<Person> list = personDaoImp.findByCoreBar(cp);    //通过分页条查询        for (Person p:             list) {            Log.e("core page query person",p.toString());        }        List<Person> list2 = personDaoImp.findAll();    //查询所有        for (Person p :                list2) {            Log.e("all person",p.toString());        }        personDaoImp.remove(1);        List<Person> list3 = personDaoImp.findAll();        Log.e("total recod count:",list3.size()+"");    }}

输出结果:


基本文档结构:


原创粉丝点击