Android-数据库-ORM框架

本文详细介绍xUtils3 ORM框架的使用方法,包括全局初始化、实体类创建、增删改查等基本操作,并通过示例代码展示具体用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.ORM介绍

对象关系映射Object Relational Mapping, 用于实现面向对象编程里不同系统数据之间转换!
面向对象是从耦合/聚合/封装的基础上发展, 关系数据库是从数学理论发展而来;
两套理论存在显著的区别, ORM对象关系映射就是为了解决它们之间的差异!

直白地说,ORM建立对象和数据库表的对应关系,方便程序员直接用对象操作数据库!

二.Java的ORM框架

Hibernate, iBatis, DbUtils,OrmLite等等

三.Android的ORM框架

OrmLite JDBC和Android的轻量级ORM java包
SugarORM 用超级简单的方法处理Android数据库
GreenDAO 一种轻快地将对象映射到SQLite数据库的ORM解决方案
ActiveAndroid 以活动记录方式为Android SQLite提供持久化
SQLBrite SQLiteOpenHelper 和ContentResolver的轻量级包装
Realm是一个跨平台移动数据库引擎,支持iOS、OS X(Objective-C和Swift)以及Android。
核心数据引擎C++打造,并不是建立在SQLite之上的ORM!

xUtils3, 源于afinal(已不再维护更新),都是国产框架,方便小巧工具集
包含了orm, http(s), image, view注解, 但依然很轻量级(246K), 并且特性强大, 方便扩展
拥有更加灵活的ORM, 和greenDao一致的性能

四.xUtils3-ORM框架使用步骤

Android ORM框架繁多,走马观花看了大部分框架用法,还是觉得xUtils3比较方便使用!
xUtils3源码和sample:https://github.com/wyouflf/xUtils3

吐槽一下:xUtils3在ORM框架这块文档说明和代码注释实在太少了!
好在ORM源码不复杂,走一走流程就可以大概看懂!

1.在Application全局初始化

@Override
public void onCreate() {
    super.onCreate();
    x.Ext.init(this);
    x.Ext.setDebug(BuildConfig.DEBUG); //是否输出debug日志,影响性能
    ...
}

2.创建实体类(与数据库表映射)


@Table(name = "child") // 使用注解@Table @Column声明表列
public class Child {
    @Column(name = "id", isId = true)
    private int id;

    @Column(name = "name")
    private String name;

    @Column(name = "email")
    private String email;

    @Column(name = "parentId" /*, property = "UNIQUE"//如果是一对一加上唯一约束*/)
    private long parentId; // 外键表id

    // 被忽略,不存入数据库
    private String willIgnore;

    @Column(name = "text")
    private String text;

    public long getParentId() {
        return parentId;
    }

    public void setParentId(long parentId) {
        this.parentId = parentId;
    }

    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 String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getWillIgnore() {
        return willIgnore;
    }

