最近在用 Hibernate 操作数据库的时候,发现每个实体类都要写增删改查,像这样。
后来发现,每写一个实体类都要写一份这个,这岂不是很麻烦,验证影响代码精简。为了消除冗余度,我们还是写一个父类,大家继承它好了。
开始干!
写一个接口,BaseDao.java
然后是它的实现,BaseDaoImpl.java
突然发现这个 BaseDao 好像 Spring Data JPA 里的 JpaRepository 类。
基类已经写好了,我们的 UserDao 只需要继承 BaseDaoImpl 类了
像这样
BaseDaoImpl<User, Integer> User 是实体类型,Integer 是主键类型
参考:https://www.cnblogs.com/lytwajue/p/6890608.html
本文地址:https://liuyanzhao.com/6989.html
- package com.change.dao;
- import com.change.entity.User;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.springframework.stereotype.Repository;
- import javax.annotation.Resource;
- import java.util.List;
- /**
- * @author 言曌
- * @date 2017/12/13 下午4:35
- */
- @Repository
- public class UserDao {
- @Resource
- private SessionFactory sessionFactory;
- private Session getSession() {
- return sessionFactory.getCurrentSession();
- }
- //根据id查询用户
- public User findById(Integer id) {
- return (User) this.getSession().get(User.class,id);
- }
- //获得用户列表
- public List<User> findAll() {
- List<User> userList = this.getSession().createCriteria(User.class).list();
- return userList;
- }
- //添加用户
- public void insert(User user) {
- this.getSession().save(user);
- }
- //删除单个用户
- public void delete(Integer id) {
- this.getSession().createQuery("delete User where userId=?").setParameter(0,id).executeUpdate();
- }
- //批量删除
- public void deleteBatch(Integer[] selectFlag) {
- //数组中封装的是ID的集合;
- String hql = "";
- for(int i=0;i<selectFlag.length;i++) {
- if(i==0) {
- hql = "id="+selectFlag[i];
- } else {
- hql = hql + " or id="+selectFlag[i];
- }
- }
- this.getSession().createQuery("delete from User where "+hql).executeUpdate();
- }
- //更新用户
- public void update(User user) {
- this.getSession().update(user);
- }
- }
后来发现,每写一个实体类都要写一份这个,这岂不是很麻烦,验证影响代码精简。为了消除冗余度,我们还是写一个父类,大家继承它好了。
开始干!
写一个接口,BaseDao.java
- package com.change.dao;
- import java.io.Serializable;
- import java.util.List;
- /**
- * @author 言曌
- * @date 2017/12/15 下午5:09
- */
- public interface BaseDao<T, PK extends Serializable> {
- // 依据主键获取实体。假设没有对应的实体。返回 null。
- public T get(PK id);
- // 依据主键获取实体。假设没有对应的实体。抛出异常。
- public T load(PK id);
- // 更新实体
- public void update(T entity);
- // 存储实体到数据库
- public void save(T entity);
- // 添加或更新实体
- public void saveOrUpdate(T entity);
- // 删除指定的实体
- public void delete(T entity);
- // 依据主键删除指定实体
- public void delete(PK id);
- //查询所有
- public List<T> findAll();
- public void delete(PK[] ids);
- }
然后是它的实现,BaseDaoImpl.java
- package com.change.dao;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import java.io.Serializable;
- import java.lang.reflect.ParameterizedType;
- import java.lang.reflect.Type;
- import java.util.List;
- /**
- * @author 言曌
- * @date 2017/12/15 下午5:17
- */
- public class BaseDaoImpl<T, PK extends Serializable> implements BaseDao<T, PK> {
- // 实体类类型(由构造方法自己主动赋值)
- private Class<T> entityClass;
- // 构造方法,依据实例类自己主动获取实体类类型
- public BaseDaoImpl() {
- this.entityClass = null;
- Class c = getClass();
- Type t = c.getGenericSuperclass();
- if (t instanceof ParameterizedType) {
- Type[] p = ((ParameterizedType) t).getActualTypeArguments();
- this.entityClass = (Class<T>) p[0];
- }
- }
- @Autowired
- private SessionFactory sessionFactory;
- private Session getSession() {
- return sessionFactory.getCurrentSession();
- }
- // 依据主键获取实体。假设没有对应的实体,返回null
- @Override
- public T get(PK id) {
- return (T) this.getSession().get(entityClass, id);
- }
- // 依据主键获取实体。假设没有对应的实体,抛出异常。
- @Override
- public T load(PK id) {
- return (T) this.getSession().load(entityClass, id);
- }
- // 更新实体
- @Override
- public void update(T entity) {
- this.getSession().update(entity);
- }
- // 存储实体到数据库
- @Override
- public void save(T entity) {
- this.getSession().save(entity);
- }
- // 添加或更新实体
- @Override
- public void saveOrUpdate(T entity) {
- this.getSession().saveOrUpdate(entity);
- }
- // 删除指定的实体
- @Override
- public void delete(T entity) {
- this.getSession().delete(entity);
- }
- // 依据主键删除指定实体
- @Override
- public void delete(PK id) {
- this.delete(this.load(id));
- }
- //查询所有
- @Override
- public List<T> findAll() {
- return this.getSession().createCriteria(entityClass).list();
- }
- //批量删除
- @Override
- public void delete(PK[] ids) {
- //数组中封装的是ID的集合;
- String hql = "";
- for(int i=0;i<ids.length;i++) {
- if(i==0) {
- hql = "id="+ids[i];
- } else {
- hql = hql + " or id="+ids[i];
- }
- }
- this.getSession().createQuery("delete from User where "+hql).executeUpdate();
- }
- }
突然发现这个 BaseDao 好像 Spring Data JPA 里的 JpaRepository 类。
基类已经写好了,我们的 UserDao 只需要继承 BaseDaoImpl 类了
像这样
BaseDaoImpl<User, Integer> User 是实体类型,Integer 是主键类型
- package com.change.dao;
- import com.change.entity.User;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.springframework.stereotype.Repository;
- import javax.annotation.Resource;
- import java.util.List;
- /**
- * @author 言曌
- * @date 2017/12/13 下午4:35
- */
- @Repository
- public class UserDao extends BaseDaoImpl<User, Integer> {
- @Resource
- private SessionFactory sessionFactory;
- private Session getSession() {
- return sessionFactory.getCurrentSession();
- }
- //根据用户名模糊查找
- public List<User> findByUsernameLike(String username) {
- String queryString = "from User u where u.userName like'%" + username + "%'";
- return this.getSession().createQuery(queryString).list();
- }
- }
参考:https://www.cnblogs.com/lytwajue/p/6890608.html
本文地址:https://liuyanzhao.com/6989.html
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