sql语句操作集合

使用效果
可以得到操作类所需要的sql语句及参数值,最后使用DBUtil直接执行
在这里插入图片描述


import com.jsonliu.bean.Page;
import com.jsonliu.bean.SqlConsist;
import com.jsonliu.bean.SqlExpression;
import com.jsonliu.bean.TableAnn;
import org.apache.commons.lang.StringUtils;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: JSONLiu
 * @Description: sql语句操作集合
 * @Date Created in 2021-08-24 20:02
 * @Modified By:
 */
public class SqlUtil {


    /**
     * 获取查询语句及参数
     *
     * @param t          查询条件实体
     * @param sqlConsist 表达式
     * @param <T>
     * @return
     */
    public static <T> SqlConsist getSelectListSql(T t, SqlConsist sqlConsist) {
        SqlConsist condition = getSelectSql("select * from ", t, sqlConsist);
        return condition;
    }

    /**
     * 获取数量条数语句及参数
     *
     * @param sqlConsist 表达式
     * @param t
     * @param <T>
     * @return
     */
    public static <T> SqlConsist getSelectCountSql(T t, SqlConsist sqlConsist) {
        SqlConsist condition = getSelectSql("select count(1) as counts from ", t, sqlConsist);
        return condition;
    }

    /**
     * 查询获取基础语句
     *
     * @param baseSql    查询sql语句
     * @param t          查询条件
     * @param sqlConsist 表达式
     * @param <T>
     * @return
     */
    private static <T> SqlConsist getSelectSql(String baseSql, T t, SqlConsist sqlConsist) {
        Class<?> aClass = t.getClass();//获取类对象
        String sql = "";
        TableAnn tableAnn = aClass.getAnnotation(TableAnn.class);
        String tableName = tableAnn.value();
        if (!tableName.equals("")) {
            sql = baseSql + tableName;
        }
        SqlConsist queryCondition = getQueryCondition(t, sqlConsist);
        //存在查询条件时
        if (queryCondition != null && queryCondition.getSql() != null
                && !queryCondition.getSql().equals("")) {
            sql += queryCondition.getSql();
        }
        queryCondition.setSql(sql);
        return queryCondition;
    }

    /**
     * 获取分页查询语句及参数
     *
     * @param t          查询条件实体
     * @param page       分页条件
     * @param sqlConsist 条件表达式、排序
     * @param <T>
     * @return
     */
    public static <T> SqlConsist getSelectPageSql(T t, Page page, SqlConsist sqlConsist) {
        SqlConsist queryCondition = getSelectListSql(t, sqlConsist);
        String sql = queryCondition.getSql();
        //存在分页查询条件时
        if (page != null && page.getPageIndex() > 0) {
            sql += " limit ?,? ";
            queryCondition.setSql(sql);
            List values = queryCondition.getValues();
            if (values == null) values = new ArrayList();
            values.add(page.getPageSize() * (page.getPageIndex() - 1));
            values.add(page.getPageSize());
            queryCondition.setValues(values);
        }
        return queryCondition;
    }

    /**
     * 获取新增语句及参数
     *
     * @param t   新增数据
     * @param <T>
     * @return
     */
    public static <T> SqlConsist getInsertSql(T t) {
        Class<?> aClass = t.getClass();//获取类对象
        String sql = "";
        TableAnn tableAnn = aClass.getAnnotation(TableAnn.class);
        String tableName = tableAnn.value();
        if (!tableName.equals("")) {
            sql = "insert into " + tableName;
        }
        SqlConsist queryCondition = getAddCondition(t);
        //新增数据
        if (queryCondition != null && queryCondition.getSql() != null
                && !queryCondition.getSql().equals("")) {
            sql += queryCondition.getSql();
            queryCondition.setSql(sql);
        }
        return queryCondition;
    }

    /**
     * @param t          更新数据
     * @param t1         更新条件
     * @param sqlConsist 更新条件表达式
     * @param <T>
     * @return
     */
    public static <T> SqlConsist getUpdateSql(T t, T t1, SqlConsist sqlConsist) {
        Class<?> aClass = t.getClass();//获取类对象
        String sql = "";
        TableAnn tableAnn = aClass.getAnnotation(TableAnn.class);
        String tableName = tableAnn.value();
        if (!tableName.equals("")) {
            sql = "update " + tableName + " set ";
        }
        SqlConsist updateCondition = getUpdateCondition(t);
        //构造更新字段,不存在更新字段则sql不成立,返回null
        if (updateCondition != null && updateCondition.getSql() != null
                && !updateCondition.getSql().equals("")) {
            sql += updateCondition.getSql();
            updateCondition.setSql(sql);
        } else {
            return null;
        }
        //存在更新条件时
        SqlConsist queryCondition = getQueryCondition(t1, sqlConsist);
        if (queryCondition != null && queryCondition.getSql() != null
                && !queryCondition.getSql().equals("")) {
            sql += queryCondition.getSql();
            updateCondition.setSql(sql);
            //组合更新数据和更新条件参数
            updateCondition.getValues().addAll(queryCondition.getValues());
        }
        return updateCondition;
    }

