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

 

生成sql:where

上一篇里我们实现了生成insert的sql,下面要开始实现updatedeleteselect的sql语句了。但是这些语句有一个比较麻烦的地方是:它们一般后面都会有where条件,因为在执行的时候不能把表里所有的数据都进行操作。

所以这里我们需要先生成条件的sql。大概是这样的:

WHERE id = ? AND name != ? OR age >= ? 

where 后面的参数继续用 “?” 代替。值就放在一个有序的集合中就好了。类似上一篇提到的insertColumnValues

思路

  1. 条件都是一个一个组成的,我们可以写一个类用来描述一个条件。
  2. 写一个工具类来快速的创建条件。
  3. 将多个条件中间用 and 或者 or 组合起来,并在最前方添加 where 就是一个完整的条件。
  4. 最后将这个条件转成一个字符串,并用一个集合将条件中的值存起来就好了。

实现

第一步

我们实现第一步,在这之前我们先看一下一个条件是有什么组成的,例如:

1: id = ? AND 2: name != ? OR 3: age >= ? 

这里通过观察可以发现,每一个条件都是由一个 字段名称一个判断一个占位符 "?"和后面用于连接条件的 AND 或者 OR 所构成。这样我们可以编写一个类用来保存这些信息:

Where.java

 import java.util.ArrayList; import java.util.Arrays; import java.util.List;  /**  * where条件 默认使用 and 连接多个条件  *  * @author hjx  */ public class Where {      protected static final String PLACEHOLDER = "#{COLUMN}";      static final String AND = "AND ";      static final String OR = "OR ";      private String sql;      private String column;      private String connect = AND;      private List<Object> values;      /**      * 是否有值(null 也代表有值)      */     private boolean hasValue;      /**      * @param column 被操作的列      * @param sql    操作的sql      */     public Where(String column, String sql) {         this.column = column;         this.sql = sql;         this.hasValue = false;         this.values = new ArrayList<>();     }      /**      * @param column 被操作的列      * @param sql    操作的sql      * @param value  sql的参数      */     public Where(String column, String sql, Object value) {         this.sql = sql;         this.column = column;         this.values = new ArrayList<>();         this.values.add(value);         this.hasValue = true;     }      /**      * @param column 被操作的列      * @param sql    操作的sql      * @param values sql的参数      */     public Where(String column, String sql, Object[] values) {         this.sql = sql;         this.column = column;         this.values = Arrays.asList(values);         
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信