创建映射关系

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

需要的依赖

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

<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:


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:


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类中提供了一系列的方法:

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了~

我下一篇再写~~~

手把手教你写一个java的orm(二)的更多相关文章

  1. 手把手教你写一个java的orm(一)

    写之前的说明 其实吧. 这个东西已经写好了,地址在:https://github.com/hjx601496320/JdbcPlus 这系列文章算是我写的过程的总结吧.(恩系列,说明我可能会写好久,╮ ...

  2. 手把手教你写一个java的orm(五)

    生成sql:where 上一篇里我们实现了生成insert的sql,下面要开始实现update,delete,select的sql语句了.但是这些语句有一个比较麻烦的地方是:它们一般后面都会有wher ...

  3. 手把手教你写一个java的orm(完)

    生成sql:select 上一篇讲了怎样生成一个sql中where的一部分,之后我们要做事情就简单很多了,就只要像最开始一样的生成各种sql语句就好了,之后只要再加上我们需要的条件,一个完整的sql就 ...

  4. 手把手教你写一个java的orm(三)

    使用反射解析class 上一篇我们完成了class到表映射关系的建立,但是这个并不能被代码正确处理,我们还需要让程序能够正确的识别这些映射关系. 这一篇主要讲的是建立一个从class到表的模型,使我们 ...

  5. 手把手教你写一个java的orm(四)

    开始准备生成sql 在上一篇里,我们已经取到了我们在生成sql语句中所需要的信息,这一篇里我们开始根据class来生成我们需要的sql.在这之前我们先确认几件事情 sql里的参数我们使用占位符的形式. ...

  6. 只有20行Javascript代码!手把手教你写一个页面模板引擎

    http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...

  7. 手把手教你写一个RPC

    1.1 RPC 是什么 定义:RPC(Remote Procedure Call Protocol)--远程过程调用协议 ,RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数 ...

  8. 让我手把手教你写一个强大、方便使用的 IOC 容器

    一.介绍 1.介绍 最近无聊,也没什么事做,没事做总是要给自己找点事情做吧,毕竟人的生活在与折腾.于是,决定自己手动写一个 IOC 的框架.我们知道在 NetCore 的版本里面已经内置了 IOC 容 ...

  9. 手把手教你写一个SpringMVC框架

    一.介绍 在日常的 web 开发中,熟悉 java 的同学一定知道,Spring MVC 可以说是目前最流行的框架,之所以如此的流行,原因很简单:编程简洁.上手简单! 我记得刚开始入行的时候,最先接触 ...

随机推荐

  1. js中的基本类型与引用类型学习

    一.基本数据类型 ECMAScript 有 5 种原始类型(primitive type),即 Undefined.Null.Boolean.Number 和 String,也称为基本数据类型,ES6 ...

  2. AGC002F Leftmost Ball

    题目传送门 Description \(n\)种颜色的球,每种\(k\)个,\((n,k\leq 2000)\)将\(n\cdot k\)个球排成一排,把每种颜色最左边的那个涂成白色(初始不含白色), ...

  3. 2017 NAIPC A:Pieces of Parentheses

    my team solve the problem in the contest with similar ideathis is a more deep analysis The main idea ...

  4. A - Subsequence (算法 二分 )

    点击打开链接 A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 1 ...

  5. Lunix git stash clear 或者 git stash drop后恢复的方法

    首先输入 git fsck --lost-found 会看到 一条一条的记录 这里的"dangling commit ..."你可以理解为记录的是你stash的id(经测试,该id ...

  6. hdoj1180 诡异的楼梯(bfs+奇偶判断)

    手癌!日常手癌!被自己气死! #include<iostream> #include<cstring> #include<queue> #include<al ...

  7. PHP之旅4 php 超全局变量

    预定义数组: 自动全局变量---超全局数组 1.包含了来自web服务器,客户端,运行环境和用户输入的数据 2.这些数组比较特别 3.全局范围内自动生效,都可以直接使用这些数组 4.用户不能自定义这些数 ...

  8. javascript中创建对象的几种不同方法

    javascript中创建对象的几种不同方法 方法一:最直白的方式:字面量模式创建 <script> var person={ name:"小明", age:20, s ...

  9. 判断easyUI tree 节点复选框是否被选中的方法。将选中的节点高亮显示的方法

    在datagrid tree中如何判断某个节点的复选框是否被选中? 我们可以通过HTML结构去分析: 1.节点未选中前 2.节点选中后 所以节点被选中前和选中后,html中的class类是用区分的. ...

  10. cat /proc/sys/net/ipv4/ip_forward 0 解决办法

    [root@localhost java]# cat /proc/sys/net/ipv4/ip_forward 出于安全考虑,Linux系统默认是禁止数据包转发的. 所谓转发即当主机拥有多于一块的网 ...