    public static <T> SqlConsist getDeleteSql(T t, SqlConsist sqlConsist) {
        Class<?> aClass = t.getClass();//获取类对象
        String sql = "";
        TableAnn tableAnn = aClass.getAnnotation(TableAnn.class);
        String tableName = tableAnn.value();
        if (!tableName.equals("")) {
            sql = "delete from " + tableName;
        }
        //存在更新条件时
        SqlConsist queryCondition = getQueryCondition(t, sqlConsist);
        if (queryCondition != null && queryCondition.getSql() != null
                && !queryCondition.getSql().equals("")) {
            sql += queryCondition.getSql();
        }
        queryCondition.setSql(sql);
        return queryCondition;
    }

    /**
     * 获取更新字段
     *
     * @param t   更新数据
     * @param <T>
     * @return
     */
    public static <T> SqlConsist getUpdateCondition(T t) {
        Class<?> aClass = t.getClass();//获取类对象
        List list = new ArrayList();//条件值
        StringBuilder sb = new StringBuilder();//条件表达式
        SqlConsist queryCondition = new SqlConsist();//条件结果
        try {
            Field[] fields = aClass.getDeclaredFields();
            String pk = "";//主键
            for (Field field : fields) {
                field.setAccessible(true);
                Object o = field.get(t);//获取字段值
                String dbField = toDbField(field.getName());//得到字段对应数据库字段
                TableAnn ann = field.getAnnotation(TableAnn.class);//获取主键字段
                if (ann != null) pk = ann.pk();
                if (o != null && !dbField.equals(pk)) { //主键不更新
                    sb.append(changeKeywords(dbField) + " = ? , ");//获取字段名称
                    list.add(o);
                }
            }
            String s = sb.toString();
            if (sb.length() > 0) {//如果存在条件的话
                String s1 = sb.substring(0, sb.lastIndexOf(","));
                queryCondition.setSql(s1);
                queryCondition.setValues(list);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return queryCondition;
    }

    /**
     * 获取新增字段
     *
     * @param t   新增数据
     * @param <T>
     * @return
     */
    public static <T> SqlConsist getAddCondition(T t) {
        Class<?> aClass = t.getClass();//获取类对象
        List list = new ArrayList();//条件值
        StringBuilder sb = new StringBuilder();//条件表达式
        StringBuilder sb1 = new StringBuilder();//条件表达式
        SqlConsist queryCondition = new SqlConsist();//条件结果
        try {
            Field[] fields = aClass.getDeclaredFields();
            String pk = "";//主键
            for (Field field : fields) {
                field.setAccessible(true);
                Object o = field.get(t);//获取字段值
                String dbField = toDbField(field.getName());//得到字段对应数据库字段
                TableAnn ann = field.getAnnotation(TableAnn.class);//获取主键字段
                if (ann != null) pk = ann.pk();
                if (o != null && !dbField.equals(pk)) { //主键不更新
                    //关键词过滤
                    sb.append(changeKeywords(dbField) + " , ");//获取字段名称
                    sb1.append(" ? , ");//获取字段名称
                    list.add(o);
                }
            }
            String s = sb.toString();
            String s1 = sb1.toString();
            if (sb.length() > 0) {//如果存在条件的话
                String ss = s.substring(0, s.lastIndexOf(","));
                String ss1 = s1.substring(0, s1.lastIndexOf(","));
                queryCondition.setSql("(" + ss + ") values (" + ss1 + ")");
                queryCondition.setValues(list);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return queryCondition;
    }

    /**
     * 关键词过滤
     * @param keywords
     * @return
     */
    private static String changeKeywords(String keywords){
        String kw=keywords;
        //针对mysql操作
        if(keywords.equalsIgnoreCase("desc")||keywords.equalsIgnoreCase("asc")){
            kw="`"+kw+"`";
        }
        return kw;
    }

    /**
     * 获取查询条件
     *
     * @param t
     * @param <T>
     * @param sqlConsist 条件表达式
     * @return
     */
    public static <T> SqlConsist getQueryCondition(T t, SqlConsist sqlConsist) {
        Class<?> aClass = t.getClass();//获取类对象
        List list = new ArrayList();//条件值
        StringBuilder sb = new StringBuilder();//条件表达式
        SqlConsist queryCondition = new SqlConsist();//条件结果
        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(aClass);//获取class的bean对象
            PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor descriptor : descriptors) {
                Method readMethod = descriptor.getReadMethod();//获取get方法
                Object o = readMethod.invoke(t, null);
                if (o != null && !descriptor.getName().equals("class")) {
                    //匹配条件表达式
                    String exp = SqlExpression.EQ.getCode();
                    if (sqlConsist != null && sqlConsist.getExpression() != null) {
                        HashMap<String, String> hashMap = sqlConsist.getExpression();
                        for (Map.Entry entry : hashMap.entrySet()) {
                            if (entry.getKey().equals(descriptor.getName())) {
                                //条件表达式
                                exp = (String) entry.getValue();
                                //如果条件值单独传入
                                if(sqlConsist.getExpressionValue()!=null&&sqlConsist.getExpressionValue().get(entry.getKey())!=null){
                                    o=sqlConsist.getExpressionValue().get(entry.getKey());
                                }
                                break;
                            }
                        }
                    }
                    sb.append(toDbField(descriptor.getName()));//获取字段名称
                    switch (exp) {
                        case "eq":
                            sb.append(" =? and ");
                            list.add(o);
                            break;
                        case "like":
                            sb.append(" like ? and ");
                            list.add("%" + o + "%");
                            break;
                        case "in":
                            if(o instanceof java.util.List){
                                List list1= (List) o;
                                String listStr = StringUtils.join(list1.toArray(), ",");
                                sb.append(" in ("+listStr+") and ");
                            }
                            break;
                    }
                }
            }
            String s = sb.toString();
            if (sb.length() > 0) {//如果存在条件的话
                String s1 = sb.substring(0, sb.lastIndexOf("and"));
                queryCondition.setSql(" where " + s1 + getOrderSql(sqlConsist));

                queryCondition.setValues(list);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return queryCondition;
    }

    /**
     * 获得排序语句
     *
     * @param sqlConsist
     * @return
     */
    private static String getOrderSql(SqlConsist sqlConsist) {
        String orderSql = " ";
        //是否存在排序
        if (sqlConsist != null) {
            //正序
            if (sqlConsist.getOrderAsc() != null) {
                StringBuilder ascSql = new StringBuilder();
                ascSql.append(" order by ");
                for (String asc : sqlConsist.getOrderAsc()) {
                    ascSql.append(toDbField(asc) + ",");
                }
                orderSql = ascSql.toString().substring(0, ascSql.toString().lastIndexOf(",")) + " asc ";
            }
            //倒序
            if (sqlConsist.getOrderDesc() != null) {
                StringBuilder descSql = new StringBuilder();
                if (orderSql.equals("")) {
                    descSql.append(" order by ");
                } else {
                    descSql.append(" , ");
                }
                for (String asc : sqlConsist.getOrderAsc()) {
                    descSql.append(toDbField(asc) + ",");
                }
                orderSql += descSql.toString().substring(0, descSql.toString().lastIndexOf(",")) + " desc ";
            }
        }
        return orderSql;
    }

    /**
     * 实体字段转换为数据库字段
     *
     * @param entityField 实体字段
     * @return
     */
    public static String toDbField(String entityField) {
        String dbField = "";
        StringBuilder sb = new StringBuilder();
        sb.append(entityField);
        //获得每个排序字段的所有字母
        char[] chars = entityField.toCharArray();
        int num = 0, index = 0;
        //循环每个单词的字母数组,如果是大写的就进行转换
        for (char aChar : chars) {
            if (Character.isUpperCase(aChar)) {
//                    int i1 = orders[i].indexOf(aChar) + num;// 因为每次循环变更后都多了一个下划线
                int i1 = index + num;// 因为每次循环变更后都多了一个下划线
                sb.replace(i1, i1 + 1, "_" + String.valueOf(Character.toLowerCase(aChar)));
                num++;
            }
            index++;
        }
        dbField = sb.toString();
        return dbField;
    }
}

注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Author: JSONLiu
 * @Description:table注解
 * @Date Created in 2021-08-24 20:10
 * @Modified By:
 */
@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TableAnn {
    String value() default "";
    String pk() default "";
}

枚举


/**
 * @Author: JSONLiu
 * @Description:sql表达式
 * @Date Created in 2021-09-11 17:44
 * @Modified By:
 */
public enum SqlExpression {
    EQ("eq"),   //等于
    LIKE("like"),
    GT("gt"),   //大于
    LT("lt"),   //小于
    IN("in");

    private String code;
    private SqlExpression(String code){
        this.code=code;
    }

    public String getCode() {
        return code;
    }

}

实体类


import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * @Author: JSONLiu
 * @Description: sql语句相关
 * @Date Created in 2021-08-17 21:58
 * @Modified By:
 */
public class SqlConsist {
    //sql语句
    private String sql;
    //参数值
    private List values;
    //查询条件表达式
    private HashMap<String, String> expression;
    //查询条件表达式值
    private HashMap<String, Object> expressionValue;
    //正排序数组
    private String[] orderAsc;
    //倒排序数组
    private String[] orderDesc;

    @Override
    public String toString() {
        return "SqlConsist{" +
                "sql='" + sql + '\'' +
                ", values=" + values +
                ", expression=" + expression +
                ", expressionValue=" + expressionValue +
                ", orderAsc=" + Arrays.toString(orderAsc) +
                ", orderDesc=" + Arrays.toString(orderDesc) +
                '}';
    }

    public SqlConsist() {
    }

    public SqlConsist(String sql, List values, HashMap<String, String> expression, HashMap<String, Object> expressionValue, String[] orderAsc, String[] orderDesc) {
        this.sql = sql;
        this.values = values;
        this.expression = expression;
        this.expressionValue = expressionValue;
        this.orderAsc = orderAsc;
        this.orderDesc = orderDesc;
    }

    public HashMap<String, Object> getExpressionValue() {
        return expressionValue;
    }

    public void setExpressionValue(HashMap<String, Object> expressionValue) {
        this.expressionValue = expressionValue;
    }

    public String getSql() {
        return sql;
    }

    public void setSql(String sql) {
        this.sql = sql;
    }

    public List getValues() {
        return values;
    }

    public void setValues(List values) {
        this.values = values;
    }

    public HashMap<String, String> getExpression() {
        return expression;
    }

    public void setExpression(HashMap<String, String> expression) {
        this.expression = expression;
    }

    public String[] getOrderAsc() {
        return orderAsc;
    }

    public void setOrderAsc(String[] orderAsc) {
        this.orderAsc = orderAsc;
    }

    public String[] getOrderDesc() {
        return orderDesc;
    }

    public void setOrderDesc(String[] orderDesc) {
        this.orderDesc = orderDesc;
    }
}

import java.util.List;
import java.util.Objects;

/**
 * @Author: JSONLiu
 * @Description:分页
 * @Date Created in 2021-09-07 20:29
 * @Modified By:
 */
public class Page<T> {
    private Integer pageSize=10;//每页条数
    private Integer pageIndex=1;//当前页数
    private Integer pageTotal;//总页数
    private Integer totalSize;//总条数
    private List<T> data;//数据

    public Page() {
    }

    @Override
    public String toString() {
        return "{" +
                "pageSize=" + pageSize +
                ", pageIndex=" + pageIndex +
                ", pageTotal=" + pageTotal +
                ", totalSize=" + totalSize +
                ", data=" + data +
                '}';
    }

    public Page(Integer pageSize, Integer pageIndex, Integer pageTotal, Integer totalSize, List<T> data) {
        this.pageSize = pageSize;
        this.pageIndex = pageIndex;
        this.pageTotal = pageTotal;
        this.totalSize = totalSize;
        this.data = data;
    }

    public List<T> getData() {
        return data;
    }

    public void setData(List<T> data) {
        this.data = data;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Page<?> page = (Page<?>) o;
        return Objects.equals(pageSize, page.pageSize) &&
                Objects.equals(pageIndex, page.pageIndex) &&
                Objects.equals(pageTotal, page.pageTotal) &&
                Objects.equals(totalSize, page.totalSize) &&
                Objects.equals(data, page.data);
    }


    @Override
    public int hashCode() {
        return Objects.hash(pageSize, pageIndex, pageTotal, totalSize, data);
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getPageIndex() {
        return pageIndex;
    }

    public void setPageIndex(Integer pageIndex) {
        this.pageIndex = pageIndex;
    }

    public Integer getPageTotal() {
        return totalSize/pageSize+(totalSize%pageSize==0?0:1);
    }

    public void setPageTotal(Integer pageTotal) {
        this.pageTotal = pageTotal;
    }

    public Integer getTotalSize() {
        return totalSize;
    }

    public void setTotalSize(Integer totalSize) {
        this.totalSize = totalSize;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑谈子云亭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值