com.baomidou.hibernateplus.dao.impl.DaoImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.baomidou.hibernateplus.dao.impl.DaoImpl.java

Source

/**
 * The MIT License (MIT)
 * <p>
 * Copyright (c) 2016 Caratacus
 * <p>
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 * <p>
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 * <p>
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
package com.baomidou.hibernateplus.dao.impl;

import java.io.Serializable;
import java.math.BigInteger;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.transform.Transformers;
import org.jboss.logging.Logger;

import com.baomidou.hibernateplus.condition.SelectWrapper;
import com.baomidou.hibernateplus.condition.wrapper.Wrapper;
import com.baomidou.hibernateplus.dao.IDao;
import com.baomidou.hibernateplus.entity.Convert;
import com.baomidou.hibernateplus.entity.page.Page;
import com.baomidou.hibernateplus.utils.Assert;
import com.baomidou.hibernateplus.utils.CollectionUtils;
import com.baomidou.hibernateplus.utils.EntityInfoUtils;
import com.baomidou.hibernateplus.utils.HibernateUtils;
import com.baomidou.hibernateplus.utils.MapUtils;
import com.baomidou.hibernateplus.utils.RandomUtils;
import com.baomidou.hibernateplus.utils.ReflectionKit;
import com.baomidou.hibernateplus.utils.SqlUtils;
import com.baomidou.hibernateplus.utils.StringUtils;

/**
 * <p>
 * IDao?
 * </p>
 *
 * @author Caratacus
 * @date 2016-11-23
 */
public class DaoImpl<P extends Convert> implements IDao<P> {

    private static final Logger logger = Logger.getLogger(DaoImpl.class);

    /**
     * ?masterSession
     *
     * @return
     */
    protected SessionFactory masterSession() {
        return EntityInfoUtils.getEntityInfo(poClass()).getMaster();
    }

    /**
     * ?slaveSession
     *
     * @return
     */
    protected SessionFactory slaveSession() {
        Set<SessionFactory> slaves = EntityInfoUtils.getEntityInfo(poClass()).getSlaves();
        if (CollectionUtils.isEmpty(slaves)) {
            return masterSession();
        }
        return RandomUtils.getRandomElement(slaves);
    }

    /**
     * hibernate??
     *
     * @param id
     * @return
     */
    public P selectById(Serializable id) {
        Assert.notNull(id);
        return (P) HibernateUtils.getSession(slaveSession(), isCurrent()).get(poClass(), id);
    }

    @Override
    public P get(Serializable id) {
        Assert.notNull(id);
        String primaryKey = SqlUtils.getPrimaryKey(poClass());
        Wrapper wrapper = SelectWrapper.instance().eq(primaryKey, id);
        return selectOne(wrapper);
    }

    /**
     * ?HQL?
     *
     * @param hql
     * @return
     */
    protected P get(String hql) {
        return (P) get(hql, Collections.EMPTY_MAP);
    }

    /**
     * ?HQL?
     *
     * @param hql
     * @param params
     * @return
     */
    protected P get(String hql, Map<String, Object> params) {
        Assert.hasLength(hql);
        P t = null;
        try {
            Query query = HibernateUtils.getHqlQuery(hql, slaveSession(), isCurrent());
            setParamMap(params, query);
            t = (P) query.uniqueResult();
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
        }
        return t;

    }

    @Override
    public P save(P p) {
        Assert.notNull(p);
        HibernateUtils.getSession(masterSession(), isCurrent()).save(p);
        return p;
    }

    @Override
    public P saveOrUpdate(P p) {
        Assert.notNull(p);
        HibernateUtils.getSession(masterSession(), isCurrent()).saveOrUpdate(p);
        return p;
    }

    @Override
    public P update(P p) {
        Assert.notNull(p);
        HibernateUtils.getSession(masterSession(), isCurrent()).merge(p);
        return p;
    }

    @Override
    public int update(Wrapper wrapper) {
        Assert.notEmpty(wrapper.getSetMap());
        String sqlUpdate = SqlUtils.sqlUpdate(poClass(), wrapper);
        return executeSqlUpdate(sqlUpdate);
    }

    @Override
    public boolean delete(P p) {
        Assert.notNull(p);
        try {
            HibernateUtils.getSession(masterSession(), isCurrent()).delete(p);
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
            return false;
        }
        return true;
    }

    @Override
    public int delete(Wrapper wrapper) {
        String sqlDelete = SqlUtils.sqlDelete(poClass(), wrapper);
        return executeSqlUpdate(sqlDelete);
    }

