51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1696|回复: 2

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

[复制链接]

该用户从未签到

发表于 2019-2-1 16:21:38 | 显示全部楼层 |阅读模式
开始准备生成sql
在上一篇里,我们已经取到了我们在生成sql语句中所需要的信息,这一篇里我们开始根据class来生成我们需要的sql。在这之前我们先确认几件事情
  • sql里的参数我们使用占位符的形式。
    这里用的是jdbc中的PreparedStatement,sql中的参数使用“”的形式。
    大致上是这样的:
    Connection connection = dataSource.getConnection()reparedStatement preparedStatement = connection.prepareStatement("select * from `user` where `status` = ? ;");preparedStatement.setObject(1, 0);ResultSet resultSet = preparedStatement.executeQuery();
    但是这样的话我们每次执行都需要手写这些执行sql的繁琐的代码,我在这里选择使用spring-jdbc中的JdbcTemplte。这样我就只需要生成sql,然后使用JdbcTemplte里的方法来执行sql就好了。
  • 我们只生成单表的增删改查,不涉及复杂sql。
  • 不贴出完整的代码,以说明思路为主。
    毕竟这个是已经写好的代码,地址在:https://github.com/hjx601496320/JdbcPlus 。所有代码可以在这里找到。

分析sql
我们主要解决的是增删该查的问题,所以我们先写如何生成一个新增的sql。
我么先观察一下sql一般来说都有什么构成。现在先放一个例子出来:
  • insert
    INSERT INTO user (name, id, create_date, age, mark, status)VALUES (?, ?, ?, ?, ?, ?);
  • delete
    DELETEFROM userWHERE id = ?
  • update
    UPDATE userSET name        = ?,    id          = ?,    create_date = ?,    age         = ?,    status      = ?WHERE id = ?
  • select
    SELECT name, id, create_date, age, mark, statusFROM userWHERE id = ?
通过观察上面的sql,可以发现其中有一些共性:
  • 都有表的名称。
  • 基本上都包含表中的字段名称。
  • 还有参数。
  • 以上都是废话 ;-)
接下来,就可以按照每种类型的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 = 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了~~~
生成sql:insert思路
新增的sql还是比较好实现的,我们需要的大致就是:
  • 构建一个对象 User。
  • 调用新增的方法,将User作为参数传入方法。
  • 通过上一篇的解析结果,拿到所有的字段名称,与要保存的值。生成sql。
  • 通过JdbcTemplate执行sql,插入数据库。

结束啦,剩下的下一篇写~~
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-3-29 09:10 , Processed in 0.069595 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表