热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java注解数据库框架_Java注解知多少之自定义Android数据库框架

嘿嘿小伙伴们,今天是开始又是愉快的周末啦!小伙伴们平时周末都在干嘛,有没有学习啊!学习的小伙伴不妨也来多看看我的文章呀(臭不

嘿嘿小伙伴们,今天是开始又是愉快的周末啦!小伙伴们平时周末都在干嘛,有没有学习啊!学习的小伙伴不妨也来多看看我的文章呀(臭不要脸)。话不多说,我们接着上一节讲的注解,更深层次的使用。

6f4746b4cc34

一、注解在Android中的使用

我们知道,注解的使用在Android项目开发当中是经常用到的,除了一些Android SDK里面自带的注解以及JDK自带的注解,里面还包括一些第三方框架使用的注解,其基本原理都是差不多的,下面来用注解来写一个简单的数据库框架。但是这个框架还是相对来说比较简单的。

Android数据库中原生的数据库的对象相关的类,在这里就简单的介绍一下了,因为只针对注解在Android项目中的使用来举例,让大家更深层次的理解。

6f4746b4cc34

图1.1

我们知道SQLiteDatabase对象在创建的时候是需要SQLiteOpenHelper去创建的,在创建数据库的时候需要创建表及其字段,那么如何用注解来实现我们的数据库框架达到自动建表以及简单的增删改查的效果呢?

二、创建注解实现数据库自动建表

1.创建表名相关的注解

我们知道每个数据库中都有各种各样的表,那么表名的如何用我们的注解去定义呢?看下面的例子

6f4746b4cc34

图2.1.1

根据代码可知,这里定义了一个叫DataBaseTable的注解,生命周期为运行时注解,作用域用的是Type,下面我们这里再写一个bean用来存储这个bean里面的数据,也用这个bean来创建一个表。

6f4746b4cc34

图2.1.2

到这里相信很多小伙伴们应该知道这些注解是干嘛用的了,在这里我们定义了一个表名注解类,其中这个注解有个叫    String value()的方法,这个方法呢,在修饰作用域的时候可以传一个String对象进去,这个String对象就是我们需要建表的    表名。

2.创建表的列名相关的注解

6f4746b4cc34

图2.2.1

6f4746b4cc34

图2.2.2

我们看到,这里我定义了另外两个注解,这两个注解的生命周期也是运行时注解,但是其作用域是在成员变量的。其中图2.2.1的注解呢,使用来实现我们数据库表的列名的,图2.2.2是实现我们数据库表中的自增长id的。我们通过这个注解修饰成员变量,通过反射的原理将表名与bean中的成员变量一一对应就可以实现建表与简单的增删改查了。

3.创建数据库操作相关的类的对象

在这里对这个不做过多表述,我们就以一些代码带过。

6f4746b4cc34

图2.3.1

6f4746b4cc34

图2.3.2

在这里我用DataBaseHepler创建了一个SQLiteDatabase对象,数据库名字为“test”,数据库版本为1,并且放在单例        模式下的DataBaseFactory下面。

4.创建数据库实际操作类

为此我们需要的所有跟数据库相关,表名与列名相关的(注解)类都已经创建好了,现在来创建数据库操作相关的类

首先我们先定义一个接口,这个接口有简单的增删改查的方法。

6f4746b4cc34

图2.4.1

6f4746b4cc34

图2.4.2

这里我们写了一些成员变量分别实现指定的功能,database为数据库操作的对象,entityClass为我们实际要保存的bean(即Test)的class对象,tableName为表名,以及表的缓存等。

在实现数据库增删该查的之前呢,首先我们要创建数据库的表,这时候呢就可以运用到我们之前自定义的注解DataBaseTable、DataBaseFeild、DataBaseKey了。看下列代码

6f4746b4cc34

图2.4.3

这里的initCacheMap方法呢,主要是将数据库的表名跟entityClass中的成员变量建立一对一的键值对关系保存在缓存里面,用于增删改查工作。

6f4746b4cc34

图2.4.4

6f4746b4cc34

图2.4.5

通过反射出我们上面定义的注解类并得到该注解类对应的value值,根据value值拼接自动建表语句

6f4746b4cc34

图2.4.6

6f4746b4cc34

图2.4.7

最后调用database.execSQL(sql)完成最后的建表,其中这里涉及到非常重要的概念叫反射,这里不做过多描述,后续章节将会详细讲解java反射的运用。

这里先抽取一部分代码作为解释,其中就是Field[] fields =entityClass.getDeclaredFields(),是通过class对象反射出该class的所有成员变量并返回一个数组的形式。field.getAnnotation(Annotion.class)可以得到该成员变量的指定的注解类。

5.简单的数据库操作

这里就以插入数据作为例子,其他的增删改查都是大同小异

6f4746b4cc34

图2.5.1

根据遍历缓存的cacheMap的键值对创建ConrtentValues对象,其中需要判断缓存的map里面的成员变量的数据类型创建ContentValues的值,并最终通过database的insert方法插入指定的表中完成数据插入的操作

6f4746b4cc34

图2.5.2

6f4746b4cc34

图2.5.3

在这里简单的通过注解方式与反射的方式实现Android数据库框架设计,当然这里写的数据库框架肯定是不够完善的,一个简单好用、性能良好的数据库框架不仅仅是通过简短的几行代码就可以实现的。

其他的数据库操作需要小伙伴们自行实现啦,可以练练手,当然如果上述存在什么疑问或者有什么良好的建议可以下方评论哟!最后祝大家事业顺心顺意!



推荐阅读
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
author-avatar
清新之乄风666
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有