Android sqlite数据库操作通用框架AHibernate(1)

来源:互联网 发布:守望先锋伤害数据 编辑:程序博客网 时间:2024/06/13 09:29

原文地址: http://blog.csdn.net/lk_blog/article/details/7455992


AHibernate简介

一句话描述,使用AHibernate框架进行sqlite数据库操作您将从重复性劳动中解脱出来.

(一)支持功能:
1.自动建表,支持属性来自继承类:可根据注解自动完成建表,并且对于继承类中的注解字段也支持自动建表.
2.自动支持增删改,增改支持对象化操作:增删改是数据库操作的最基本单元,不用重复写这些增删改的代码,并且添加和更新支持类似于hibernate中的对象化操作.
3.查询方式灵活:支持android框架提供的方式,也支持原生sql方式.
4.查询结果对象化:对于查询结果可自动包装为实体对象,类似于hibernate框架.
5.查询结果灵活:查询结果支持对象化,也支持结果为List<Map<String,String>>形式,这个方法在实际项目中很实用,且效率更好些.

6.日志较详细:因为android开发不支持热部署调试,运行报错时可根据日志来定位错误,这样可以减少运行Android的次数.

(二)不足之处:
1.id暂时只支持int类型,不支持uuid,在sqlite中不建议用uuid.
2.现在每个方法都自己开启和关闭事务,暂时还不支持在一个事务中做多个操作然后统一提交事务.

(三)作者寄语:
昔日有JavaScript借Java发展,今日也希望AHibernate借Hibernate之名发展.希望这个项目以后会成为开源社区的重要一员,更希望这个项目能给所有Android开发者带便利.欢迎访问我的博客:http://blog.csdn.net/lk_blog,这里有这个框架的使用范例和源码,希望朋友们多多交流完善这个框架,共同推动中国开源事业的发展,AHibernate期待与您共创美好未来!!!

框架源代码见下一篇博客:http://blog.csdn.net/lk_blog/article/details/7456125 ,源代码供大家交流使用,欢迎朋友们对代码提供宝贵意见.

先看一个使用例子吧,看看您是否满意:

[java] view plaincopy
  1. package com.tgb.lk.demo;  
  2.   
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import com.tgb.lk.demo.R;  
  7.   
  8. import com.tgb.lk.demo.dao.impl.StudentDaoImpl;  
  9. import com.tgb.lk.demo.dao.impl.TeacherDaoImpl;  
  10. import com.tgb.lk.demo.model.Student;  
  11. import com.tgb.lk.demo.model.Teacher;  
  12.   
  13. import android.app.Activity;  
  14. import android.os.Bundle;  
  15.   
  16. public class MainActivity extends Activity {  
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.main);  
  21.   
  22.         // 熟悉用接口的朋友注意哦,这里也可以定义为接口哦,见StudentDaoImpl.java中的注释.  
  23.         TeacherDaoImpl teacherDao = new TeacherDaoImpl(MainActivity.this);  
  24.         StudentDaoImpl studentDao = new StudentDaoImpl(MainActivity.this);  
  25.   
  26.         // 添加  
  27.         Teacher teacher = new Teacher();  
  28.         teacher.setName("米老师");  
  29.         teacher.setAge(50);  
  30.         teacher.setTitle("教授");  
  31.         Long teacherId = teacherDao.insert(teacher);  
  32.   
  33.         Student student1 = new Student();  
  34.         student1.setName("lk");  
  35.         student1.setAge(26);  
  36.         student1.setClasses("五期提高班");  
  37.         student1.setTeacherId(teacherId.intValue());  
  38.         Long studentId1 = studentDao.insert(student1);  
  39.   
  40.         Student student2 = new Student();  
  41.         student2.setName("cls");  
  42.         student2.setAge(26);  
  43.         student2.setClasses("五期提高班");  
  44.         student2.setTeacherId(teacherId.intValue());  
  45.         Long studentId2 = studentDao.insert(student2);  
  46.   
  47.         Student student3 = new Student();  
  48.         student3.setName("lb");  
  49.         student3.setAge(27);  
  50.         student3.setClasses("五期提高班");  
  51.         student3.setTeacherId(teacherId.intValue());  
  52.         Long studentId3 = studentDao.insert(student3);  
  53.   
  54.         // 查询  
  55.         // 方式1:根据Id查询单个对象  
  56.         // 结果:student1Student [id=1, name=lk,age=26,teacherId=1, classes=五]  
  57.         Student student4 = studentDao.get(studentId1.intValue());  
  58.         System.out.println("student4" + student4);  
  59.   
  60.         // 方式2:查询出表中的所有记录  
  61.         // 执行结果如下:  
  62.         // list1:Student [id=1, name=lk,age=26,teacherId=1, classes=五期提高班]  
  63.         // list1:Student [id=2, name=cls,age=26,teacherId=1, classes=五期提高班]  
  64.         // list1:Student [id=3, name=lb,age=27,teacherId=1, classes=五期提高班]  
  65.         List<Student> list1 = studentDao.find();  
  66.         for (Student student : list1) {  
  67.             System.out.println("list1:" + student);  
  68.         }  
  69.   
  70.         // 方式3:限制条件查询和查询结果  
  71.         // 执行结果:list2:Student [id=2, name=cls,age=0,teacherId=0, classes=null]  
  72.         List<Student> list2 = studentDao.find(new String[] { "id""name" },  
  73.                 " id = ? "new String[] { studentId2.toString() }, nullnull,  
  74.                 nullnull);  
  75.         for (Student student : list2) {  
  76.             System.out.println("list2:" + student);  
  77.         }  
  78.   
  79.         // 方式4:使用sql查询出结果,此种方式是2,3,4中最灵活的.  
  80.         // 执行结果:  
  81.         // list3:Student [id=2, name=cls,age=26,teacherId=1, classes=五期提高班]  
  82.         // list3:Student [id=3, name=lb,age=27,teacherId=1, classes=五期提高班]  
  83.         List<Student> list3 = studentDao.rawQuery(  
  84.                 "select * from t_student where id in (?,?) "new String[] {  
  85.                         studentId2.toString(), studentId3.toString() });  
  86.         for (Student student : list3) {  
  87.             System.out.println("list3:" + student);  
  88.         }  
  89.   
  90.         // 方式4进阶:如果想查询出米老师的学生,可以这样实现:  
  91.         // 执行结果:  
  92.         // list4:Student [id=1, name=lk,age=26,teacherId=1, classes=五期提高班]  
  93.         // list4:Student [id=2, name=cls,age=26,teacherId=1, classes=五期提高班]  
  94.         // list4:Student [id=3, name=lb,age=27,teacherId=1, classes=五期提高班]  
  95.         List<Student> list4 = studentDao  
  96.                 .rawQuery(  
  97.                         "select s.* from t_student s join t_teacher t on s.teacher_id = t.id where t.name= ? ",  
  98.                         new String[] { "米老师" });  
  99.         for (Student student : list4) {  
  100.             System.out.println("list4:" + student);  
  101.         }  
  102.   
  103.         // 方式5:我只想知道姓名和年龄,查询得到List<Map<String,String>>形式.只查2个字会比查询所有字段并封装为对象效率高吧,尤其字段值很多时我们的手机更喜欢这种方式哦.  
  104.         // 结果:  
  105.         // listMap1: name:lk;age:26  
  106.         // listMap1: name:cls;age:26  
  107.         // listMap1: name:lb;age:27  
  108.         List<Map<String, String>> listMap1 = studentDao.query2MapList(  
  109.                 "select name,Age from t_student "null);  
  110.         for (Map<String, String> map : listMap1) {  
  111.             // 查询的List中的map以查询sql中的属性值的小写形式为key,注意是小写形式哦.  
  112.             System.out.println("listMap1: name:" + map.get("name") + ";age:"  
  113.                     + map.get("age"));  
  114.         }  
  115.   
  116.         // 方式5进阶:我想知道前2名学生的姓名和班主任姓名,这种方式是不是超灵活啊,用其他的方式查询都没这种方式好用吧,哈哈.  
  117.         // 结果:  
  118.         // listMap2: student_name:lk;teacher_name:米老师  
  119.         // listMap2: student_name:cls;teacher_name:米老师  
  120.         List<Map<String, String>> listMap2 = studentDao  
  121.                 .query2MapList(  
  122.                         "select s.name sname,t.name tname from t_student s join t_teacher t on s.teacher_id = t.id limit ? ",  
  123.                         new String[] { "2" });  
  124.         for (Map<String, String> map : listMap2) {  
  125.             System.out.println("listMap2: student_name:" + map.get("sname")  
  126.                     + ";teacher_name:" + map.get("tname"));  
  127.         }  
  128.   
  129.         // 更新  
  130.         // 结果: Student [id=1, name=李坤,age=26,teacherId=1, classes=五期提高班]  
  131.         student1 = studentDao.get(studentId1.intValue());  
  132.         student1.setName("李坤");  
  133.         student1.setClasses("五期提高班");  
  134.         studentDao.update(student1);  
  135.         System.out.println(student1);  
  136.   
  137.         // 删除:支持单个id删除,也支持多个id同时删除哦.  
  138.         studentDao.delete(studentId1.intValue());  
  139.         studentDao.delete(new Integer[] { studentId2.intValue(),  
  140.                 studentId3.intValue() });  
  141.   
  142.         // 支持执行sql语句哦.  
  143.         teacherDao.execSql("insert into t_teacher(name,age) values('米教授',50)",  
  144.                 null);  
  145.   
  146.     }  
  147. }  