    @Override
    public int delete(Serializable id) {
        Assert.notNull(id);
        String sqlDelete = SqlUtils.sqlDelete(poClass(), id);
        return executeSqlUpdate(sqlDelete);
    }

    @Override
    public boolean insertBatch(List<P> list, int size) {
        Assert.notEmpty(list);
        try {
            Session session = HibernateUtils.getSession(masterSession(), isCurrent());
            for (int i = 0; i < list.size(); i++) {
                session.save(list.get(i));
                if (i % size == 0) {
                    session.flush();
                    session.clear();
                }
            }
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
            return false;
        }
        return true;
    }

    @Override
    public boolean updateBatch(List<P> list, int size) {
        Assert.notEmpty(list);
        try {
            Session session = HibernateUtils.getSession(masterSession(), isCurrent());
            for (int i = 0; i < list.size(); i++) {
                session.merge(list.get(i));
                if (i % size == 0) {
                    session.flush();
                    session.clear();
                }
            }
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
            return false;
        }
        return true;

    }

    @Override
    public boolean saveOrUpdateBatch(List<P> list, int size) {
        Assert.notEmpty(list);
        try {
            Session session = HibernateUtils.getSession(masterSession(), isCurrent());
            for (int i = 0; i < list.size(); i++) {
                session.saveOrUpdate(list.get(i));
                if (i % size == 0) {
                    session.flush();
                    session.clear();
                }
            }
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
            return false;
        }
        return true;

    }

    @Override
    public P selectOne(Wrapper wrapper) {
        List<P> list = selectList(wrapper);
        if (CollectionUtils.isNotEmpty(list)) {
            int size = list.size();
            if (size > 1) {
                logger.warn(String.format("Warn: selectOne Method There are  %s results.", size));
            }
            return list.get(0);
        }
        return null;
    }

    @Override
    public <P> List<P> selectList(Wrapper wrapper) {
        List<P> list = Collections.emptyList();
        try {
            String sql = SqlUtils.sqlEntityList(poClass(), wrapper, null);
            Query query = HibernateUtils.getEntitySqlQuery(poClass(), sql, slaveSession(), isCurrent());
            list = query.list();
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
        }
        return list;
    }

    @Override
    public List<Map<String, Object>> selectMaps(Wrapper wrapper) {
        List<Map<String, Object>> list = Collections.emptyList();
        try {
            String sql = SqlUtils.sqlList(poClass(), wrapper, null);
            Query query = HibernateUtils.getSqlQuery(sql, slaveSession(), isCurrent())
                    .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            list = query.list();
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
        }
        return list;
    }

    @Override
    public int selectCount(Wrapper wrapper) {
        int count = 0;
        try {
            String sql = SqlUtils.sqlCount(poClass(), wrapper);
            Query query = HibernateUtils.getSqlQuery(sql, slaveSession(), isCurrent());
            BigInteger bigInteger = (BigInteger) query.uniqueResult();
            count = bigInteger.intValue();
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
        }
        return count;
    }

    @Override
    public Page<Map<String, Object>> selectMapsPage(Wrapper wrapper, Page<Map<String, Object>> page) {
        try {
            String sql = SqlUtils.sqlList(poClass(), wrapper, page);
            Query query = HibernateUtils.getSqlQuery(sql, slaveSession(), isCurrent())
                    .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            HibernateUtils.setPage(page.getCurrent(), page.getSize(), query);
            page.setRecords(query.list());
            setPageTotal(sql, page);
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
        }
        return page;
    }

    @Override
    public Page selectPage(Wrapper wrapper, Page page) {
        try {
            String sql = SqlUtils.sqlEntityList(poClass(), wrapper, page);
            Query query = HibernateUtils.getEntitySqlQuery(poClass(), sql, slaveSession(), isCurrent());
            HibernateUtils.setPage(page.getCurrent(), page.getSize(), query);
            page.setRecords(query.list());
            setPageTotal(sql, page);
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
        }
        return page;
    }

    /**
     * HQL
     *
     * @param hql
     * @return
     */
    protected int executeHql(String hql) {
        return executeHql(hql, Collections.EMPTY_MAP);
    }

    /**
     * HQL
     *
     * @param hql
     * @param params
     * @return
     */
    protected int executeHql(String hql, Map<String, Object> params) {
        Assert.hasLength(hql);
        Query query = HibernateUtils.getHqlQuery(hql, masterSession(), isCurrent());
        setParamMap(params, query);
        return query.executeUpdate();
    }

    /**
     * ?HQL
     *
     * @param hql
     * @return
     */
    protected List<P> queryListWithHql(String hql) {
        return queryListWithHql(hql, Collections.EMPTY_MAP);
    }

