关闭

ORM, ormlite和sqlite

标签: java
266人阅读 评论(0) 收藏 举报
分类:

背景知识

ORM

它的英文全称是Object Relational Mapping,意思是对象关系映射;如果接触过Java EE开发的,一定知道Java Web开发就有一个类似的数据库映射框架——Hibernate。简单来说,就是我们定义一个实体类,利用这个框架,它可以帮我们吧这个实体映射到我们的数据库中。

Hibernate

是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

Java Bean

对于j2ee的初学者,javabean确实是一个让人容易困惑的概念。现在来说说我自己的理解。
javabean其实包含多个方面的含义。
1. 顾名思义,bean,保存数据的实体,通常与数据库中的表对应。也称为,pojo,entity,domain。比如Person,Apple等,只有private属性和public setxxxx和getxxx。具体实例就是对应表中的一行。那些hibernate,ibatis等orm框架,都支持它们和表的互相映射。
2. 这个就比较高大上,也比较抽象了。javabean被称为完成特定功能的组件。不是有高内聚低耦合的说法么?它就是这样一组java类集合。

Android 数据库框架ormlite

android上sqlite已经比较好用,但是如果需要在android上像J2EE那样开发的话那么sqlite还是显得比较复杂,这个时候你当然可以选择一些android平台上的ORM框架。
主要功能:
通过添加注解设置自己的类。
强大的抽象数据库访问对象(DAO)类。
通过灵活的QueryBuilder轻松构建各种查询。
支持MySQL、Postgres、Microsoft SQL Server、H2、Derby、HSQLDB、Sqllite且可以相对容易的扩展到其他数据库。
临时支持(Provisional support)DB2、Oracle、ODBC和Netezza。如果不支持你的数据库,联系作者。
处理“编译”重复查询任务的SQL语句。
通过对象类型的属性支持“外”对象,数据库中只存储外对象的id。
基本支持数据库事务。
自动生成创建、删除数据库表的SQL。
支持Spring配置。
支持不用注解配置表和字段。
支持Android SQLite数据库API的本地调用。

ORMlite的使用例子

ORMlite通过Java注解的方式来建立起与数据库的映射关系
如我们现在想要建立一个简单的数据库test.db并创建一张表person来记录一个人的名字,年龄,住址等等。

建立bean类

首先,建立我们的Bean类Person,并通过注解的方式与数据库联系起来

@DatabaseTable(tableName = "person")
public class Person {

    @DatabaseField(generatedId=true)
    private int id;
    @DatabaseField(columnName="name")
    private String name;
    @DatabaseField(columnName="age")
    private int age;
    @DatabaseField(columnName="address")
    private String address;
    /**
     * @return the id
     */
    public int getId() {
        return id;
    }
    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return the age
     */
    public int getAge() {
        return age;
    }
    /**
     * @param age the age to set
     */
    public void setAge(int age) {
        this.age = age;
    }
    /**
     * @return the address
     */
    public String getAddress() {
        return address;
    }
    /**
     * @param address the address to set
     */
    public void setAddress(String address) {
        this.address = address;
    }

创建数据库

与Android中的数据库创建相似,使用OrmLite创建数据库需要我们创建一个SqlOpenHelper继承OrmLiteSqliteOpenHelper,在OrmLiteSqliteOpenHelper也有两个重要方法,分别是onCreate和onUpgrade,负责数据库创建以及升级时的操作

public class MySqlOpenHelper extends OrmLiteSqliteOpenHelper {

    private Dao<Person, Integer> mPersonDao;

    public MySqlOpenHelper(Context context) {
        super(context, "test", null, 1);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase arg0, ConnectionSource arg1) {
        // TODO Auto-generated method stub
        try {
            //创建数据表
            TableUtils.createTableIfNotExists(arg1, Person.class);
        } catch (java.sql.SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase arg0, ConnectionSource arg1, int arg2,
            int arg3) {
        // TODO Auto-generated method stub

    }

    public Dao<Person, Integer> getPersonDao() throws java.sql.SQLException {
        if (mPersonDao == null) {
            mPersonDao = getDao(Person.class);
        }
        return mPersonDao;
    }

}

使用android自带的SQLiteOpenHelper

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

public class dbHelper extends SQLiteOpenHelper {

    private final static String DATABASE_NAME="sec_db";
    private final static int DATABASE_VERSION=1;
    private final static String TABLE_NAME="sec_pwd";
    public final static String FIELD_ID="_id"; 
    public final static String FIELD_TITLE="sec_Title";

    public dbHelper(Context context)
    {
        super(context, DATABASE_NAME,null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        String sql="Create table "+TABLE_NAME+"("+FIELD_ID+" integer primary key autoincrement,"
        +FIELD_TITLE+" text );";
        db.execSQL(sql);                
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        String sql=" DROP TABLE IF EXISTS "+TABLE_NAME;
        db.execSQL(sql);
        onCreate(db);
    }

    public Cursor select()
    {
        SQLiteDatabase db=this.getReadableDatabase();
        Cursor cursor=db.query(TABLE_NAME, null, null, null, null, null,  " _id desc");
        return cursor;
    }

    public long insert(String Title)
    {
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues cv=new ContentValues(); 
        cv.put(FIELD_TITLE, Title);
        long row=db.insert(TABLE_NAME, null, cv);
        return row;
    }

    public void delete(int id)
    {
        SQLiteDatabase db=this.getWritableDatabase();
        String where=FIELD_ID+"=?";
        String[] whereValue={Integer.toString(id)};
        db.delete(TABLE_NAME, where, whereValue);
    }

    public void update(int id,String Title)
    {
        SQLiteDatabase db=this.getWritableDatabase();
        String where=FIELD_ID+"=?";
        String[] whereValue={Integer.toString(id)};
        ContentValues cv=new ContentValues(); 
        cv.put(FIELD_TITLE, Title);
        db.update(TABLE_NAME, cv, where, whereValue);
    }    
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9527次
    • 积分:418
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:13篇
    • 译文:0篇
    • 评论:0条
    文章分类