SpringBoot JPA EntityManager构建通用DAO

SpringBoot JPA EntityManager构建通用DAO

EntityManager 是用来对实体Bean 进行操作的辅助类。他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满足条件的实体Bean。实体Bean 被EntityManager 管理时,EntityManager跟踪他的状态改变,在任何决定更新实体Bean 的时候便会把发生改变的值同步到数据库中。当实体Bean 从EntityManager 分离后,他是不受管理的,EntityManager 无法跟踪他的任何状态改变。EntityManager 的获取前面已经介绍过,可以通过@PersistenceContext 注释由EJB 容器动态注入。

entitymanager的一些方法

  • persist() :添加实体Bean
  • flush() :将实体的改变立刻刷新到数据库中
  • merge () :比较麻烦,用好了很不错,配合flush
  • Remove() :删除对象
  • createQuery() :返回Query对象,以执行JPQL语句
  • createNativeQuery() :返回Query对象,以执行SQL语句
  • refresh() :刷新实体Bean,以得到对新对象
  • contains(): 检测实体当前是否被管理中
  • clear() 分离所有当前正在被管理的实体

EntityManager构建通用DAO

  • BaseDAO

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    public interface BaseAppDAO<T,ID extends Serializable> {
    /**
    * 保存数据对象
    * @param entity
    * @return
    */
    boolean save(T entity);
    /**
    * 根据id查询
    * @param id
    * @param t
    * @return
    */
    T findByid(T t,Long id);
    /**
    * 根据表名,字段,参数查询,拼接sql语句
    * @param tablename 表名
    * @param filed 字段名
    * @param o 字段参数
    * @return
    */
    List<T> findBysql(String tablename,String filed,Object o);
    Object findObjiectBysql(String tablename,String filed,Object o);

    /**
    * 多个字段的查询
    * @param tablename 表名
    * @param map 将你的字段传入map中
    * @return
    */
    List<T> findByMoreFiled(String tablename,LinkedHashMap<String,Object> map);

    /**
    * 多字段查询分页
    * @param tablename 表名
    * @param map 以map存储key,value
    * @param start 第几页
    * @param pageNumer 一个页面的条数
    * @return
    */
    List<T> findByMoreFiledpages(String tablename, LinkedHashMap<String,Object> map, int start, int pageNumer);
    /**
    * 一个字段的分页
    * @param tablename 表名
    * @param filed 字段名
    * @param o 字段参数
    * @param start 第几页
    * @param pageNumer 一个页面多少条数据
    * @return
    */
    List<T> findpages(String tablename,String filed,Object o,int start,int pageNumer);
    /**
    * 根据表的id删除数据
    * @param entity
    */
    boolean delete(T entity);
    /**
    * 更新对象
    * @param e
    * @return
    */
    boolean update(T e);
    /**
    * 根据传入的map遍历key,value拼接字符串,以id为条件更新
    * @param tablename 表名
    * @param map 传入参数放入map中
    * @return
    */
    Integer updateMoreFiled(String tablename,LinkedHashMap<String,Object> map);


    /**
    * 根据条件查询总条数返回object类型
    * @param tablename 表名
    * @param map 传入参数放入map中
    * @return
    */
    Object findCount(String tablename, LinkedHashMap<String,Object> map);
    }
  • 实现类BaseDAOimpl
    其中值得注意用@PersistenceContext动态注入Entitymanager,@Transactional事务的注入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    @Repository
    public class BaseAppDAOimpl<T,ID extends Serializable> implements BaseAppDAO<T,ID> {

    @PersistenceContext
    private EntityManager entityManager;
    @Transactional
    @Override
    public boolean save(T entity){
    boolean flag=false;
    try {
    entityManager.persist(entity);
    flag=true;
    }catch (Exception e){
    System.out.println("---------------保存出错---------------");
    throw e;
    }
    return flag;
    }
    @Transactional
    @Override
    public Object findByid(Object o,Long id) {
    return entityManager.find(o.getClass(),id);
    }
    @Transactional
    @Override
    public List<T> findBysql(String tablename, String filed, Object o ) {
    String sql="from "+tablename+" u WHERE u."+filed+"=?";
    System.out.println(sql+"--------sql语句-------------");
    Query query=entityManager.createQuery(sql);
    query.setParameter(1,o);
    List<T> list= query.getResultList();
    entityManager.close();
    return list;
    }

    @Override
    public Object findObjiectBysql(String tablename, String filed, Object o) {
    String sql="from "+tablename+" u WHERE u."+filed+"=?";
    System.out.println(sql+"--------sql语句-------------");
    Query query=entityManager.createQuery(sql);
    query.setParameter(1,o);

    entityManager.close();
    return query.getSingleResult();
    }
    @Transactional
    @Override
    public List<T> findByMoreFiled(String tablename,LinkedHashMap<String,Object> map) {
    String sql="from "+tablename+" u WHERE ";
    Set<String> set=null;
    set=map.keySet();
    List<String> list=new ArrayList<>(set);
    List<Object> filedlist=new ArrayList<>();
    for (String filed:list){
    sql+="u."+filed+"=? and ";
    filedlist.add(filed);
    }
    sql=sql.substring(0,sql.length()-4);
    System.out.println(sql+"--------sql语句-------------");
    Query query=entityManager.createQuery(sql);
    for (int i=0;i<filedlist.size();i++){
    query.setParameter(i+1,map.get(filedlist.get(i)));
    }
    List<T> listRe= query.getResultList();
    entityManager.close();
    return listRe;
    }
    @Transactional
    @Override
    public List<T> findByMoreFiledpages(String tablename,LinkedHashMap<String,Object> map,int start,int pageNumber) {
    String sql="from "+tablename+" u WHERE ";
    Set<String> set=null;
    set=map.keySet();
    List<String> list=new ArrayList<>(set);
    List<Object> filedlist=new ArrayList<>();
    for (String filed:list){
    sql+="u."+filed+"=? and ";
    filedlist.add(filed);
    }
    sql=sql.substring(0,sql.length()-4);
    System.out.println(sql+"--------sql语句-------------");
    Query query=entityManager.createQuery(sql);
    for (int i=0;i<filedlist.size();i++){
    query.setParameter(i+1,map.get(filedlist.get(i)));
    }
    query.setFirstResult((start-1)*pageNumber);
    query.setMaxResults(pageNumber);
    List<T> listRe= query.getResultList();
    entityManager.close();
    return listRe;
    }
    @Transactional
    @Override
    public List<T> findpages(String tablename, String filed, Object o, int start, int pageNumer) {
    String sql="from "+tablename+" u WHERE u."+filed+"=?";
    System.out.println(sql+"--------page--sql语句-------------");
    List<T> list=new ArrayList<>();
    try {
    Query query=entityManager.createQuery(sql);
    query.setParameter(1,o);
    query.setFirstResult((start-1)*pageNumer);
    query.setMaxResults(pageNumer);
    list= query.getResultList();
    entityManager.close();
    }catch (Exception e){
    System.out.println("------------分页错误---------------");
    }

    return list;
    }
    @Transactional
    @Override
    public boolean update(T entity) {
    boolean flag = false;
    try {
    entityManager.merge(entity);
    flag = true;
    } catch (Exception e) {
    System.out.println("---------------更新出错---------------");
    }
    return flag;
    }
    @Transactional
    @Override
    public Integer updateMoreFiled(String tablename, LinkedHashMap<String, Object> map) {
    String sql="UPDATE "+tablename+" AS u SET ";
    Set<String> set=null;
    set=map.keySet();
    List<String> list=new ArrayList<>(set);
    for (int i=0;i<list.size()-1;i++){
    if (map.get(list.get(i)).getClass().getTypeName()=="java.lang.String"){
    System.out.println("-*****"+map.get(list.get(i))+"------------"+list.get(i));
    sql+="u."+list.get(i)+"='"+map.get(list.get(i))+"' , ";
    }else {
    sql+="u."+list.get(i)+"="+map.get(list.get(i))+" , ";
    }
    }
    sql=sql.substring(0,sql.length()-2);
    sql+="where u.id=? ";
    System.out.println(sql+"--------sql语句-------------");
    int resurlt=0;
    try {
    Query query=entityManager.createQuery(sql);
    query.setParameter(1,map.get("id"));
    resurlt= query.executeUpdate();
    }catch (Exception e){
    System.out.println("更新出错-----------------------");
    e.printStackTrace();

    }
    return resurlt;
    }

    @Transactional
    @Override
    public boolean delete(T entity) {
    boolean flag=false;
    try {
    entityManager.remove(entityManager.merge(entity));
    flag=true;
    }catch (Exception e){
    System.out.println("---------------删除出错---------------");
    }
    return flag;
    }

    @Override
    public Object findCount(String tablename, LinkedHashMap<String, Object> map) {
    String sql="select count(u) from "+tablename+" u WHERE ";
    Set<String> set=null;
    set=map.keySet();
    List<String> list=new ArrayList<>(set);
    List<Object> filedlist=new ArrayList<>();
    for (String filed:list){
    sql+="u."+filed+"=? and ";
    filedlist.add(filed);
    }
    sql=sql.substring(0,sql.length()-4);
    System.out.println(sql+"--------sql语句-------------");
    Query query=entityManager.createQuery(sql);
    for (int i=0;i<filedlist.size();i++){
    query.setParameter(i+1,map.get(filedlist.get(i)));
    }
    return query.getSingleResult();
    }
    }

人生两苦:想要却不得,拥有却失去。 –褚禄山
珍惜当下,与君共勉~


本文标题:SpringBoot JPA EntityManager构建通用DAO

文章作者:fufua

发布时间:2019年05月27日 - 10:43:13

最后更新:2019年05月27日 - 17:39:38

原始链接:https://qq1028951741.github.io/2019/05/27/SpringBoot JPA EntityManager构建通用DAO/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

this is end, thank you for reading