    /**
     * ?HQL
     *
     * @param hql
     * @param params
     * @return
     */
    protected List<P> queryListWithHql(String hql, Map<String, Object> params) {
        return queryListWithHql(hql, params, 0, 0);
    }

    /**
     * ?HQL
     *
     * @param hql
     * @param params
     * @param page
     * @param rows
     * @return
     */
    protected List<P> queryListWithHql(String hql, Map<String, Object> params, int page, int rows) {
        Assert.hasLength(hql);
        List<P> list = Collections.emptyList();
        try {
            Query query = HibernateUtils.getHqlQuery(hql, slaveSession(), isCurrent());
            setParamMap(params, query);
            HibernateUtils.setPage(page, rows, query);
            list = query.list();
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
        }
        return list;

    }

    /**
     * ?HQL
     *
     * @param hql
     * @param page
     * @param rows
     * @return
     */
    protected List<P> queryListWithHql(String hql, int page, int rows) {
        return queryListWithHql(hql, Collections.EMPTY_MAP, page, rows);
    }

    /**
     * ?HQL
     *
     * @param hql
     * @return
     */
    protected List<Map<String, Object>> queryMapsWithHql(String hql) {
        return queryMapsWithHql(hql, 0, 0);
    }

    /**
     * ?HQL
     *
     * @param hql
     * @param page
     * @param rows
     * @return
     */
    protected List<Map<String, Object>> queryMapsWithHql(String hql, int page, int rows) {
        Assert.hasLength(hql);
        List<Map<String, Object>> list = Collections.emptyList();
        try {
            Query query = HibernateUtils.getHqlQuery(hql, slaveSession(), isCurrent())
                    .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            HibernateUtils.setPage(page, rows, query);
            list = query.list();

        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
        }
        return list;
    }

    /**
     * ?HQL?
     *
     * @param hql
     * @return
     */
    protected int queryCountWithHql(String hql) {
        return queryCountWithHql(hql, Collections.EMPTY_MAP);
    }

    /**
     * ?HQL?
     *
     * @param hql
     * @param params
     * @return
     */
    protected int queryCountWithHql(String hql, Map<String, Object> params) {
        Assert.hasLength(hql);
        Query query = HibernateUtils.getHqlQuery(hql, slaveSession(), isCurrent());
        setParamMap(params, query);
        BigInteger bigInteger = (BigInteger) query.uniqueResult();
        return bigInteger.intValue();
    }

    /**
     * SQL
     *
     * @param sql
     * @return
     */
    protected int executeSqlUpdate(String sql) {
        return executeSqlUpdate(sql, Collections.EMPTY_MAP);
    }

    /**
     * SQL
     * <p>
     * delete from user where username = ?0 and sex = ?1
     * </p>
     *
     * @param sql
     * @param args
     * @return
     */
    protected int executeSqlUpdate(String sql, Object[] args) {
        Assert.hasLength(sql);
        int resultCount = 0;
        try {
            Query query = HibernateUtils.getSqlQuery(sql, masterSession(), isCurrent());
            if (null != args) {
                for (int i = 0; i < args.length; i++) {
                    HibernateUtils.setParams(query, StringUtils.toString(i), args[i]);
                }
            }
            resultCount = query.executeUpdate();
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
        }
        return resultCount;
    }

    /**
     * SQL
     * <p>
     * delete from user where username = :username and sex = :sex
     * </p>
     *
     * @param sql
     * @param params
     * @return
     */
    protected int executeSqlUpdate(String sql, Map<String, Object> params) {
        Assert.hasLength(sql);
        int resultCount = 0;
        if (StringUtils.isNotBlank(sql)) {
            try {
                Query query = HibernateUtils.getSqlQuery(sql, masterSession(), isCurrent());
                setParamMap(params, query);
                resultCount = query.executeUpdate();
            } catch (Exception e) {
                logger.warn("Warn: Unexpected exception.  Cause:" + e);
            }
        }
        return resultCount;
    }

    /**
     * SQL?
     *
     * @param sql
     * @return
     */
    protected int queryCount(String sql) {
        return queryCount(sql, SelectWrapper.DEFAULT);
    }

