前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手写一个orm框架-2

手写一个orm框架-2

作者头像
何白白
发布2019-06-28 12:06:21
3930
发布2019-06-28 12:06:21
举报
文章被收录于专栏:何白白开发记录

手写一个orm框架-2

创建映射关系

​ 想要实现一个orm的功能,我觉得就是要将class和数据库中的表创建映射关系。把class的名称和表的名称,class属性名称和表的字段名称,属性类型与表的字段类型一一对应起来。可以通过配置文件,注解等等各种方式实现这个映射关系。

需要的依赖

​ 因为编写配置文件总是一件十分繁琐的事情,所以我决定使用注解的方式来实现这个映射。在项目刚开始写的时候我用的是自定义注解的方法。自己规定一套注解,后来觉得这样没有太大的必要,因为已经有jpa里的一套注解。所以直接用就好了。所以添加依赖:

代码语言:javascript
复制
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>persistence-api</artifactId>
    <version>1.0</version>
</dependency>

这里主要使用里面的三个注解:

  1. @Id 添加在作为id 的字段上,标示为一个id,一个表中只能有一个id
  2. @Column 添加在作为属性的字段上,name里填写表中的字段名称。
  3. @Table 添加在作为属性的字段上,name里填写表的名称。

其他的一些注解暂时不需要,因为我不需要完整的实现jpa里面功能。

这样就可以将一个class和一个表映射起来了。完成之后一个class大致上是这样的:

sql:

代码语言:javascript
复制
CREATE TABLE `user` (                                                          
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',                         
  `name` varchar(225) DEFAULT NULL COMMENT '用户名',                              
  `create_date` datetime DEFAULT NULL,                                         
  `status` int(11) DEFAULT NULL,                                               
  `age` int(11) DEFAULT NULL COMMENT '年龄',                                     
  `mark` varchar(225) DEFAULT NULL,                                            
  PRIMARY KEY (`id`)                                                           
) ENGINE=InnoDB AUTO_INCREMENT=2104778081 DEFAULT CHARSET=latin1 COMMENT='用户表' 

class:

代码语言:javascript
复制
import java.util.Date;
import javax.persistence.Table;
import javax.persistence.Column;
import javax.persistence.Id;

/**
 * 用户表
 *
 * @author hejiaxuan
 */
@Table(name = "user")
public class User {

    /**
     * 用户名
     */
    @Column(name = "name")
    private String name;

    /**
     * 用户id
     */
    @Id
    @Column(name = "id")
    private int id;

    /**
     * 年龄
     */
    @Column(name = "age")
    private int age;

    /**
     * mark
     */
    @Column(name = "mark")
    private String mark;

    /**
     * create_date
     */
    @Column(name = "create_date")
    private Date createDate;

    /**
     * status
     */
    @Column(name = "status")
    private int status;

	//getter and setter and toString
}

数据类型

​ 上面在将各种名称做了映射之后,还要根据java中的数据类型和sql中的数据类型添加一下映射关系,因为class中的数据类型和sql中的并不通用。

​ 这个东西简单做的话其实不需要开发,在jdbc的ResultSet类中提供了一系列的方法:

代码语言:javascript
复制
String ResultSet.getString;
boolean ResultSet.getBoolean;
byte ResultSet.getByte;
short ResultSet.getShort;
int ResultSet.getInt;
long ResultSet.getLong;
float ResultSet.getFloat;
double ResultSet.getDouble;
BigDecimal ResultSet.getBigDecimal;
Bytes ResultSet.getBytes;
Date ResultSet.getDate;
Time ResultSet.getTime;

​ 这里可以根据class的属性类型来分别的调用,也可以直接调用:Object ResultSet.getObject;这个方法,让数据进行强制类型转换。但是这里有一定的规则,有些类型并不能转换成功,下面是我在写的时候遇到的可以转换成功的数据关系:

sql数据类型

java数据类型

VARCHAR

String.class

CHAR

String.class

TEXT

String.class

MEDIUMTEXT

String.class

LONGTEXT

String.class

TINYTEXT

String.class

BIT

Boolean.class

INT

int.class

BIGINT

long.class

DOUBLE

double.class

TINYINT

int.class

FLOAT

float.class

DECIMAL

BigDecimal.class

INT

int.class

BIGINT

int.class

DECIMAL

BigDecimal.class

DATETIME

Date.class

TIME

Date.class

DATE

Date.class

TIMESTAMP

Date.class

按照这种关系创建class后,一般是不会碰到什么很奇怪的错误的:-D

​ 如果想做的复杂一点,可以做一个数据类型转换的工具,可以随心所欲的转换各种数据类型。但是这里就不做了,其实也很简单的,稍微想一想就能写出来啦~~~。

这里,class和表的映射就已经结束了,已经满足了我对一个orm的需要,下一步就是要通过反射分析class并生成sql了~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 手写一个orm框架-2
    • 创建映射关系
      • 需要的依赖
      • sql:
      • class:
      • 数据类型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档