All Downloads are FREE. Search and download functionalities are using the official Maven repository.

sf.jooq.JooqImpl Maven / Gradle / Ivy

The newest version!
package sf.jooq;

import org.jooq.Attachable;
import org.jooq.Condition;
import org.jooq.Configuration;
import org.jooq.Delete;
import org.jooq.Insert;
import org.jooq.Record;
import org.jooq.SQLDialect;
import org.jooq.Select;
import org.jooq.Table;
import org.jooq.TableField;
import org.jooq.UniqueKey;
import org.jooq.Update;
import org.jooq.impl.DSL;
import org.jooq.impl.DefaultConfiguration;
import sf.common.wrapper.Page;
import sf.core.DBObject;
import sf.database.dao.DBContext;
import sf.database.dialect.DBDialect;
import sf.database.jdbc.sql.Crud;
import sf.database.jdbc.sql.PageStrategy;
import sf.database.util.DBUtils;
import sf.jooq.tables.JooqTable;
import sf.spring.util.CollectionUtils;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.stream.Stream;

public class JooqImpl implements JooqInf {
    private static JooqImpl instance = new JooqImpl();

    public static JooqImpl getInstance() {
        return instance;
    }

    private JooqImpl() {

    }

    @Override
    public  boolean jooqExists(Connection conn, SQLDialect sqlDialect, List condition, Class clz) {
        DBDialect dialect = DBUtils.doGetDialect(conn, false);
        DBContext context = DBUtils.doGetDBContext(conn);
        JooqTable table = JooqTables.getTable(context, clz, dialect);
        if (sqlDialect == null) {
            sqlDialect = JooqDialectUtils.getSQLDialect(dialect.getJooqDialect());
        }
        if (sqlDialect == null) {
            sqlDialect = SQLDialect.DEFAULT;
        }
        Select select = null;
        if (CollectionUtils.isNotEmpty(condition)) {
            select = DSL.using(sqlDialect).select(DSL.field("1")).from(table).where(condition).limit(1);
        } else {
            select = DSL.using(sqlDialect).select(DSL.field("1")).from(table).limit(1);
        }
        String sql = select.getSQL();
        List values = select.getBindValues();
        Byte b = Crud.getInstance().getCrudSql().selectOne(conn, Byte.class, sql, values.toArray());
        return b != null && b > 0;
    }

    @Override
    public  T jooqSelectOne(Connection conn, Select select, Class returnClass) {
        setDialect(conn, select);
        String sql = select.getSQL();
        List values = select.getBindValues();
        return Crud.getInstance().getCrudSql().selectOne(conn, returnClass, sql, values.toArray());
    }

    @Override
    public  List jooqSelectList(Connection conn, Select select, Class returnClass) {
        setDialect(conn, select);
        String sql = select.getSQL();
        List values = select.getBindValues();
        return Crud.getInstance().getCrudSql().selectList(conn, returnClass, sql, values.toArray());
    }

    @Override
    public  Page jooqSelectPage(Connection conn, Select countSelect, Select pageSelect, Class returnClass) {
        setDialect(conn, countSelect);
        setDialect(conn, pageSelect);
        String sql = pageSelect.getSQL();
        List values = pageSelect.getBindValues();
        return Crud.getInstance().getCrudSql().selectPageRaw(conn, 0, 0, (Class) returnClass, countSelect.getSQL(), countSelect.getBindValues().toArray(), sql, values.toArray(), PageStrategy.hasOffsetLimit);
    }

    @Override
    public  void selectIterator(Connection conn, Consumer> ormIt, Select select, Class returnClass) {
        setDialect(conn, select);
        String sql = select.getSQL();
        List values = select.getBindValues();
        Crud.getInstance().getCrudSql().selectIterator(conn, ormIt, returnClass, false, sql, values.toArray());
    }

    @Override
    public  void selectStream(Connection conn, Consumer> ormStream, Select select, Class returnClass) {
        setDialect(conn, select);
        String sql = select.getSQL();
        List values = select.getBindValues();
        Crud.getInstance().getCrudSql().selectStream(conn, ormStream, returnClass, false, sql, values.toArray());
    }

    private void setDialect(Connection conn, Attachable select) {
        Configuration configuration = select.configuration();
        if (configuration == null) {
            configuration = new DefaultConfiguration();
            select.attach(configuration);
        }
        if (configuration.dialect() == SQLDialect.DEFAULT) {
            SQLDialect sqlDialect = JooqDialectUtils.getSQLDialect(DBUtils.doGetDialect(conn, false).getJooqDialect());
            if (sqlDialect != null) {
                //需要从连接中动态获取dialect
                configuration.set(sqlDialect);
            }
        }
    }

    @Override
    public  int jooqInsert(Connection conn, Insert insert) {
        setDialect(conn, insert);
        String sql = insert.getSQL();
        List values = insert.getBindValues();
        return Crud.getInstance().getCrudSql().execute(conn, sql, values.toArray());
    }

    @Override
    public  int jooqInsert(Connection conn, Insert insert, Table table, Map keyValues) {
        setDialect(conn, insert);
        String sql = insert.getSQL();
        List values = insert.getBindValues();
        List pkeys = new ArrayList<>();

        if (table != null && table.getPrimaryKey() != null) {
            UniqueKey uk = table.getPrimaryKey();
            if (uk != null) {
                List> list = uk.getFields();
                if (CollectionUtils.isNotEmpty(list)) {
                    for (TableField f : list) {
                        pkeys.add(f.getName());
                    }
                }
            }
        }
        return Crud.getInstance().getCrudSql().execute(conn, sql, values.toArray(), false, pkeys, keyValues);
    }

    @Override
    public  int jooqUpdate(Connection conn, Update update) {
        setDialect(conn, update);
        String sql = update.getSQL();
        List values = update.getBindValues();
        return Crud.getInstance().getCrudSql().execute(conn, sql, values.toArray());
    }

    @Override
    public  int jooqDelect(Connection conn, Delete delete) {
        setDialect(conn, delete);
        String sql = delete.getSQL();
        List values = delete.getBindValues();
        return Crud.getInstance().getCrudSql().execute(conn, sql, values.toArray());
    }
}