    /**
     * SQL?
     *
     * @param sql
     * @return
     */
    protected int queryCount(String sql, Wrapper wrapper) {
        Assert.hasLength(sql);
        sql += wrapper.getSqlSegment();
        int count = 0;
        try {
            Query query = HibernateUtils.getSqlQuery(sql, slaveSession(), isCurrent());
            BigInteger bigInteger = (BigInteger) query.uniqueResult();
            bigInteger.intValue();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return count;
    }

    /**
     * SQL?
     *
     * @param sql
     * @param wrapper
     * @return
     */
    protected Map<String, Object> queryMap(String sql, Wrapper wrapper) {
        Assert.hasLength(sql);
        Map<String, Object> map = Collections.emptyMap();
        try {
            sql += wrapper.getSqlSegment();
            Query query = HibernateUtils.getSqlQuery(sql, slaveSession(), isCurrent())
                    .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            map = (Map<String, Object>) query.uniqueResult();
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
        }
        return map;
    }

    /**
     * SQL?
     *
     * @param sql
     * @return
     */
    protected Map<String, Object> queryMap(String sql) {
        return queryMap(sql, SelectWrapper.DEFAULT);
    }

    /**
     * SQL
     *
     * @param sql
     * @param page
     * @return
     */
    protected Page<Map<String, Object>> queryMapsPage(String sql, Page page) {
        return queryMapsPage(sql, SelectWrapper.DEFAULT, page);
    }

    /**
     * SQL
     *
     * @param sql
     * @param wrapper
     * @param page
     * @return
     */
    protected Page<Map<String, Object>> queryMapsPage(String sql, Wrapper wrapper, Page page) {
        Assert.hasLength(sql);
        try {
            sql = SqlUtils.sqlList(sql, wrapper, page);
            Query query = HibernateUtils.getSqlQuery(sql, slaveSession(), isCurrent())
                    .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            HibernateUtils.setPage(page.getCurrent(), page.getSize(), query);
            page.setRecords(query.list());
            setPageTotal(sql, page);
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
        }
        return page;
    }

    /**
     * SQL
     *
     * @param sql
     * @return
     */
    protected List<Map<String, Object>> queryMaps(String sql) {
        return this.queryMaps(sql, Collections.EMPTY_MAP);
    }

    /**
     * SQL
     *
     * @param sql
     * @param params
     * @return
     */
    protected List<Map<String, Object>> queryMaps(String sql, Map<String, Object> params) {
        Assert.hasLength(sql);
        List list = Collections.emptyList();
        try {
            Query query = HibernateUtils.getSqlQuery(sql, slaveSession(), isCurrent())
                    .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            setParamMap(params, query);
            list = query.list();
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
        }
        return list;
    }

    /**
     * SQL
     *
     * @param sql
     * @param wrapper
     * @return
     */
    protected List<Map<String, Object>> queryMaps(String sql, Wrapper wrapper) {
        Assert.hasLength(sql);
        List list = Collections.emptyList();
        try {
            sql += wrapper.toString();
            Query query = HibernateUtils.getSqlQuery(sql, slaveSession(), isCurrent())
                    .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            list = query.list();
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
        }
        return list;
    }

    /**
     * 
     *
     * @param params
     * @return
     */
    public List<Map<String, Object>> queryMaps(Map<String, Object> params) {
        List<Map<String, Object>> list = Collections.emptyList();
        try {
            String hql = HibernateUtils.getListHql(poClass(), params);
            Query query = HibernateUtils.getHqlQuery(hql, slaveSession(), isCurrent())
                    .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            setParamMap(params, query);
            list = query.list();
        } catch (Exception e) {
            logger.warn("Warn: Unexpected exception.  Cause:" + e);
        }
        return list;

    }

    /**
     * Page total
     *
     * @param sql
     * @param page
     */
    private void setPageTotal(String sql, Page<?> page) {
        if (page.isSearchCount()) {
            String sqlCount = SqlUtils.sqlCountOptimize(sql);
            Query countQuery = HibernateUtils.getSqlQuery(sqlCount, slaveSession(), isCurrent());
            BigInteger bigInteger = (BigInteger) countQuery.uniqueResult();
            page.setTotal(bigInteger.intValue());
        }
    }

    /**
     * QueryMap?
     *
     * @param params
     * @param query
     * @return
     * @throws
     * @author Caratacus
     * @date 2016/9/2 0002
     * @version 1.0
     */
    private void setParamMap(Map<String, Object> params, Query query) {
        if (MapUtils.isNotEmpty(params)) {
            for (String key : params.keySet()) {
                Object obj = params.get(key);
                HibernateUtils.setParams(query, key, obj);
            }
        }
    }

    /**
     * ?toClass
     *
     * @return
     */
    protected Class<P> poClass() {
        return ReflectionKit.getSuperClassGenricType(getClass(), 0);
    }

    /**
     * ???Session
     *
     * @return
     */
    protected Boolean isCurrent() {
        return true;
    }

}