30
2019
11

ORM (Object RelationShip Mapping) 对象关系映射

什么是ORM (Object RelationShip Mapping) 对象关系映射

思想是通过建立class类来实现 类跟关系型数据库MySQL之间的关联。以后操作类来实现数据库的操作。

比如数据库表格信息如下ORM:


idsnameage
1001张三18
1002李四19


将如上数据库表格映射为对象的形式。

1.类跟表结构对应

2.属性跟字段对应

3.对象跟记录对象

通过Java的注解完成类跟表结构的映射关系。定义注解处理流程跟读取注解,实现更复杂功能。demo 如下

public class MyStudent{
	int id;
	String sname;
	int age;
}
--Table 'tb_student'  DDL
CREATE TABLE `tb_student`(
`id` int(10) NOT NULL AUTO_INCREMENT,
`sname` varchar(10) DEFAULT NULL,
`age` int(3) DEFAULT NULL,
PRIMARY KEY(`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
package mytest;


/**
 * 对table 名字的注解  实现类对象跟  MySQL表名的映射
 */

import java.lang.annotation.*;
import java.lang.reflect.Field;

@Target(value = {ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface MyTable
{
	String value();
}


/**
 * 对每个字段的注解,字段的 名字  类型  数据长度  实现对象跟 MySQL 字段的映射
 */

@Target(value = {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyField
{
	String columnName();

	String type();

	int length();
}

/**
 * 用上面两个注解 主键下面的table 实现 ORM
 */

@MyTable("tb_student")
class MyStudent
{
	@MyField(columnName = "id", type = "int", length = 10)
	private int id;
	
	@MyField(columnName = "sname", type = "varchar", length = 10)
	private String studentName;
	
	@MyField(columnName = "age", type = "int", length = 3)
	private int age;

	public int getId()
	{
		return id;
	}

	public void setId(int id)
	{
		this.id = id;
	}

	public String getStudentName()
	{
		return studentName;
	}

	public void setStudentName(String studentName)
	{
		this.studentName = studentName;
	}

	public int getAge()
	{
		return age;
	}

	public void setAge(int age)
	{
		this.age = age;
	}
}

/**
 * 使用反射读取注解的信息,模拟处理注解信息的流程
 *
 * @author ljj
 */
public class Client
{

	public static void main(String[] args)
	{

		try
		{
			Class clazz = Class.forName("mytest.MyStudentM");
			Annotation[] annotations = clazz.getAnnotations();
			for (Annotation a : annotations)
			{
				System.out.println(a);
			}

		} catch (Exception e)
		{
			e.printStackTrace();

		}

		try
		{
			Class clazz = Class.forName("mytest.MyStudent");

			//获得类的所有有效注解
			Annotation[] annotations = clazz.getAnnotations();
			for (Annotation a : annotations)
			{
				System.out.println(a);
			}
			//获得类的指定的注解
			MyTable st = (MyTable) clazz.getAnnotation(MyTable.class);
			System.out.println(st.value());

			//获得类的属性的注解
			Field f = clazz.getDeclaredField("studentName");
			MyField MyField = f.getAnnotation(MyField.class);
			System.out.println(MyField.columnName() + "--" + MyField.type() + "--" + MyField.length());

			//根据获得的表名、字段的信息,拼出DDL语句,然后,使用JDBC执行这个SQL,在数据库中生成相关的表

		} catch (Exception e)
		{
			e.printStackTrace();
		}

	}
}


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。