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

创建映射关系

? 想要实现一个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了~

我下一篇再写~~~

原文地址:https://www.cnblogs.com/hebaibai/p/10294408.html

时间: 2024-11-09 08:52:22

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

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

生成sql:select 上一篇讲了怎样生成一个sql中where的一部分,之后我们要做事情就简单很多了,就只要像最开始一样的生成各种sql语句就好了,之后只要再加上我们需要的条件,一个完整的sql就顺利的做好了. 现在我们开始写生成查询语句的sql.一个查询语句大致上是这样的: SELECT name, id, create_date, age, mark, status FROM user 这里可以看出来,一个基础的查询语句基本上就是一个 SELECT 后面加上需要查询的字段,跟上 FROM

大神手把手教你写一个页面模板引擎,只需20行Javascript代码!

只用20行Javascript代码就写出一个页面模板引擎的大神是AbsurdJS的作者,下面是他分享的全文,转需. 不知道你有木有听说过一个基于Javascript的Web页面预处理器,叫做AbsurdJS.我是它的作者,目前我还在不断地完善它.最初我只是打算写一个CSS的预处理器,不过后来扩展到了CSS和HTML,可以用来把Javascript代码转成CSS和HTML代码.当然,由于可以生成HTML代码,你也可以把它当成一个模板引擎,用于在标记语言中填充数据. 于是我又想着能不能写一些简单的代

手把手教你写一个RN小程序!

时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现在我开始学react native,那么现在对于react native也算是有所了解了,就用网上的接口开发一个小程序,现在带大家来写这个程序!接口是用看知乎的API,简简单单的只有get,可以从这里入门,也算是带大家入门吧,过后我会把源代码放在我的github上,前期项目肯定特别简陋,后面慢慢来优

手把手教你写一个用pytorch实现的Lenet5

最近为了实现HR-net在学习pytorch,然后突然发现这个框架简直比tensorflow要方便太多太多啊,我本来其实不太喜欢python,但是这个框架使用的流畅性真的让我非常的喜欢,下面我就开始介绍从0开始编写一个Lenet并用它来训练cifar10. 1.首先需要先找到Lenet的结构图再考虑怎么去实现它,在网上找了一个供参考 2.需要下载好cifar-10的数据集,在pytorch下默认的是下载cifar-10-python版本的,由于官网速度较慢,我直接提供度娘网盘的链接:链接:htt

手把手教你写一个通用的helm chart

[TOC] 1. 模板介绍 首先,放上此模板链接: https://github.com/ygqygq2/charts/tree/master/mod-chart 此chart可当作POD单image的通用模板,只需要使用sed替换下chart名,并修改下README.md和NOTES.txt就可以了.下文,我通过复制此chart成example-chart来作示范说明. [[email protected] mod-chart]# tree . ├── Chart.yaml ├── READM

Android开发之手把手教你写ButterKnife框架(二)

欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52664112 本文出自:[余志强的博客] 上一篇博客Android开发之手把手教你写ButterKnife框架(一)我们讲了ButterKnife是什么.ButterKnife的作用和功能介绍以及ButterKnife的实现原理. 本篇博客主要讲在android studio中如何使用apt. 一.新建个项目, 然后创建一个module名叫processor 新建m

Android开发之手把手教你写ButterKnife框架(三)

欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52672188 本文出自:[余志强的博客] 一.概述 上一篇博客讲了,如何在android studio使用apt < Android开发之手把手教你写ButterKnife框架(二)> 然后在Processor里生成自己的代码,把要输出的类,通过StringBuilder拼接字符串,然后输出. try { // write the file JavaFileObj

手把手教你写网络爬虫(3):开源爬虫框架对比

手把手教你写网络爬虫(3) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 介绍 大家好!我们从今天开始学习开源爬虫框架Scrapy,如果你看过<手把手>系列的前两篇,那么今天的内容就非常容易理解了.细心的读者也许会有疑问,为什么不学出身名门的Apache顶级项目Nutch,或者人气飙升的国内大神开发的Pyspider等框架呢?原因很简单,我们来看一下主流爬虫框架在GitHub上的活跃度: Project Language Star Watch Fork Nutch Java 1

[原创]手把手教你写网络爬虫(8):乱码

手把手教你写网络爬虫(8) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 字符编解码是爬虫里必学的一项知识,在我们的爬虫生涯中早晚会爬到乱码的网页,与其遇到时惊慌失措,不如早学早好,彻底避免乱码问题. 字符编码简介 什么是字符集 在介绍字符编码之前,我们先了解下什么是字符集. 字符(Character)是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集: