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