使用spring-boot的jpa制作框架并实现自动生成功能

本文介绍了如何利用Spring Boot集成JPA来制作框架,并实现了自动生成功能,包括service、dao、controller层代码。文章强调了在使用过程中,需要将类放在特定包下,并注意在Dao层方法上添加@Transactional注解以避免数据库连接耗尽的问题。
摘要由CSDN通过智能技术生成

spring-boot集成jpa制作框架并自动生成代码

前言:

jpa的使用可以采用jpa接口规范或采用entityManger但用起来感觉不是很爽,以前用过mybatisplugin感觉很好用

现在就按照他的思想做了个


core核心层

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 *create by yinchong
 * @param <T> 实体类
 */
public interface BaseDao<T> {

    void save(T bean);

    void update(T bean);

    T findOne(Serializable id);

    /**
     * 根据id删除制定数据
     * @param id
     * @return
     */
    int delete(Serializable id);

    /**
     * 查询所有数据
     * @return
     */
    List<T> findAll();

    /**
     * 分页显示数据
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<T> pageList(int pageNum, int pageSize);

    /**
     * 查询所有并按主键降序
     * @return
     */
    List<T> findAllDesc();

    /**
     * 分页显示并按主键降序
     * @return
     */
    List<T> pageListDesc(int pageNum, int pageSize);

    /**
     * 对指定字段降序排序
     * @param fieldName
     * @return
     */
    List<T> findAllDesc(String fieldName);

    /**
     * 安某个字段并查找指定数据个数
     * @param fielName
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<T> pageListDesc(String fielName, int pageNum, int pageSize);

    /**
     * 查询所有并按主键升序
     * @return
     */
    List<T> findAllAsc();

    /**
     * 查找指定数量并按主键升序
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<T> pageListAsc(int pageNum, int pageSize);

    /**
     * 对指定字段升序排序
     * @param fieldName
     * @return
     */
    List<T> findAllAsc(String fieldName);

    /**
     * 对指定字段降序并查询指定数量
     * @param fieldName
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<T> pageListAsc(String fieldName, int pageNum, int pageSize);

    /**
     * 批量保存
     * @param beans
     */
    void batchSave(List<T> beans);

    /**
     * 批量更新所有字段
     * @param beans
     */
    void batchUpdate(List<T> beans);

    /**
     * 批量删除
     * @param ids
     * @return
     */
     int batchDelete(List<? extends Serializable> ids);

    /**
     * 批量更新非空字段
     * @param beans
     */
    void batchUpdateNotNull(List<T> beans);

    /**
     * 这个用于执行删除和更新的sql语句
     *
     * @param sql
     * @param params
     */
    int executeSql(String sql, Object... params);

    /**
     * 这个用于执行删除和更新的hql语句
     * @param hql
     * @param params
     */
    int executeHql(String hql, Object... params);

    /**
     * 根据原始sql语句执行sql
     *
     * @param sql    原始sql语句
     * @param params 要传递的参数
     * @return map对象
     */
    List<Map<String, Object>> findSql(String sql, Object... params);

    /**
     * @param sql    原始sql语句
     * @param clazz  要反射的Class对象
     * @param params 要传递的参数
     * @param <T>
     * @return
     */
    <T> List<T> findSql(String sql, Class<T> clazz, Object... params);

    /**
     * 执行原始sql并返回Object[]集合
     * @param sql
     * @param params
     * @return
     */
    List<Object[]> findObjectSql(String sql, Object... params);

    /**
     * 分页显示数据
     *
     * @param sql
     * @param pageNum  第几页
     * @param pageSize 每页显示多少个
     * @param params   需要传递的参数
     * @return
     */
    PageBean<Map<String,Object>> pageSql(String sql, Integer pageNum, Integer pageSize, Object... params);

    /**
     * 分页查询
     * @param sql
     * @param pageNum
     * @param pageSize
     * @param params
     * @return
     */
    PageBean<Object[]> pageObjectSql(String sql,int pageNum,int pageSize,Object ...params);

    /**
     * 执行hql查询语句
     * @param hql
     * @param params
     * @return
     */
    List<T> findHql(String hql, Object... params);

    /**
     * hql语句返回Object[]对象
     * @param hql
     * @param params
     * @return
     */
    List<Object[]> findObjectHql(String hql, Object... params);

    /**
     * hql的分页操作
     * @param hql
     * @param pageNum
     * @param pageSize
     * @param params
     * @return
     */
    PageBean<T> pageHql(String hql, Integer pageNum, Integer pageSize, Object... params);


    /**
     *hql执行统计总数
     * @param hql
     * @param params
     * @return
     */
    Long countHql(String hql, Object... params);

    /**
     * 执行统计总数
     * @param sql
     * @param params
     * @return
     */
    Long countSql(String sql, Object... params);

    /**
     * 更新非空字段
     * @param bean
     * @return
     */
    int updateNotNull(T bean);

    /**
     * 根据字段删除数据
     * @param field
     * @param value
     * @return
     */
    int deleteEqualField(String field, Object value);

    /**
     * like匹配删除
     * @param field
     * @param value
     * @return
     */
    int deleteLikeField(String field, String value);

    /**
     * 相等查找
     * @param field 字段名
     * @param value 字段对应的值
     * @return
     */
    List<T> findEqualField(String field, Object value);

    /**
     * like匹配查找
     * @param field 字段名
     * @param value 字段对应的值
     * @return
     */
    List<T> findLikeField(String field, String value);

    /**
     * 根据字段进行between查询
     * @param field
     * @param start
     * @param end
     * @return
     */
    List<T> findBetweenField(String field, Object start, Object end);

    /**
     * 删除所有
     */
    int deleteAll();

    /**
     * 对bean对象的多个字段and的equal匹配
     * @param data
     * @return
     */
    List<T> findAndFields(Map<String, Object> data);

    /**
     * 对bean对象多个字段or的equal匹配
     * @param data
     * @return
     */
    List<T> findOrFields(Map<String, Object> data);

    /**
     * 获取一个指定类型结果
     * @param hql
     * @param clazz
     * @param <T2>
     * @return
     */
    <T2> T2 findOneHql(String hql, Class<T2> clazz, Object... params);

    /**
     * 获取一个指定类型结果
     * @param sql
     * @param clazz
     * @param <T2>
     * @return
     */
    <T2> T2 findOneSql(String sql, Class<T2> clazz, Object... params);
}


import org.hibernate.transform.Transformers;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.math.BigInteger;
import java.util.*;

/***
**create by yinchong
*/
public class BaseDaoImpl<T> implements BaseDao<T> {

    private Class<T> clazz;

    public BaseDaoImpl() {
        ParameterizedType t = (ParameterizedType) this.getClass().getGenericSuperclass();
        //获取泛型参数的实际类型
        this.clazz = (Class<T>) t.getActualTypeArguments()[0];
    }

    @PersistenceContext
    protected EntityManager entityManager;


    @Transactional(propagation = Propagation.REQUIRED)
    public void save(T bean) {
       Field id =  ReflectUtils.getIdField(bean.getClass());
       Object value = null;
        try {
            value = id.get(bean);
        } catch (IllegalAccessException e) {
           throw new RuntimeException(e);
        }
        if(value==null) {
           entityManager.persist(bean);
       }else{
           update(bean);
       }
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void update(T bean) {
        entityManager.merge(bean);
    }

    public T findOne(Serializable id) {
        return entityManager.find(clazz, id);
    }


    /**
     * @param id
     * @return 小于0 表示删除失败 大与0表示删除成功
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public int delete(Serializable id) {
        String hql = "delete from " + clazz.getSimpleName() + " p where p."+getIdProperties(clazz)+" = ?1";
        Query query = entityManager.createQuery(hql);
        query.setParameter(1, id);
        return query.executeUpdate();
    }

    private String getIdProperties(Class clazz){
       Field field =  ReflectUtils.getIdField(clazz);
       return field.getName();
    }


    /**
     * 显示所有数据
     * @return
     */
    public List<T> findAll() {
        String hql = "select t from " + clazz.getSimpleName() + " t";
        Query query = entityManager.createQuery(hql,clazz);
        List<T> beans = query.getResultList();
        return beans;
    }

    @Override
    public List<T> pageList(int pageNum, int pageSize) {
        String hql = "select t from " + clazz.getSimpleName() + " t";
        Query query = entityManager.createQuery(hql,clazz);
        limitDatas(pageNum,pageSize,query);
        List<T> beans = query.getResultList();
        return beans;
    }

    @Override
    public List<T> findAllDesc() {
        String id = getIdProperties(clazz);
        String hql = "select t from " + clazz.getSimpleName() + " t order by t."+id+" desc";
        return findHql(hql);
    }

    @Override
    public List<T> pageListDesc(int pageNum, int pageSize) {
        String id = getIdProperties(clazz);
        String hql = "select t from " + clazz.getSimpleName() + " t order by t."+id+" desc";
        Query query = entityManager.createQuery(hql,clazz);
        limitDatas(pageNum,pageSize,query);
        return query.getResultList();
    }

    @Override
    public List<T> findAllDesc(String fieldName) {
        String hql = "select t from " + clazz.getSimpleName() + " t order by t."+fieldName+" desc";
        return findHql(hql);
    }

    @Override
    public List<T> pageListDesc(String fieldName, int pageNum, int pageSize) {
        String hql = "select t from " + clazz.getSimpleName() + " t order by t."+fieldName+" desc";
        Query query = entityManager.createQuery(hql,clazz);
       limitDatas(pageNum,pageSize,query);
        return query.getResultList();
    }

    @Override
    public List<T> findAllAsc() {
        String id = getIdProperties(clazz);
        String hql = "select t from " + clazz.getSimpleName() + " t order by t."+id+" asc";
        return findHql(hql);
    }

    @Override
    public List<T> pageListAsc(int pageNum, int pageSize) {
        if(pageNum<=0)
            pageNum=1;
        String id = getIdProperties(clazz);
        String hql = "select t from " + clazz.getSimpleName() + " t order by t."+id+" asc";
        Query query = entityManager.createQuery(hql,clazz);
        query.setFirstResult((pageNum-1)*pageSize);
        query.setMaxResults(pageSize);
        return query.getResultList();
    }

    @Override
    public List<T> findAllAsc(String fieldName) {
        String hql = "select t from " + clazz.getSimpleName() + " t order by t."+fieldName+" asc";
        return findHql(hql);
    }

    @Override
    public List<T> pageListAsc(String fieldName, int pageNum, int pageSize) {
        if(pageNum<=0)
            pageNum=1;
        String hql = "select t from " + clazz.getSimpleName() + " t order by t."+fieldName+" asc";
        Query query = entityManager.createQuery(hql,clazz);
        query.setFirstResult((pageNum-1)*pageSize);
        query.setMaxResults(pageSize);
        return query.getResultList();
    }


    /**
     * 批量插入
     * @param beans
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void batchSave(List<T> beans) {
        int count =0;
        if (beans != null) {
            for (T bean : beans) {
                count++;
                entityManager.persist(bean);
                if(count%1000==0){
                    entityManager.flush();
                    entityManager.clear();
                }
            }
            entityManager.flush();
            entityManager.clear();
        }

    }


    /**
     * 批量更新
     * @param beans
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void batchUpdate(List<T> beans) {
        if (beans != null) {
            for (T bean : beans)
                entityManager.merge(bean);
            entityManager.flush();
            entityManager.clear();
        }
    }


    @Transactional(propagation = Propagation.REQUIRED)
    public int batchDelete(List<? extends Serializable> ids) {
        StringBuffer hql = new StringBuffer("delete from " + clazz.getSimpleName() + " p where p."+getIdProperties(clazz)+"  in(:ids)");
        Query query = entityManager.createQuery(hql.toString());
        query.setParameter("ids", ids);
        return query.executeUpdate();
    }


    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void batchUpdateNotNull(List<T> beans) {
        if (beans == null || beans.size() == 0)
            return;
            List<Map<String, Object>> datas = new LinkedList<>();
            for (T bean : beans) {
                Map<String, Object> data = ReflectUtils.createMapForNotNull(bean);
                datas.add(data);
            }
            String id = getIdProperties(clazz);

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值