作为一只菜鸟,练习自定义框架,并不是为了写框架,而是为了更好得学习框架。
一、基础工作
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
来源:CSDN
作者:蜗牛小啵
链接:https://blog.csdn.net/mrdouziming/article/details/104628656