使用AHibernate步骤:

步骤1.引入AHibernate-1.0.jar  下载地址: http://download.csdn.net/detail/lk_blog/4222048 解压后有源码和jar包,这个jar体积非常小,仅有十几K,对您的程序整体大小不会产生影响哦.

步骤2.建实体类

Person.java:

[java] view plaincopy
  1. package com.tgb.lk.demo.model;  
  2. import com.tgb.lk.ahibernate.annotation.Column;  
  3. import com.tgb.lk.ahibernate.annotation.Id;  
  4. //此处没有加Table属性,它是其他类的基类,本类中用@Column注解的字段在子类中同样会被创建到表中.  
  5. public class Person {  
  6.     @Id  
  7.     @Column(name = "id")  
  8.     private int id; // 主键,int类型,数据库建表时此字段会设为自增长  
  9.   
  10.     @Column(name = "name", length = 20)  
  11.     private String name; // 名字长度一般不会超过20个字符吧,length=20数据字段的长度是20  
  12.   
  13.     @Column(name = "age", type = "INTEGER")  
  14.     private int age; // 年龄一般是数值,用type = "INTEGER"规范一下吧.  
  15.   
  16.     // //假设您开始时没有此属性,程序开发中才想到此属性,去掉代码注释试试吧,数据库增删改查不用修改任何代码哦.  
  17.     // @Column(name = "sex")  
  18.     // private String sex;  
  19.   
  20.     // 有些字段您可能不希望保存到数据库中,不用@Column注释就不会映射到数据库.  
  21.     private String noSaveFild;  
  22.   
  23.     //get和set方法.  
  24.     //....  
  25.   
  26.     @Override  
  27.     public String toString() {  
  28.         return "id=" + id + ", name=" + name + ",age=" + age;  
  29.     }  
  30. }<span style="font-size:18px;">  
  31. </span>  
Teacher.java
[java] view plaincopy
  1. package com.tgb.lk.demo.model;  
  2. import com.tgb.lk.ahibernate.annotation.Column;  
  3. import com.tgb.lk.ahibernate.annotation.Table;  
  4.   
  5. //自动生成的建表语句:  
  6. //crate table [t_teacher]: CREATE TABLE t_teacher (id INTEGER primary key autoincrement, title TEXT, name TEXT(20), age INTEGER )  
  7.   
  8. @Table(name = "t_teacher")  
  9. public class Teacher extends Person {  
  10.     @Column(name = "title")  
  11.     private String title;// 职称  
  12.   
  13.     //get和set方法.  
  14.     //....  
  15.   
  16.     @Override  
  17.     public String toString() {  
  18.         return "Teacher [" + super.toString() + ",title=" + title + "]";  
  19.     }  
  20. }<span style="font-size:18px;">  
  21. </span>  
