android 持久化工具 MiniOrm-for-Android

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.** { *; }

在使用中有任何問題,歡迎反饋給我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章