EntityManager


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

  Entitymanager的核心概念图

          


EntityManager构建通用DAO


一般的开发都是需要每一个实体类都要构建一个DAO去继承JPA的一些类,我不咋喜欢这样的感觉,我比较喜欢一个项目中简洁不乱,所有偷懒的写了一个四不像的通用DAO

1、首先可以去官网看一下,了解一下entitymanager的一些方法

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

2、用@PersistenceContext动态注入Entitymanager

先来一个BaseDAO

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,其中注意的是@Transactional事务的注入

/**
* @author 坚持到底gl
* @create 2017-09-26 10:36
* @desc
**/
@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();
}
}

这一套就可以完成一个项目的差不多增删改查了,需要其他特殊功能的可以自行添加

【版本声明】本文为博主原创文章,转载请注明出处

Spring Boot-------JPA——EntityManager构建通用DAO的更多相关文章

  1. Spring Boot(五):Spring Boot Jpa 的使用

    在上篇文章Spring Boot(二):Web 综合开发中简单介绍了一下 Spring Boot Jpa 的基础性使用,这篇文章将更加全面的介绍 Spring Boot Jpa 常见用法以及注意事项. ...

  2. Spring Boot Jpa 的使用

    Spring Boot Jpa 介绍 首先了解 Jpa 是什么? Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种 ...

  3. (转)Spring Boot(五):Spring Boot Jpa 的使用

    http://www.ityouknow.com/springboot/2016/08/20/spring-boot-jpa.html 在上篇文章Spring Boot(二):Web 综合开发中简单介 ...

  4. spring boot JPA中实体类常用注解

    spring boot jpa中的注解很多,参数也比较多.没必要全部记住,但是经常查看官方文档也比较麻烦,记录一下一些常用的注解.通过一些具体的例子来帮助记忆. @Entity @Table(name ...

  5. Spring Boot JPA 连接数据库

    本文将介绍怎样在Spring Boot project中加入JPA作为持久化方式. 改动 pom.xml 依赖 与上一篇介绍的 jdbc 不同的是 spring-boot-starter-jdbc 改 ...

  6. Spring Boot Jpa 表名小写转大写

    今天在使用SpringBoot整合Hibernate后创建表,表名为小写,而在linux下,mysql的表名是区分大小写的,因此在我的数据表中,就出现了两个一样的表 act_id_user 和  AC ...

  7. Spring Boot JPA中关联表的使用

    文章目录 添加依赖 构建Entity 构建Repository 构建初始数据 测试 Spring Boot JPA中关联表的使用 本文中,我们会将会通过一个Book和Category的关联关系,来讲解 ...

  8. Spring Boot JPA的查询语句

    文章目录 准备工作 Containing, Contains, IsContaining 和 Like StartsWith EndsWith 大小写不敏感 Not @Query Spring Boo ...

  9. Spring Boot JPA中java 8 的应用

    文章目录 Optional Stream API CompletableFuture Spring Boot JPA中java 8 的应用 上篇文章中我们讲到了如何在Spring Boot中使用JPA ...

随机推荐

  1. django日期比较

    from django.db import models from django.utils import timezone import datetime # Create your models ...

  2. IO库

    IO类 C++语言不直接处理出入输出,而是通过一族定义在标准库中的类型来处理IO.这些类型支持从设备读取数据.向设备写入数据的IO操作,设备可以是文件 .控制台窗口 等.还有一些类型允许内存IO ,即 ...

  3. Ext.grid.EditorGridPanel分页刷新

    store.reload(); var start = grid.getBottomToolbar().cursor;//获取当前页开始条数 上面获取当前页第一条记录的方法有时候说未定义,我现在使用下 ...

  4. oracle数据块核心剖析

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp57 数据块(Oracle Data Blocks),本文简称为" ...

  5. SVN服务器搭建(一)

    本教程以64位win10系统为例在本地搭建svn服务器,安装完成后,即可访问本地svn服务器上的项目,也可以访问网上其他svn服务器上的项目. 一.首先准备三个软件: 1.VisualSVN-Serv ...

  6. 阿里云Prismplayer-Web播放器的使用

    Prismplayer是一套在线视频播放技术方案,同时支持Flash和Html5两种播放技术,可对播放器进行功能配置和皮肤定制.其在线使用文档地址为:https://help.aliyun.com/d ...

  7. Sqli-Labs学习总结一

    题目1-20 github地址 前言 以前对于SQL注入,就是先判断下能不能注入,可以的话先试着联合查询,不行的话再上SQLMap,去年寒假拿了一本<SQL注入攻击与防御>,拿回家,看了几 ...

  8. 201521123036 《Java程序设计》第8周学习总结

    本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 HashMap自定义排序 List<Map.Entry<Stri ...

  9. 201521123072《java程序设计》第五周学习总结

    201521123072<java程序设计>第五周学习总结 标签(空格分隔): java学习 1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 代码 ...

  10. 201521145048《Java程序设计》第4周学习总结

    1. 本章学习总结 学会了如何去设计一个类,尽量用private修饰属性,public修饰方法. 了解继承的目的. 了解继承和多态的关系. 了解关键字extends super final overr ...