Student.java
[java] view plaincopy
  1. package com.tgb.lk.demo.model;  
  2.   
  3. import com.tgb.lk.ahibernate.annotation.Column;  
  4. import com.tgb.lk.ahibernate.annotation.Table;  
  5.   
  6. //自动生成的建表语句:  
  7. //CREATE TABLE t_student (id INTEGER primary key autoincrement, classes TEXT, teacher_id INTEGER, name TEXT(20), age INTEGER )  
  8.   
  9. @Table(name = "t_student")  
  10. public class Student extends Person {  
  11.   
  12.     @Column(name = "teacher_id")  
  13.     private int teacherId;// 班主任id  
  14.   
  15.     @Column(name = "classes")  
  16.     private String classes;// 班级  
  17.   
  18.     //get和set方法  
  19.     //...  
  20.   
  21.     @Override  
  22.     public String toString() {  
  23.         return "Student [" + super.toString() + ",teacherId=" + teacherId  
  24.                 + ", classes=" + classes + "]";  
  25.     }  
  26. }<span style="font-size:18px;">  
  27. </span>  
步骤3:

 DBHelper.java

[java] view plaincopy
  1. package com.tgb.lk.demo.util;  
  2.   
  3. import com.tgb.lk.ahibernate.util.MyDBHelper;  
  4. import com.tgb.lk.demo.model.Student;  
  5. import com.tgb.lk.demo.model.Teacher;  
  6. import android.content.Context;  
  7.   
  8. public class DBHelper extends MyDBHelper {  
  9.     private static final String DBNAME = "school.db";// 数据库名  
  10.     private static final int DBVERSION = 1;  
  11.     private static final Class<?>[] clazz = { Teacher.class, Student.class };// 要初始化的表  
  12.   
  13.     public DBHelper(Context context) {  
  14.         super(context, DBNAME, null, DBVERSION, clazz);  
  15.     }  
  16.   
  17. }<span style="font-size:18px;">  
  18. </span>  

步骤4:

StudentDaoImpl.java

[java] view plaincopy
  1. package com.tgb.lk.demo.dao.impl;  
  2.   
  3. import com.tgb.lk.ahibernate.dao.impl.BaseDaoImpl;  
  4. import com.tgb.lk.demo.model.Student;  
  5. import com.tgb.lk.demo.util.DBHelper;  
  6. import android.content.Context;  
  7.   
  8. //如果您是J2EE高手一定希望支持接口吧,按下面的写法即可:  
  9. //写一个接口:public interface StudentDao extends BaseDao<Student> {}  
  10. //实现接口: public class StudentDaoImpl extends BaseDaoImpl<Student> implements StudentDao  
  11. public class StudentDaoImpl extends BaseDaoImpl<Student> {  
  12.     public StudentDaoImpl(Context context) {  
  13.         super(new DBHelper(context));  
  14.     }  
  15. }<span style="font-size:18px;">  
  16. </span>  
TeacherDaoImpl.java
[java] view plaincopy
  1. package com.tgb.lk.demo.dao.impl;  
  2.   
  3. import com.tgb.lk.ahibernate.dao.impl.BaseDaoImpl;  
  4. import com.tgb.lk.demo.model.Teacher;  
  5. import com.tgb.lk.demo.util.DBHelper;  
  6. import android.content.Context;  
  7.   
  8. public class TeacherDaoImpl extends BaseDaoImpl<Teacher> {  
  9.     public TeacherDaoImpl(Context context) {  
  10.         super(new DBHelper(context));  
  11.     }  
  12. }<span style="font-size:18px;">  
  13. </span>  

步骤5: 

运行文章开始处的例子试试吧.

程序运行时会根据注解自动建表,增删改查的数据库访问层不用写其他的代码就能直接使用.

最后,补充一些关于查看日志的内容,日志可是我们调试程序的利器哦:

(1)在LogCat中设置查看日志:

(2)日志输出结果:


1.0版源码和示例下载地址: http://download.csdn.net/detail/lk_blog/4222048

AHibernate1.1已经发布,下载地址: http://download.csdn.net/detail/lk_blog/4786640


0 0
原创粉丝点击