手把手教你写一个java的orm(二)
创建映射关系
想要实现一个orm的功能,我觉得就是要将class和数据库中的表创建映射关系。把class的名称和表的名称,class属性名称和表的字段名称,属性类型与表的字段类型一一对应起来。可以通过配置文件,注解等等各种方式实现这个映射关系。
需要的依赖
因为编写配置文件总是一件十分繁琐的事情,所以我决定使用注解的方式来实现这个映射。在项目刚开始写的时候我用的是自定义注解的方法。自己规定一套注解,后来觉得这样没有太大的必要,因为已经有jpa里的一套注解。所以直接用就好了。所以添加依赖:
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
这里主要使用里面的三个注解:
@Id
添加在作为id 的字段上,标示为一个id,一个表中只能有一个id。
@Column
添加在作为属性的字段上,name里填写表中的字段名称。
@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(二)的更多相关文章
- 手把手教你写一个java的orm(一)
写之前的说明 其实吧. 这个东西已经写好了,地址在:https://github.com/hjx601496320/JdbcPlus 这系列文章算是我写的过程的总结吧.(恩系列,说明我可能会写好久,╮ ...
- 手把手教你写一个java的orm(五)
生成sql:where 上一篇里我们实现了生成insert的sql,下面要开始实现update,delete,select的sql语句了.但是这些语句有一个比较麻烦的地方是:它们一般后面都会有wher ...
- 手把手教你写一个java的orm(完)
生成sql:select 上一篇讲了怎样生成一个sql中where的一部分,之后我们要做事情就简单很多了,就只要像最开始一样的生成各种sql语句就好了,之后只要再加上我们需要的条件,一个完整的sql就 ...
- 手把手教你写一个java的orm(三)
使用反射解析class 上一篇我们完成了class到表映射关系的建立,但是这个并不能被代码正确处理,我们还需要让程序能够正确的识别这些映射关系. 这一篇主要讲的是建立一个从class到表的模型,使我们 ...
- 手把手教你写一个java的orm(四)
开始准备生成sql 在上一篇里,我们已经取到了我们在生成sql语句中所需要的信息,这一篇里我们开始根据class来生成我们需要的sql.在这之前我们先确认几件事情 sql里的参数我们使用占位符的形式. ...
- 只有20行Javascript代码!手把手教你写一个页面模板引擎
http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...
- 手把手教你写一个RPC
1.1 RPC 是什么 定义:RPC(Remote Procedure Call Protocol)--远程过程调用协议 ,RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数 ...
- 让我手把手教你写一个强大、方便使用的 IOC 容器
一.介绍 1.介绍 最近无聊,也没什么事做,没事做总是要给自己找点事情做吧,毕竟人的生活在与折腾.于是,决定自己手动写一个 IOC 的框架.我们知道在 NetCore 的版本里面已经内置了 IOC 容 ...
- 手把手教你写一个SpringMVC框架
一.介绍 在日常的 web 开发中,熟悉 java 的同学一定知道,Spring MVC 可以说是目前最流行的框架,之所以如此的流行,原因很简单:编程简洁.上手简单! 我记得刚开始入行的时候,最先接触 ...
随机推荐
- c# 输入多个数字,当输入不是数字时显示出刚输入的所有数并按降序
输入多个数字,当输入不是数字时显示出刚输入的所有数并按降序 class Program { static void Main(string[] args) { //定于一个集合 List<int ...
- Jmeter做并发测试(设置集合点)
集合点:让所有请求在不满足条件的时候处于等待状态. 如:我集合点设置为50,那么不满足50个请求的时候,这些请求都会集合在一起,处于等待状态,当达到50的时候,就一起执行.从而达到并发的效果. 那么J ...
- 《JAVA与模式》之建造模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation ...
- 全屏背景图的实现及background的相关属性
今天需要做一个占满设备宽度的轮播图,这里作为demo仅展示一张图,下面分别是要操作的图片(这里做了缩放处理,实际的图比较大),以及要实现的效果图,很明显两者是不成比例的: (图一) ...
- OpenCV --- 修改图像的对比度、亮度 、RGB转Gray图像、修改图像的尺寸
#include <opencv2/core.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgu ...
- 【BZOJ4184】shallot 线性基
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 此题如果我们不考虑删除元素这一个操作,那么就是一道裸的线性基题. 但是此题会删除 ...
- U8API——向U8数据库表导入数据
一.打开API资源管理器 替换两个引用 打开应用实例,选择相应的功能 复制相应的封装类到自己的目录下 在数据库新建临时表,与目标表相同 数据导入: 思路:先将要导入的数据导入到与U8目标表相同的临时表 ...
- jq01--概述
jq:jQuery,是一个JavaScript函数库,为了简化js开发与编码而封装的js库,是一个“写得更少,做得更多”的js函数库,为事件处理而特别设计的.现在我们来学习一下它. 1.jq库:为事件 ...
- matplotlib基本使用(矩形图、饼图、热力图、3D图)
使用matplotlib画简单的图形: #-*- coding:utf-8 -*- from numpy.random import randn import matplotlib.pyplot as ...
- Tomcat性能调优-让小猫飞奔
一.总结前一天的学习 从“第三天”的性能测试一节中,我们得知了决定性能测试的几个重要指标,它们是: ü 吞吐量 ü Responsetime ü Cpuload ü MemoryUsa ...