自定义ORM框架【菜鸟入门日记1——前期准备】

会有一股神秘感。 提交于 2020-03-04 05:21:00

作为一只菜鸟,练习自定义框架,并不是为了写框架,而是为了更好得学习框架。

 

一、基础工作

1.建包

  • annotation 注解包,用于自定义注解
  • core           核心代码包,包括会话工厂、SQL执行
  • execption   自定义框架的异常体系(对于初学者阶段,其实没啥用,就当提升下逼格了)
  • meta          对象关系映射,负责映射实体类与表的映射,属性名与字段的映射
  • session与sessionImpl  会话包以及会话实现包
  • support      支持包,可以理解为工具包,为框架提供各种小工具
  • model        实体包,【只是用于测试,最后不会导出】
  • test             测试包,【只是用于测试,最后不会导出】

什么叫做“最后不会导出”:我们编写的自定义ORM框架,最后会被封装成一个jar包,可以让我们在其他项目中使用。

其余操作:

  • src根目录下的配置文件 orm.properties【只是用于测试,最后不会导出】
  • lib包下的mysql JAR包,用于配置JDBC【只是用于测试,最后不会导出】

orm.properties

2.项目结构总览

3.大致思路

本ORM框架,通过注解实现。通过会话工厂,开启会话,对数据库进行操作。

难点1:扫包。通过配置文件orm.properties,指定实体类存放的位置,即model包的位置。用support包中的PackageSanner,进行扫描,得出所有实体类的字节码文件。

难点2:映射关系。在会话工厂中,写一个parse方法,用来将难点1中,获取的字节码文件,转换成映射关系对象。这里不难理解,我们的实体类中,充满各种注解——既然获取了字节码文件,就等于知道了这些注解。只需根据这些注解,去完成映射关系即可。

难点3:查询语句时,利用Adapter接口,将结果集转换为T对象(泛型)。

 

二、基本代码

1.annotation包中的3个自定义注解

/*
 * 实体类的注解
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity {
	/*
	 * 表名 
	 */
	public String tableName();
}


/*
 * 字段的注解
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
	/*
	 * 字段的名字
	 */
	public String name();
	
}

/*
 * 主键是否自增
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Id {
	/*
	 * 定义属性时,可以使用default关键字给属性默认值
	 */
	public boolean auto() default true;
}


2.model包中,写2个实体,方便测试。这里我们主要用User来测试。

注解的对应关系:类名——表名,属性名——字段名

//第一个实体
@Entity(tableName="t_user")
public class User {
	//实体的属性
	@Id()
	@Column(name="user_id")
	private int UserId;
	@Column(name="user_name")
	private String userName;
	@Column(name="pass_word")
	private String passWord;
	@Column(name="tel")
	private String tel;
	@Column(name="age")
	private int age;
	@Column(name="sex")
	private String sex;
    //get set toString 略
}

//第二个实体
@Entity(tableName="t_product")
public class Product {
	@Id()
	@Column(name="product_id")
	private int productId;
	@Column(name="product_name")
	private String productName;
	//get set toString 略
}

3.support包中,2个最基础的工具类,读取配置文件和配置JDBC

4.exception包中,2个自义定异常

注意,ORMException继承的是RuntimeException,这里不要乱继承。

public class ORMExecption extends RuntimeException

public class SupportException extends ORMExecption

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!