本文主要是介绍CRUD 反射 泛型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
首先设计一个公共的BaseDao接口,再设计一个抽象类去实现接口BaseDaoImpl的方法,接下来就是各自的具体接口UserDao,根据自身需要增加方法,然后自己的实现类UserDaoImpl去继承这个抽象类并且实现自身的接口
公共的BaseDao接口
import java.util.List;public interface BaseDao<T> {/*** 保存实体* * @param entity*/void save(T entity);/*** 删除实体* * @param id*/void delete(Long id);/*** 更新实体* * @param entity*/void update(T entity);/*** 按id查询* * @param id* @return*/T getById(Long id);/*** 按id查询* * @param ids* @return*/List<T> getByIds(Long[] ids);/*** 查询所有* * @return*/List<T> findAll();}
抽象类实现公共接口BaseDaoImpl
import java.lang.reflect.ParameterizedType;
import java.util.List;import javax.annotation.Resource;import org.hibernate.Session;
import org.hibernate.SessionFactory;
public abstract class BaseDaoImpl<T> implements BaseDao<T> {private Class<T> clazz;public BaseDaoImpl() {// 使用反射技术得到T的真实类型ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); // 获取当前new的对象的 泛型的父类 类型this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; // 获取第一个类型参数的真实类型System.out.println("clazz ---> " + clazz);}/*** 获取当前可用的Session* * @return*/protected Session getSession() {return sessionFactory.getCurrentSession();}public void save(T entity) {getSession().save(entity);}public void update(T entity) {getSession().update(entity);}public void delete(Long id) {Object obj = getById(id);if (obj != null) {getSession().delete(obj);}}public T getById(Long id) {return (T) getSession().get(clazz, id);}public List<T> getByIds(Long[] ids) {return getSession().createQuery(//"FROM User WHERE id IN (:ids)")//.setParameterList("ids", ids)//.list();}public List<T> findAll() {return getSession().createQuery(//"FROM " + clazz.getSimpleName())//.list();}}
具体的接口UserDao
public interface UserDao extends BaseDao<User> {// List<User> findByNameLike(String namePart);
}
具体实现类UserDaoImpl
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {}
测试类Test
public class Test {private User user=new User();@org.junit.Testpublic void test(){UserDao userDao=new UserDaoImpl();//new的泛型对象是User 父类是BaseDaoImpl // 获取第一个类型参数的真实类型如果是<k,v>所以需要获取第一个userDao.save(user);userDao.findByName(user);}
}
这篇关于CRUD 反射 泛型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!