    public void setWillIgnore(String willIgnore) {
        this.willIgnore = willIgnore;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

3.增删改查CRUD


DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()
        .setDbName("test.db")
        // 不设置dbDir时, 默认存储在app私有目录.
        .setDbDir(new File("/sdcard")) // "sdcard"的写法并非最佳实践, 这里为了简单, 先这样写了.
        .setDbVersion(2)
        .setDbOpenListener(new DbManager.DbOpenListener() {
            @Override
            public void onDbOpened(DbManager db) {
                // 开启WAL, 对写入加速提升巨大
                db.getDatabase().enableWriteAheadLogging();
            }
        })
        .setDbUpgradeListener(new DbManager.DbUpgradeListener() {
            @Override
            public void onUpgrade(DbManager db, int oldVersion, int newVersion) {
                // TODO: ...
                // db.addColumn(...);
                // db.dropTable(...);
                // ...
                // or
                // db.dropDb();
            }
        });

private void testDb() throws DbException {
    DbManager db = x.getDb(daoConfig );
    // 1.插入(没有表,会创建)——————————————————————————
    // 1.1插入一条
    Child child = new Child();
    child.setName("childname");
    db.save(child);
    // 1.2插入多条
    List<Child> childList = new ArrayList<>();
    childList.add(child);
    childList.add(child);
    db.save(childList);

    // 2.查找——————————————————————————
    // 2.1不用select()筛选列,返回结果Child类 或List<Child>
    Child child2 = db.selector(Child.class).where("id", "=", new String[]{"1"}).findFirst();
    List<Child> childList2 = db.selector(Child.class).where("id", "between", new String[]{"1", "5"}).findAll();
    // 2.2使用select()筛选列,返回结果DbModel 或List<DbModel>
    DbModel dbModel = db.selector(Parent.class).select("name").findFirst();
    List<DbModel> dbModels = db.selector(Parent.class).select("name").findAll();
    // 2.3使用原生sql查询语句,多表內连接查询
    Cursor cursor = db.execQuery("select name from child, parent where parent.id = child.id");

    // 3.修改——————————————————————————
    child.setName("xxx");
    child.setEmail("xxx@qq.com");
    db.update(child);// 根据child的id更新
    db.update(Child.class, WhereBuilder.b("name", "=", "childname"),
            new KeyValue("name", "xxx"));

    // 4.删除——————————————————————————
    db.delete(child);// 根据child的id删除
    db.delete(Child.class, WhereBuilder.b("name", "=", "xxx"));
}

// 性能测试————————————————————————————
private void testDb2() {
    tv_db_result.setText("wait...");
    x.task().run(new Runnable() {
        @Override
        public void run() {
            // 后台线程
            DbManager db = x.getDb(daoConfig);
            String result = "";
            int count = 10000;
            long start;
            List<Parent> parentList = new ArrayList<>();
            for (int i = 0; i < count; i++) {
                Parent parent = new Parent();
                parent.setAdmin(true);
                parent.setDate(new java.sql.Date(1234));
                parent.setTime(new Date());
                parent.setEmail(i + "_@qq.com");
                parentList.add(parent);
            }

            // 批量插入————————————————————————————
            start = System.currentTimeMillis();
            try {
                db.save(parentList);
            } catch (DbException ex) {
                ex.printStackTrace();
            }
            result += "批量插入" + count + "条数据:" + (System.currentTimeMillis() - start) + "ms\n";

            // 循环插入————————————————————————————
            start = System.currentTimeMillis();
            for (Parent parent : parentList) {
                try {
                    db.save(parent);
                } catch (DbException ex) {
                    ex.printStackTrace();
                }
            }
            result += "循环插入" + count + "条数据:" + (System.currentTimeMillis() - start) + "ms\n";
            count *= 2;

            // 查找————————————————————————————
            start = System.currentTimeMillis();
            try {
                parentList = db.selector(Parent.class).limit(count).findAll();
            } catch (DbException ex) {
                ex.printStackTrace();
            }
            result += "查找" + count + "条数据:" + (System.currentTimeMillis() - start) + "ms\n";

            // 删除————————————————————————————
            start = System.currentTimeMillis();
            try {
                db.delete(parentList);
            } catch (DbException ex) {
                ex.printStackTrace();
            }
            result += "删除" + count + "条数据:" + (System.currentTimeMillis() - start) + "ms\n";

            final String finalResult = result;
            x.task().post(new Runnable() {
                @Override
                public void run() {
                    // UI线程
                    tv_db_result.setText(finalResult);
                }
            });
        }
    });
}

简书: http://www.jianshu.com/p/ad04259ed980
优快云博客: http://blog.youkuaiyun.com/qq_32115439/article/details/72034554
GitHub博客:http://lioil.win/2017/05/14/Android_ORM.html
Coding博客:http://c.lioil.win/2017/05/14/Android_ORM.html

MiniOrm-for-Android是什么? MiniOrm-for-android  是一款简单,只能,灵活的android ORM框架,完全基于对象进行操作。主要帮助android程序员的快速开发。通过反射将查询的数据智能的转换成 Entity 。省去开发人员手动解析的时间。 功能特点: 小巧,类库大小27k 快速,10000条数据,时长3.6秒 使用简单,支持实体类注解方式,除了实体类之外只需创建一个DAO就可以进行操作。 支持原声的sql语句操作 耦合性低 结构模型: 类关系图: 纯java结构设计,通过接口的设计,将上层业务和实际操作数据库的部分进行分离,开发者可以在此基础上自行实现mysql等数据的支持。下面是java部分核心设计 接入类库: 在项目的程序目录build.gradle中加入 dependencies {      compile 'com.ml.miniorm:miniorm:1.1.8'  } 基本方法: 创建表: StuDao stuDao=new StuDao(); stuDao.createTable();  新增: Student student=new Student();  student.setAge(2);  student.setStuName("王小明"); new StuDao().save(student);  删除:    //1. 根据主键删除student.setId(2);new StudentDao().delete(student); //2.根据其他属性删除 student.setStuName("kkkk");     student.setAge(2); stuDao.delete(student); //3.删除全部 stuDao.deleteAll(); 更新:  // (注意,需指定ID) student.setId(2); student.setStuName("kkkk"); stuDao.update(student); 查询: //全部 List<Student> list=stuDao.queryAll(); //query  by id stuDao.queryById(1)||stuDao.queryById(“1” 精确条件查询 可以写sql语句 然后直接调用方法 teacherDao.executeQuery("select * from usertable",teacherDao.getQueryEntity(),teacherDao.getReflexEntity() ); 调用QueryBuilder //查询 全部 性别为 女 List listaaa=teacherDao.getQueryBuilder().callQuery().queryAll().where(Where.handle().eq("sex","女")).executeQueryList(); List<Teacher> listaaa=teacherDao.getQueryBuilder().callQuery().queryAll().where(Where.handle().and("sex","=","女")).executeQueryList(); //模糊查询 List<CustomerBean> list = customerBeanDao.getQueryBuilder().callQuery().queryAll().where(Where.handle().and("userName", " like ", "%" tiaojian "%").or().and("company", " like ", "%" tiaojian "%").or().and("nickname", " like ", "%" tiaojian "%")).executeQueryList(); //对应的 sql select * from CustomerBean where userName like '%你曾%' or company like '%你曾%' or nickname like '%你曾%' ; //根据主键分页 int lastid = teacherDao.queryLastInsertId(); String table = teacherDao.getReflexEntity().getTableEntity().getTableName(); String column = teacherDao.getReflexEntity().getTableIdEntity().getColumnName(); List list1 = teacherDao.getQueryBuilder().callQuery().queryAll().where(Where.handle().and(column, "<=", lastid).and(column, ">", lastid - 标签:MiniOrm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值