专栏首页何白白开发记录手写一个orm框架-4

手写一个orm框架-4

手写一个orm框架-4

开始准备生成sql

在上一篇里,我们已经取到了我们在生成sql语句中所需要的信息,这一篇里我们开始根据class来生成我们需要的sql。在这之前我们先确认几件事情

  1. sql里的参数我们使用占位符的形式。 这里用的是jdbc中的PreparedStatement,sql中的参数使用“”的形式。 大致上是这样的: Connection connection = dataSource.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement("select * from `user` where `status` = ? ;"); preparedStatement.setObject(1, 0); ResultSet resultSet = preparedStatement.executeQuery(); 但是这样的话我们每次执行都需要手写这些执行sql的繁琐的代码,我在这里选择使用spring-jdbc中的JdbcTemplte。这样我就只需要生成sql,然后使用JdbcTemplte里的方法来执行sql就好了。
  2. 我们只生成单表的增删改查,不涉及复杂sql。
  3. 不贴出完整的代码,以说明思路为主。 毕竟这个是已经写好的代码,地址在:https://github.com/hjx601496320/JdbcPlus 。所有代码可以在这里找到。

分析sql

我们主要解决的是增删该查的问题,所以我们先写如何生成一个新增的sql。

我么先观察一下sql一般来说都有什么构成。现在先放一个例子出来:

  1. insert INSERT INTO user (name, id, create_date, age, mark, status) VALUES (?, ?, ?, ?, ?, ?);
  2. delete DELETE FROM user WHERE id = ?
  3. update UPDATE user SET name = ?, id = ?, create_date = ?, age = ?, status = ? WHERE id = ?
  4. select SELECT name, id, create_date, age, mark, status FROM user WHERE id = ?

通过观察上面的sql,可以发现其中有一些共性:

  1. 都有表的名称。
  2. 基本上都包含表中的字段名称。
  3. 还有参数。
  4. 以上都是废话 ;-)

接下来,就可以按照每种类型的sql来创建sql了。

操作对象

一下所有的对象都是这个User.java

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;


@Table(name = "user")
public class User {

    @Column(name = "name")
    private String name;

    @Id
    @Column(name = "id")
    private int id;

    @Column(name = "age")
    private int age;

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

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

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

//   getter setter toString
}

先写点工具代码

主要用来操作字符串

import java.util.Collection;
import java.util.Iterator;

/**
 * @author hjx
 */
public class StringUtils {

    public static final String SPACE = " ";

    public static final String BLANK = "";

    public static final String COMMA = ", ";


    /**
     * 重复字符串
     *
     * @param str
     * @param number
     * @return
     */
    public static String[] repeat(String str, int number) {
        Assert.notNull(str);
        String[] strings = new String[number];
        for (int i = 0; i < number; i++) {
            strings[i] = str;
        }
        return strings;
    }

    /**
     * 组合字符串
     *
     * @param strings
     * @return
     */
    public static String append(final Object... strings) {
        StringBuilder builder = new StringBuilder();
        for (Object s1 : strings) {
            if (s1 == null) {
                continue;
            }
            builder.append(s1.toString());
        }
        return builder.toString();
    }

    /**
     * 组合字符串
     *
     * @param collection
     * @param separator
     * @return
     */
    public static String join(Collection collection, String separator) {
        StringBuffer var2 = new StringBuffer();
        for (Iterator var3 = collection.iterator(); var3.hasNext(); var2.append((String) var3.next())) {
            if (var2.length() != 0) {
                var2.append(separator);
            }
        }
        return var2.toString();
    }
}

用来从对象中取值的,使用反射。

/**
 * 取值
 *
 * @param target 要从哪一个对象中取值
 * @param field  要取这个对象的那个属性的值
 * @return
 */
public static Object getValue(Object target, Field field) {
    //忽略掉private
    field.setAccessible(true);
    try {
        return field.get(target);
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return null;
}

​ 用来给对象设置值的,还是反射。

/**
 * 设置值
 *
 * @param target 要从哪一个对象中取值
 * @param field  要取这个对象的那个属性的值
 * @param value  要设置的值
 * @return
 */
public static boolean setValue(Object target, Field field, Object value) {
    field.setAccessible(true);
    try {
        field.set(target, value);
        return true;
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return false;
}

下面就可以开始创建各种sql了~~~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 手写一个orm框架-6

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

    何白白
  • 通过数据库生成实体类

    ​ 这只是一个简单的解析数据库建表语句之后,根据解析结果生成java文件的一个简单工具。写的原因有两个。

    何白白
  • 手写一个orm框架-7

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

    何白白
  • Java基础巩固——反射

    什么是反射 ----    反射机制就是指程序运行时能够获取自身的信息。在Java中,只要给出类的名字,就可以通过反射机制来获取类的信息 哪里用的到反射机制 -...

    Janti
  • Java单体应用 - 架构模式 - 03.设计模式-18.中介者模式

    原文地址:http://www.work100.net/training/monolithic-architecture-design-patterns-med...

    光束云
  • 并发编程之future模式

    一、Future模式简介 Future模式有点类似于网上购物,在你购买商品,订单生效之后,你可以去做自己的事情,等待商家通过快递给你送货上门。Future模式...

    lyb-geek
  • Spring Qualifier的使用

    spring 的 qualifier 平常使用一般直接是使用id 来限定,不过spring给我们提供了更强大的功能。

    Dylan Liu
  • SpringBoot基础篇Bean之条件注入@ConditionalOnProperty

    bean的条件注入,除了前面两篇博文分别介绍的通过@Conditional注解配合Condition接口的基本实现,以及如何使用条件注解@Conditional...

    一灰灰blog
  • 局域网安全攻防

    在最初的时候,交换机里是没有mac地址表信息的,那么交换机就要进行学习,假如交换机上连接着两个主机PC1和PC2,当PC1要与PC2进行通信时,PC1的数据帧流...

    没有故事的陈师傅
  • java8 Lambda尝尝鲜

    转载:猿天地 链接:http://cxytiandi.com/blog/detail/2196 java8都已经发布这么久了,一直没来得及使用,线上环境基本...

    猿天地

扫码关注云+社区

领取腾讯云代金券