【ORM】框架映射迷你版
什么是ORM呐,以下是网上找到的两个解释、感觉挺好、推荐给大家:
ORM(Object/Relation Mapping)解决的主要问题是对象-关系的映射。域模型和关系模型分别建立在概念模型的基础上。域模型是面向对象的,而关系模型是面向关系的,一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录。
————————————————————————————————————————————————————
ORM的主要目的是通过类和对象操作数据库,所以在ORM中必须解决编程语言中的类与对象和数据库中的表之间的映射。
(1)类与数据库中表的映射:数据库中的每一张表对应编程语言中的一个类,当用户对类进行基本操作(如创建实现,修改对象的属性,删除一个实例)时,ORM框架会自动对数据库中的表进行相应的CURD操作。
(2)对象与表中记录的映射:关系数据库中的一张表可能有多条记录,每条记录对应类的一个实例,当用户对一个对象进行修改时,ORM框架会自动对数据表中的相应记录进行修改。
(3)类的属性与数据库中表的字段的映射:数据库中表的字段的数据类型与类中的属性的类型也是一一对应的。
————————————————————————————————————————————————————
反射的应用场景挺多的,比如jdbc、spring IOC、常用框架、一些注解的实现,这次的ORM框架映射的迷你版呐就用到了这些注解,话不多说了、进入主题,进入主题的最好方式就是举个例子:
首先定义两个注解:
/**
* 表的别名
* Created by phoebeM on 2018/05/24.
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface SetTable {
String value();
}
/**
* 属性注解
* Created by phoebeM on 2018/05/24.
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface SetProperty {
String name();
int leng();
}
定义使用注解的实体类:
@SetTable("user_table")
public class UserEntity {
@SetProperty(name = "user_name",leng = 10)
private String userName;
@SetProperty(name = "user_age",leng = 10)
private Integer userAge;
//省略get、set
}
具体的ORM是怎么起作用的呐?简单说明一下
说之前介绍一下知识点:
getAnnotations获取注解
SetProperty setProperty = declareFields[i].getAnnotation(SetProperty.class);
获取SetProperty类的注解
SetTable setTable = forName.getAnnotation(SetTable.class);
获取SetTable类的注解
formName.getAnnotations()这个是获取类上的注解,属性的注解获取不到
获取类的字段有两种方式:getFields()和getDeclaredFields(),这两者的区别吧:
getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
public static void main(String[] args) throws ClassNotFoundException {
//方法的作用,就是初始化给定的类
Class<?> forName = Class.forName("com.example.demo.domain.UserEntity");
//拼接sql语句stringBuffer
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(" select ");
Field[] declareFields = forName.getDeclaredFields();
for (int i = 0; i < declareFields.length; i++) {
SetProperty setProperty = declareFields[i].getAnnotation(SetProperty.class);
String property = setProperty.name();
stringBuffer.append(property);
if (i == (declareFields.length -1)){
stringBuffer.append(" form ");
}else {
stringBuffer.append(" , ");
}
}
//获取某个注解对象
SetTable setTable = forName.getAnnotation(SetTable.class);
//表的名称
String tabelName = setTable.value();
stringBuffer.append(" " + tabelName);
//select user_name,user_age from user_table
System.out.println(stringBuffer.toString());
}
总结:
通过获取注解,得到值进而拼接sql,小例子大智慧哈
感谢分享:
http://www.jb51.net/article/117468.htm
https://www.cnblogs.com/JackZed/p/6888668.html
https://blog.csdn.net/u013539003/article/details/48293429
https://blog.csdn.net/qq_24145735/article/details/52181052
上一篇: 八小时实现迷你版vuejs四:实现compile和Directive
下一篇: 排序算法之桶排序
推荐阅读
-
golang常用库之操作数据库的orm框架-gorm基本使用详解
-
obc、odbc、orm的持久化框架有哪些?
-
Python ORM框架SQLAlchemy学习笔记之数据查询实例
-
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
-
Python ORM框架SQLAlchemy学习笔记之关系映射实例
-
我的第一个python web开发框架(31)——定制ORM(八)
-
Kohana框架ORM类的基本使用,kohana框架orm
-
php NotORM(PHP的ORM框架)示例代码
-
用 Composer构建自己的 PHP 框架之使用 ORM_php实例
-
使用Python的web.py框架实现类似Django的ORM查询的教程