MiniOrm-for-Android是什麼?
MiniOrm-for-android 是一款簡單,只能,靈活的android ORM框架,完全基於對象進行操作。主要幫助android程序員的快速開發。通過反射將查詢的數據智能的轉換成 Entity 。省去開發人員手動解析的時間。
關係的映射支持多對多、一對多,一對一,採用annotationProcessor 生成代理類,進行關係的映射查詢,實現數據懶加載,侵入性小,優化了性能,提高了程序 的效率
github地址:https://github.com/MengLeiGitHub/miniOrm-for-android 歡迎大家提bug
結構圖
功能特點:
類庫小
使用簡單,支持實體類註解方式,除了實體類之外只需創建一個DAO就可以進行操作。
支持原生的sql語句操作
耦合性低
結構模型:
接入方法
在你項目的 build.gradle 文件裏添加如下配置
dependencies {
compile 'com.github.mengleigithub:miniorm-core:2.0.2'
annotationProcessor 'com.github.mengleigithub:miniorm-compiler:1.0.2'
}
使用方法:
框架初始化:
//框架初始化,也可放在activity中
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//test.db數據庫名稱
//1數據庫版本號
MiniOrm.init(this,1,"test.db");
//如果表中新增字段,需要升級數據庫,需要指定那個該表對應的Dao
MiniOrm.addUpdateTable(TeacherDao.class);
//注:如果數據庫版本需要升降級別,並且表未做任何改變,最好不要指定該Dao類,否則會做一些不必要的工作,浪費手機性能
}
}
實體創建:
import com.miniorm.android.ColumnType;
import com.miniorm.annotation.Table;
import com.miniorm.annotation.TableColumn;
import com.miniorm.annotation.TableID;
import com.miniorm.enumtype.Parmary;
@Table(name="student")
public class Student {
@TableID(name="sid",isPrimaryKey=true,defaultVal=0,type= Parmary.AutoIncrement,columnType= ColumnType.INTEGER)
private int id ;
@TableColumn(name="stuname",columnType=ColumnType.TEXT)
private String stuName;
@TableColumn(name="age",columnType=ColumnType.INTEGER)
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "age="+age+" stuname="+stuName+" id="+id;
}
}
註解說明:
- @Table(name=”student”)設置表名 爲 “student”
- @TableID(name=”sid”,isPrimaryKey=true,defaultVal=0,type= Parmary.AutoIncrement,columnType= ColumnType.INTEGER)
依次順序表示 : 字段名= sid ,字段爲表 主鍵 ,默認數字爲 0 ,主鍵爲自動增長,字段類型是
Integer類型
注意:如果主鍵爲自增長的話,那麼columnType= ColumnType.INTEGER必須設置爲INTEGER類型
如果主鍵是自設置的話,無限制,但只能爲 整型(INTEGER)或字符型
含有外鍵對象實體的創建:
package com.test.test;
import com.miniorm.android.ColumnType;
import com.miniorm.annotation.Table;
import com.miniorm.annotation.TableColumn;
import com.miniorm.annotation.TableID;
import com.miniorm.enumtype.Parmary;
@Table(name="userTable")
public class Teacher {
@TableColumn(name="username",columnType= ColumnType.TEXT)
private String userName;
@TableColumn(name="pwd",columnType=ColumnType.TEXT)
private String pwd;
@TableID(isPrimaryKey=true,name="userid",defaultVal=0,type= Parmary.CUSTOM,columnType=ColumnType.INTEGER)
private int id;
@TableColumn(name="sid",isForeignkey=true,columnType=ColumnType.INTEGER,HierarchicalQueries = true)
private Student student;
@TableColumn(name="sex",columnType=ColumnType.VARCHAR)
private String sex;
@TableColumn(name="shengao",columnType=ColumnType.INTEGER)
private int shengao;
@TableColumn(name="isGril",columnType= ColumnType.BOOLEAN,IgnoreBooleanParam = false)
private boolean isGril;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getShengao() {
return shengao;
}
public void setShengao(int shengao) {
this.shengao = shengao;
}
public boolean isGril() {
return isGril;
}
public void setIsGril(boolean isGril) {
this.isGril = isGril;
}
}
####和普通實體創建唯一不同的地方就是含有外鍵的對象
* TableColumn(isForeignkey=true)設置註解的屬性爲外鍵
* HierarchicalQueries = true 表示爲外鍵和主鍵級聯查詢,默認此屬性爲 true
* IgnoreBooleanParam=false 如果在實體類中含有布爾變量,並且該變量保存在了數據庫,那麼該值就是在按照
* teacherDao.queryListByEntity(teacher)或者 teacherDao.queryByEntity(teacher); 查詢的時候,
* 忽視屬性 isGril該值的變量
創建工具類
public class TeacherDao extends androidBaseDao< Teacher> {
@Override
public Teacher getQueryEntity() {
// TODO Auto-generated method stub
Teacher teacher=new Teacher();
return teacher;
}
}
import com.miniorm.android.androidBaseDao;
public class StuDao extends androidBaseDao< Student> {
}
創建表
StuDao stuDao=new StuDao();
stuDao.createTable();
TeacherDao teacherDao=new TeacherDao();
int i=teacherDao.createTable();
ResultType.SUCCESS==i 表示創建成功
ResultType.FAIL==i 表示創建失敗
新增:
Student student=new Student();
student.setAge(2);
student.setStuName("王小明");
Int id=stuDao.save(student);
if(id!=ResultType.FAIL){
Id==新增 對象的id
}
批量新增:
ArrayList<Student> lis2t=new ArrayList<>();
for (int i2=0;i2<10000;i2++){
Student student1=new Student();
student1.setStuName("student"+i2);
student1.setAge(i2);
lis2t.add(student1);
}
stuDao.save(lis2t);
stuDao.saveOrUpdate(lis2t);
- stuDao.save(lis2t); 該方法執行的時候,兩種情況
- 1.該表主鍵設置爲自增長(type = Parmary.AutoIncrement) 該方法執行會在表中新增一條數據
- 2.設置爲自定義主鍵 (type= Parmary.CUSTOM) 的話,指定的主鍵的值如果在表中含有相同的話,則不會執行成功
- stuDao.saveOrUpdate(lis2t); 同樣的和save的方法對比
- 1.如果相同的數據,就算 不指定主鍵,如果其他的屬性值和表中某條數據都相同,該方法也不會在數據庫新增。相反 如果沒有和該數據都相同的,就會新增
- 2.如果指定了主鍵 就會更新原來的數據
刪除:
######Id刪除
Student student1=new Student();
student.setId(2);
stuDao.delete(student);
######根據其他屬性刪除
Student student=new Student();
student.setStuName("kkkk");
student.setAge(2);
stuDao.delete(student);
#####刪除全部
stuDao.deleteAll();
````
<div class="se-preview-section-delimiter"></div>
####更新
<div class="se-preview-section-delimiter"></div>
```java
注意,需指定ID)
student.setId(2);
student.setStuName("kkkk");
stuDao.update(student);
查詢
按照實體查詢
######(注意)
* 指定id,查詢出唯一一個
* 設置其他參數,非id ,如有數據值返回第一個
)
Student student1= stuDao.QueryByEntity(student);
查詢全部
List list=stuDao.queryAll();
按照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 - 10).desc()).executeQueryList();
[類關係使用方法]
一對一
@Table(name="userTable")
public class Teacher {
@TableColumn(name="username",columnType= ColumnType.TEXT)
private String userName;
@TableColumn(name="pwd",columnType=ColumnType.TEXT)
private String pwd;
@TableID(isPrimaryKey=true,name="userid",defaultVal=0,type= Parmary.CUSTOM,columnType=ColumnType.INTEGER)
private long id;
@TableColumn(name="sid",isForeignkey=true,columnType=ColumnType.INTEGER,HierarchicalQueries = true)
private Student student;
@TableColumn(name="sex",columnType=ColumnType.VARCHAR)
private String sex;
@TableColumn(name="shengao",columnType=ColumnType.INTEGER)
private int shengao;
@TableColumn(name="isGril",columnType= ColumnType.BOOLEAN,IgnoreBooleanParam = true)
private boolean isGril;
private ArrayList<Student> students;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public long getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getShengao() {
return shengao;
}
public void setShengao(int shengao) {
this.shengao = shengao;
}
public boolean isGril() {
return isGril;
}
public void setIsGril(boolean isGril) {
this.isGril = isGril;
}
}
@Table(name="student")
public class Student {
@TableID(name="sid",isPrimaryKey=true,defaultVal=0,type= Parmary.AutoIncrement,columnType= ColumnType.INTEGER)
private int id ;
@TableColumn(name="stuname",columnType=ColumnType.TEXT)
private String stuName;
@TableColumn(name="age",columnType=ColumnType.INTEGER)
private int age;
private Teacher teacher;
private List<Teacher> teachers;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@OneToOne
public Teacher getTeacher() {
return teacher;
}
@OneToOne
public Teacher holderTeacher() {
return teacher;
}
@OneToMany
public List<Teacher> getTeachers() {
return teachers;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "age="+age+" stuname="+stuName+" id="+id;
}
}
*一對一的寫法需要,在兩個表中的其中一個設置外鍵關聯,然後在另外的一個類中取值的時候
*可以直接在 get方法上用 @OneToOne 標註,就可以直接拿取到關聯對象
一對多:
*一對多和一對一在表的設計中大體相同,但是表的關聯外鍵必須放在多的一方,
並且在少的一方取對象的時候 要用@OneToMany
如下:
@Table(name="student")
public class Student {
@TableID(name="sid",isPrimaryKey=true,defaultVal=0,type= Parmary.AutoIncrement,columnType= ColumnType.INTEGER)
private int id ;
@TableColumn(name="stuname",columnType=ColumnType.TEXT)
private String stuName;
@TableColumn(name="age",columnType=ColumnType.INTEGER)
private int age;
private Teacher teacher;
private List<Teacher> teachers;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@OneToOne
public Teacher getTeacher() {
return teacher;
}
@OneToMany
public List<Teacher> getTeachers() {
return teachers;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "age="+age+" stuname="+stuName+" id="+id;
}
}
多對一
多對一和一對多一樣只是將誰設置成多或者一 是根據業務上來定的,技術上無差別
多對多
MIniOrm2在設計多對多的表關係和大多的orm框架一樣 都採用了第三個表,可以大大降低開發
的難度和維護的成本
下面來介紹一下多對多的表設置
@Table(name="student")
public class Student {
@TableID(name="sid",isPrimaryKey=true,defaultVal=0,type= Parmary.AutoIncrement,columnType= ColumnType.INTEGER)
private int id ;
@TableColumn(name="stuname",columnType=ColumnType.TEXT)
private String stuName;
@TableColumn(name="age",columnType=ColumnType.INTEGER)
private int age;
private List<Teacher> teachers;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@ManyToMany(bridgingTable=StudentTeacher.class)
public List<Teacher> getTeachers() {
return teachers;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "age="+age+" stuname="+stuName+" id="+id;
}
}
@Table(name="userTable")
public class Teacher {
@TableColumn(name="username",columnType= ColumnType.TEXT)
private String userName;
@TableColumn(name="pwd",columnType=ColumnType.TEXT)
private String pwd;
@TableID(isPrimaryKey=true,name="userid",defaultVal=0,type= Parmary.CUSTOM,columnType=ColumnType.INTEGER)
private long id;
@TableColumn(name="sex",columnType=ColumnType.VARCHAR)
private String sex;
@TableColumn(name="shengao",columnType=ColumnType.INTEGER)
private int shengao;
@TableColumn(name="isGril",columnType= ColumnType.BOOLEAN,IgnoreBooleanParam = true)
private boolean isGril;
private ArrayList<Student> students;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public long getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getShengao() {
return shengao;
}
public void setShengao(int shengao) {
this.shengao = shengao;
}
public boolean isGril() {
return isGril;
}
public void setIsGril(boolean isGril) {
this.isGril = isGril;
}
@ManyToMany(bridgingTable=StudentTeacher.class)
public ArrayList<Student> getStudents(){
return students;
}
}
**中間表
@Table(name="StudentTeacher")
public class StudentTeacher {
@TableID(isPrimaryKey=true,name="utid",defaultVal=0,type= Parmary.AutoIncrement,columnType= ColumnType.INTEGER)
private long id;
@TableColumn(name="sid",isForeignkey=true,columnType=ColumnType.INTEGER,isPrimaryKey = true)
private Student student;
@TableColumn(name="tid",isForeignkey=true,columnType=ColumnType.INTEGER,isPrimaryKey = true)
private Teacher teacher;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
在設置多對多的關係的同時,要指定中間表的class類。
**注意:千萬不要使用JSON工具直接打印對象 否則可能會出現死循環
代碼混淆
-keep class com.miniorm.**
-keepclassmembers class com.miniorm.** { *; }
-keep enum com.miniorm.**
-keepclassmembers enum com.miniorm.** { *; }
-keep interface com.miniorm.**
-keepclassmembers interface com.miniorm.** { *; }
在使用中有任何問題,歡迎反饋給我