OrmLite-更符合面向对象的数据库操作方式
1. jar包下载
下载地址:http://ormlite.com/releases/,一般用core和android包即可。
如果使用的是android studio,也可以直接通过module settings加入依赖。
2. 实体类
使用OrmLite创建表不需要写任何SQL语句,而是通过创建一个对应的实体类,通过这一实体类建表,即一张表对应一个实体类,而数据表中的字段以及字段属性则通过给实体类的属性添加注解进行设置。这也就是OrmLite比起安卓原生的数据库操作方式更符合面向对象思想的地方。
需要注意的是,实体类必须有无参的构造函数,否则会报错。
常用注解:
@DatabaseTable(tableName="table_name"):加在类定义前,设置表名,不设置则默认表名为实体类的类名。
@DatabaseField:实体类的属性前若加了这个注解,则该属性作为数据表的字段,不加的话,创建数据表时则忽略该属性。
常用参数有:generatedId:true则声明该字段为主键并自动增长;
columnName:设置字段名,不设置则默认同属性名;
dataType:设置数据类型,不设置则同属性类型,类型定义在DataType中;
canBeNull:设置字段是否允许为空,默认为true;
unique:添加唯一约束;
foreign:设置该字段为外键,一般是引用另一个实体类的ID。比如A实体类中有一个属性B,而数据库中是没有B这样一个数据类型的,则通过外键形式存储B的ID;
foreignAutoRefresh:外键自动更新;
foreignAutoCreate:外键不存在时是否自动添加;
foreignColumnName:指定作为外键的字段,不设置则默认为主键列。
@ForeignCollectionField:自动把所有参照本类的外键元素加入。比如Company公司类有个属性Collection employees记录公司所有员工,而Employee类中有个外键属性参照Company类,那么在添加数据的时候会自动把所有参照了这一ID的员工全部加进来,而不需要手动添加。
@DatabaseTable(tableName = "tb_student")
public class Student {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(columnName = "stu_name", dataType = DataType.STRING, canBeNull = false)
private String name;
@DatabaseField
private int age;
@DatabaseField
private String phone;
public Student(String name, int age, String phone) {
this.name = name;
this.age = age;
this.phone = phone;
}
// 若添加了有参的构造方法,则必须添加显性的无参构造方法
public Student() {}
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 getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
3. 数据库帮助类
定义了实体类之后,就要写一个帮助类进行创建和更新数据库,继承自OrmLiteSqliteOpenHelper,最好为单例模式。
继承的类与SQLiteOpenHelper基本一致,不同的是,OrmLiteSqliteOpenHelper为我们提供了一个TableUtils类进行数据表的添加与删除操作,更加简便,也更加符合面向对象的思想:
创建表:TableUtils.createTable(ConnectionSource connectionSource, Class<? extends Object> dataClass)
删除表:TableUtils.dropTable(ConnectionSource connectionSource, Class<? extends Object> dataClass, boolean igoreErrors)
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private final static int DATABASE_VERSION = 1;
private static DatabaseHelper sHelper;
private DatabaseHelper(Context context) {
super(context, "test.db", null, DATABASE_VERSION);
}
// 单例模式
public static synchronized DatabaseHelper getInstance(Context context) {
if (sHelper == null) {
sHelper = new DatabaseHelper(context);
}
return sHelper;
}
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try {
// 创建表,传入连接源与实体类
TableUtils.createTable(connectionSource, Person.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
}
}
4. 数据库操作类
OrmLite专门封装了一个Dao类对数据库中的数据进行操作,每操作一个数据表,则通过帮助类对象调用getDao()方法获取相应的Dao对象,类型需指定两个泛型,第一个是相应的实体类,第二个是ID的数据类型,例如Dao<Person, Integer> dao = helper.getDao(Person.class);。
插入:
(1)dao.create():参数是相应的实体类对象。
Person p = new Person("Tim", "男", 22);
dao.create(p);
(2)dao.createOrUpdate():插入或更新,即插入记录ID存在时则更新数据。
(3)dao.createIfNotExists():如果插入记录不存在则插入。
更新:更新的方法有两种,第一种是直接调用SQL语句,第二种是通过UpdateBuilder对象实现。
(1)通过dao.updateRaw(String statement, String... arguments):直接调用原生SQL语句,第一个参数为SQL语句,后面的可变参数为占位符对应的值。
dao.updateRaw("update tb_name set name = ?, age = ? where id = ?", "Tim", 22, 2);
(2)通过UpdateBuilder实现:
设置条件的常用函数有:eq()某字段等于多少、gt()大于多少、lt()小于多少、and()并且、or()或者...等等。根据英文记忆比较容易,例如大于gt()->greater than、小于lt()->less than。
// 获取UpdateBuilder对象
UpdateBuilder builder = dao.updateBuilder()
// 设置更新范围
builder.setWhere(update.where().eq("id", 1).or().gt("age", 16));// id等于1或者age大于16
// 设置更新值
builder.updateColumnValue(...)
// 更新
builder.update()
查询:查询的方法有很多种,这里介绍几种比较常用的:
(1)dao.queryForAll():查询全部记录,不需要参数,相当于SQL中的select * from tb_name;
(2)dao.queryForEq(String fieldName, Object value):根据某字段的值查询,第一个参数为字段名,第二个参数为值。
List<Person> persons = dao.queryForEq("name", "Tim");
(3)dao.queryForId(Integer id):根据id查询。
PS:查询也可以通过类似于更新的方法,使用QueryBuilder进行查询。
删除:删除的方法也有多种,可以通过delete()方法传入实体类对象删除相应记录,可以通过deleteById()传入id进行删除,也可以类似更新的方法,通过DeleteBuilder对象进行删除。
5. 事务
通过OrmLite使用事务时,直接把内容装进下面的回调函数中即可,Callable的泛型指定返回值的类型,不需要返回值则传入Void。
TransactionManager.callInTransaction(helper.getConnectionSource(),
new Callable<Void>() {
@Override
public Void call() throws Exception {
// 需要在事务中进行的操作
}
});
OrmLite-更符合面向对象的数据库操作方式的更多相关文章
- 更符合面向对象的数据库操作方式-OrmLite
1. jar包下载 下载地址:http://ormlite.com/releases/,一般用core和android包即可. 如果使用的是android studio,也可以直接通过module s ...
- SEO之HTML优化:让你的网站HTML代码更符合SEO规范
摘要HTML优化是网站内部优化的重点,可能对SEO新手来说,容易忽略.符合搜索引擎习惯的HTML代码是极利于SEO的,可以让你的网站获得更好的搜索引擎排名.如何制作一个标准的HTML网页,如何做HTM ...
- Mysqli面向对象操作数据库
Mysqli面向对象操作数据库 首先配置一下数据库: 接着用PHP中的Mysqli扩展库面向对象查询这个数据表. 操作分为以下几个步骤: 连接数据库 操作数据库 处理结果 关闭资源 <?php ...
- Builgen 插件——IntelliJ IDEA和Eclipse Java Bean Builder模式代码生成器-比lombok更符合需求
builder模式在越来越多的项目中使用,类似于alibaba fastjson JSONObject.fluentPut(),调用一个方法后返回这个对象本身,特别适合构建一些参数超级多的对象,代码优 ...
- FAQ:枚举和常规的值,到底哪种更符合程序使用?
问: 枚举和常规的值,到底哪种更符合程序使用? 答: 肯定是根据不同的场景,做出不同的选择. 如果是不同的值需要不同的逻辑,肯定是枚举好一些.如果只是表示某个取值范围且这个范围会动态变化,用常规的值 ...
- 阿里云更懂你的数据库,免费提供DBA服务
阿里云更懂你的数据库,免费提供DBA服务 阿里云云数据库(RDS)管理控制台近期将全面升级为云数据库管家.云数据库管家的使命是提供便捷的操作.贴心的服务.专业的处理建议,帮助用户管理好云数据库. ...
- ADO数据库操作方式
微软公司的ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组件.它提供了编程语言和统一数据访问方式OLE DB的一个中间层.允许开发人员编写访问数据的代码而不用关心数 ...
- C#面向对象之数据库(理论、插入、修改、删除、查询)
1.数据库的作用:不仅仅是存储,更重要的是将数据进行存储以后怎么样才能方便快捷的查询修改 2.数据库的特点:海量存储.查找速度快.并发性问题控制.安全性.数据完整性(保存在数据库中的数据是正确的.真是 ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 更优美的Oracle数据库上的代码生成器
代码生成器进行了改进,针对Oracle数据库生成更优美的代码.这样生成出来的代码,更像微软的风格,更像C#.NET的标准规范,阅读起来也更优美.把Oracle表字段名默认大写, 有_分割等进行了优化, ...
随机推荐
- Android快速开发常用知识点系列目录
项目构建 Android项目目录结构模板以及简单说明[简单版] Android Studio配置统一管理依赖版本号引用 Android多Module下的Application引用方式 APP开篇 An ...
- Android进程间通信(一):AIDL使用详解
一.概述 AIDL是Android Interface Definition Language的缩写,即Android接口定义语言.它是Android的进程间通信比较常用的一种方式. Android中 ...
- 从零到一详聊如何创建Vue工程及遇到的常见问题
前言 本文也会在github上我的web-study仓库中同步更新,欢迎star. 戳这里,传送 准备工作 判断是否需要FQ或安装镜像,镜像一般可安装国内淘宝镜像,详情可看这里:cnpm npm in ...
- myeclipse附加源码进行查看的方法
在编程过程中,有可能需要用到看源码的情况,那么怎么进行添加源码呢,这里做下记录 首先,先下载javaEE源码(可在网上自由下载) 1.在HttpServlet上右键-->Open Declara ...
- Docker -v 对挂载的目录没有权限 Permission denied
1.问题 今天在使用docker挂载redis的时候老是报错 docker run -v /home/redis/redis.conf:/usr/local/etc/redis/redis.conf ...
- ArcGIS API for JavaScript 4.x 本地部署之IIS法
[导读] 关于如何在默认网站(Default Web Site,物理地址C:\inetpub\wwwroot\)启动,已有很多博客详尽地写好了. 本篇在自建网站(本机)中配置http而非https的j ...
- 一目了然呀的VS2017 Live Test
刚刚试用了一下VS2017中的单元测试,发现,这一次,覆盖测试会自动标记出来.不用像以前一样要他细检查了.这次会自动帮你全部标记出来. 新建单元测试,使用MS的单元测试方案(VSTS使用的时候方便.) ...
- dubbo源码研究(一)
1. dubbo源码研究(一) 1.1. dubbo启动加载过程 我们知道,现在流行注解方式,用spring管理服务,dubbo最常用的就是@Reference和@Service了,那么我首先找到这两 ...
- Linux篇---ftp服务器的搭建
一.前述 企业中linux搭建ftp服务器还是很实用的,所以本文针对centoos7和centoos6搭建服务器教程做个总结. 二.具体 1.显示如下图则表示已安装 vsftp软件.如果未显示则需要安 ...
- 深入Go的底层,带你走近一群有追求的人
目录 缘起 自我介绍的技巧 硬核知识点 什么是plan9汇编 汇编角度看函数调用及返回过程 汇编角度看slice 正确参与Go夜读活动的方式 阅读原文 上周六晚上,我参加了"Go夜读&quo ...