1,什么是ORM?
object-relation-mapper 对象,关系,映射。在java中一切都是对象,而关系数据库中却是关系的存在,所以需要进行对象和关系的映射从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。说白了就是把关系型数据库封装成业务实体对象,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。
orm实现的4个部分:
一个对持久类对象进行CRUD操作的API;
一个语言或API用来规定与类和类属性相关的查询;
一个规定Mapping METADATA的工具;
一种技术可以让ORM的实现同事务对象一起进行DIRTYCHECKING, LAZY ASSOCIATION FETCHING以及其他的优化操作。
2.什么是数据持久化?
狭义的理解,持久化仅仅是指把对象数据永久保存在数据库中,数据在计算机中一般由两个存储地,内存为暂存,数据库可以理解为永存;广义的理解,持久化包括和数据库相关的各种操作,封装了数据访问细节,为大部分业务逻辑提供面向对象的API。
数据持久化的好处?
1、松散耦合,程序代码重用性强,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码。
2、业务逻辑代码可读性强,在代码中不会有大量的SQL语言,提高程序的可读性。
3、持久化技术可以自动优化,以减少对数据库的访问量,提高程序运行效率。
3.通过annotation(注解)来实现数据的持久化
首先建立一个对应数据库中“关系”的对象
1 package annotation; 2 3 @Table("db_student")//配置对应的数据库表 类---数据库中的表 4 public class Student { 5 6 @Fieldzzh(columnName="studentName",type="varchar",length=10)//配置对应数据库中列的数据库细节 属性--数据库列 7 private String studentName; 8 @Fieldzzh(columnName="sex",type="varchar",length=2)//配置对应数据库中列的数据库细节 属性--数据库列 9 private String sex; 10 }
建立两个注解文件,一个对应整个Student类的注解,一个对应类中 每个属性的注解
package annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(value = { ElementType.TYPE })//用于的对象target @Retention(RetentionPolicy.RUNTIME)//运行的生命周期 public @interface Table { String value(); }
package annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(value={ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface Fieldzzh { String columnName(); String type(); int length(); //还可以写主键,非空等等,把对象中的属性完全对应于数据库 }
在这里便基本完成了整个数据库的简单持久化过程,下面写一个持久化类,里面写上一切增加,修改....相关数据库操作
package annotation; import java.lang.annotation.Annotation; import java.lang.reflect.Field; public class TestZhuzihan { public static void main(String[] args) throws NoSuchFieldException, SecurityException { try { Class stuClass = Class.forName("annotation.Student"); //获得类的所有注解 Annotation[] annotations = stuClass.getAnnotations(); for(Annotation annotation : annotations){ System.out.println(annotation); } //获得需要属性注解 Field field = stuClass.getDeclaredField("studentName"); Fieldzzh fieldzzh=field.getAnnotation(Fieldzzh.class); System.out.println("得到数据库对应实体"+fieldzzh.columnName()+"--"+fieldzzh.type()+"--"+fieldzzh.length()); } catch (ClassNotFoundException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }
@annotation.Table(value=db_student)
得到数据库对应实体studentName--varchar--10
上面是运行结果
属性对应数据库中的列,但是列的细节就需要注解来配置了
这大概就是每次映射都必须要用到Class的原因吗,因为Class可以得到注解。
大部分是自己通过自己的理解组织的,忘指正。