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. 关于package.json的理解

    在我们打包项目的时候或者使用node的时候,常常会看到package.json这个文件,里面乱七八糟的一大堆json,开始的时候没注意,以为是使用node或者npm的时候自动创建的,后来自己写demo ...

  2. Shuffle 的 5步

    Shuffle的本意是洗牌.混乱的意思,类似于java中的Collections.shuffle(List)方法,它会随机地打乱参数list里的元素顺序.MapReduce中的Shuffle过程.所谓 ...

  3. [js高手之路]深入浅出webpack教程系列8-(postcss-loader,autoprefixer,html-loader,less-loader,ejs-loader)用法

    我们接着上文,那么在上篇文章的最后,写到了css-loader的用法,如果你用心发现,就能看到我在style.css样式文件中写了一个这样的样式: div { transition: all ease ...

  4. struts2和spring mvc的比较

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt236   Struts2 Springmvc       机制 基于filt ...

  5. 【ACM小白成长撸】--贪婪法解硬币找零问题

    question:假设有一种货币,它有面值为1分.2分.5分和1角的硬币,最少需要多少个硬币来找出K分钱的零钱.按照贪婪法的思想,需要不断地使用面值最大的硬币.如果找零的值小于最大的硬币值,则尝试第二 ...

  6. FPGA学习:VHDL设计灵活性&不同设计思路比较

    概要 由于VHDL编程实现数字电路具有很高的灵活性,为多种不同的思路编写实现同一种功能提供了可能.这些不同的设计思路,在耗费资源,可靠性,速度上也有很大的差异,往往需要我们根据实际需求和资源条件选择适 ...

  7. 关于SpringMVC项目报错:java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/xxxx.xml]

    关于SpringMVC项目报错:java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/xxxx ...

  8. 转:【Java并发编程】之十一:线程间通信中notify通知的遗漏(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17228213 notify通知的遗漏很容易理解,即threadA还没开始wait的时候,t ...

  9. 201521123034《Java程序设计》第八周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1) 1.1 实验总结 答:这题是在课堂上 ...

  10. 201521123007《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 1. clone方法 1.1 Object ...