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

com.yuweix.kuafu.dao.hibernate.AbstractDao Maven / Gradle / Ivy

The newest version!
package com.yuweix.kuafu.dao.hibernate;


import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

import com.yuweix.kuafu.sharding.annotation.Shard;
import jakarta.annotation.Resource;
import org.hibernate.Session;
import org.hibernate.SessionFactory;


/**
 * @author yuwei
 */
public abstract class AbstractDao implements Dao {
	protected Class clz;
	protected SessionFactory sessionFactory;
	protected ThreadLocal sessionTL = new ThreadLocal<>();


	@SuppressWarnings("unchecked")
	public AbstractDao() {
		this.clz = null;
		Type t = getClass().getGenericSuperclass();
		if (t instanceof ParameterizedType) {
			this.clz = (Class) ((ParameterizedType) t).getActualTypeArguments()[0];
		}
	}

	@Resource
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	protected Session getSession() {
		Session sess = sessionTL.get();
		return sess != null ? sess : sessionFactory.getCurrentSession();
	}

	@Override
	public void onStart() {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		sessionTL.set(session);
	}
	@Override
	public void onSuccess() {
		Session session = sessionTL.get();
		if (session == null) {
			return;
		}
		session.getTransaction().commit();
	}
	@Override
	public void onFailure() {
		Session session = sessionTL.get();
		if (session == null) {
			return;
		}
		session.getTransaction().rollback();
	}
	@Override
	public void onComplete() {
		Session session = sessionTL.get();
		if (session != null && session.isOpen()) {
			session.close();
		}
		sessionTL.remove();
	}

	@Override
	public Class getPersistClz() {
		return clz;
	}

	@Override
	public T get(PK id) {
		return getSession().get(clz, id);
	}

	@Override
	public T get(@Shard Object shardingVal, PK id) {
		return getSession().get(clz, id);
	}

	@Override
	public void save(@Shard final T t) {
		getSession().persist(t);
	}

	@Override
	public void update(@Shard final T t) {
		getSession().merge(t);
	}

	@Override
	public void deleteByKey(PK id) {
		final T t = get(id);
		if (t != null) {
			getSession().remove(t);
		}
	}

	@Override
	public void deleteByKey(@Shard Object shardingVal, PK id) {
		final T t = get(id);
		if (t != null) {
			getSession().remove(t);
		}
	}

	@Override
	public void delete(@Shard final T t) {
		getSession().remove(t);
	}


	/**
	 * 查询某个表的所有字段
	 * @param sql
	 * @param params
	 * @return
	 */
	protected List query(String sql, Map params) {
		return new MapCallback<>(sql, clz, params).doInHibernate(getSession());
	}
	/**
	 * 查询某个表的所有字段
	 * @param sql
	 * @return
	 */
	protected List query(String sql) {
		return query(sql, (Object[]) null);
	}
	/**
	 * 查询某个表的所有字段
	 * @param sql
	 * @param params
	 * @return
	 */
	protected List query(String sql, Object[] params) {
		return new IndexCallback<>(sql, clz, params).doInHibernate(getSession());
	}


	/**
	 * 查询某个表的所有字段。分页查询
	 * @param sql
	 * @param params
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	protected List query(String sql, Map params, int pageNo, int pageSize) {
		return new MapCallback<>(sql, clz, pageNo, pageSize, params).doInHibernate(getSession());
	}
	/**
	 * 查询某个表的所有字段。分页查询
	 * @param sql
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	protected List query(String sql, int pageNo, int pageSize) {
		return query(sql, (Object[]) null, pageNo, pageSize);
	}
	/**
	 * 查询某个表的所有字段。分页查询
	 * @param sql
	 * @param params
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	protected List query(String sql, Object[] params, int pageNo, int pageSize) {
		return new IndexCallback<>(sql, clz, pageNo, pageSize, params).doInHibernate(getSession());
	}


	/**
	 * 查询记录的条数
	 * @param sql
	 * @param params
	 * @return
	 */
	protected int queryCount(String sql, Map params) {
		Integer cnt = new MapCountCallback(sql, params).doInHibernate(getSession());
		return cnt == null ? 0 : cnt;
	}
	/**
	 * 查询记录的条数
	 * @param sql
	 * @return
	 */
	protected int queryCount(String sql) {
		return queryCount(sql, (Object[]) null);
	}
	/**
	 * 查询记录的条数
	 * @param sql
	 * @param params
	 * @return
	 */
	protected int queryCount(String sql, Object[] params) {
		Integer cnt = new IndexCountCallback(sql, params).doInHibernate(getSession());
		return cnt == null ? 0 : cnt;
	}


	/**
	 * 查询某个表的所有字段。只取单条记录
	 * @param sql
	 * @param params
	 * @return
	 */
	protected T queryForObject(String sql, Map params) {
		List list = query(sql, params);
		return list == null || list.size() <= 0 ? null : list.get(0);
	}

	/**
	 * 查询某个表的所有字段。只取单条记录
	 * @param sql
	 * @param params
	 * @return
	 */
	protected T queryForObject(String sql, Object[] params) {
		List list = query(sql, params);
		return list == null || list.size() <= 0 ? null : list.get(0);
	}
	/**
	 * 查询某个表的所有字段。只取单条记录
	 * @param sql
	 * @return
	 */
	protected T queryForObject(String sql) {
		return queryForObject(sql, (Object[]) null);
	}

	protected List> queryForMapList(String sql, Map params, int pageNo, int pageSize) {
		return new MapCallback(sql, Map.class, pageNo, pageSize, params).doInHibernate(getSession());
	}
	protected List> queryForMapList(String sql, Map params) {
		return new MapCallback(sql, Map.class, params).doInHibernate(getSession());
	}

	protected List> queryForMapList(String sql, int pageNo, int pageSize) {
		return queryForMapList(sql, (Object[]) null, pageNo, pageSize);
	}
	protected List> queryForMapList(String sql, Object[] params, int pageNo, int pageSize) {
		return new IndexCallback(sql, Map.class, pageNo, pageSize, params).doInHibernate(getSession());
	}
	protected List> queryForMapList(String sql, Object[] params) {
		return new IndexCallback(sql, Map.class, params).doInHibernate(getSession());
	}

	/**
	 * 执行增删改操作
	 * @param sql
	 * @param params
	 * @return
	 */
	protected int execute(String sql, Map params) {
		Integer cnt = new MapModifyCallback(sql, params).doInHibernate(getSession());
		return cnt == null ? 0 : cnt;
	}
	/**
	 * 执行增删改操作
	 * @param sql
	 * @param params
	 * @return
	 */
	protected int execute(String sql, Object[] params) {
		Integer cnt = new IndexModifyCallback(sql, params).doInHibernate(getSession());
		return cnt == null ? 0 : cnt;
	}
	/**
	 * 执行增删改操作
	 * @param sql
	 * @return
	 */
	protected int execute(String sql) {
		return execute(sql, (Object[]) null);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy