Spring Boot-------JPA——EntityManager构建通用DAO
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的更多相关文章
- Spring Boot(五):Spring Boot Jpa 的使用
在上篇文章Spring Boot(二):Web 综合开发中简单介绍了一下 Spring Boot Jpa 的基础性使用,这篇文章将更加全面的介绍 Spring Boot Jpa 常见用法以及注意事项. ...
- Spring Boot Jpa 的使用
Spring Boot Jpa 介绍 首先了解 Jpa 是什么? Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种 ...
- (转)Spring Boot(五):Spring Boot Jpa 的使用
http://www.ityouknow.com/springboot/2016/08/20/spring-boot-jpa.html 在上篇文章Spring Boot(二):Web 综合开发中简单介 ...
- spring boot JPA中实体类常用注解
spring boot jpa中的注解很多,参数也比较多.没必要全部记住,但是经常查看官方文档也比较麻烦,记录一下一些常用的注解.通过一些具体的例子来帮助记忆. @Entity @Table(name ...
- Spring Boot JPA 连接数据库
本文将介绍怎样在Spring Boot project中加入JPA作为持久化方式. 改动 pom.xml 依赖 与上一篇介绍的 jdbc 不同的是 spring-boot-starter-jdbc 改 ...
- Spring Boot Jpa 表名小写转大写
今天在使用SpringBoot整合Hibernate后创建表,表名为小写,而在linux下,mysql的表名是区分大小写的,因此在我的数据表中,就出现了两个一样的表 act_id_user 和 AC ...
- Spring Boot JPA中关联表的使用
文章目录 添加依赖 构建Entity 构建Repository 构建初始数据 测试 Spring Boot JPA中关联表的使用 本文中,我们会将会通过一个Book和Category的关联关系,来讲解 ...
- Spring Boot JPA的查询语句
文章目录 准备工作 Containing, Contains, IsContaining 和 Like StartsWith EndsWith 大小写不敏感 Not @Query Spring Boo ...
- Spring Boot JPA中java 8 的应用
文章目录 Optional Stream API CompletableFuture Spring Boot JPA中java 8 的应用 上篇文章中我们讲到了如何在Spring Boot中使用JPA ...
随机推荐
- 最新Windows下Redis集群
实现简单的Windows下Redis集群配置,以下是配置过程中出现的几个问题: [1]逐个启动7001 7002 7003 7004 7005 7006节点时,出现createing server T ...
- new和newInstance区别
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp55 在初始化一个类,生成一个实例的时候:newInstance() ...
- sql执行机制
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp38 sql执行机制 1.对于普通的sql语句只有where条件的执行机制 ...
- Java环境的搭建
一.JDK的下载 JDK又称Java SE,可以从Oracle公司的官网上https://www.oracle.com/index.html下载. 1.打开Oracle官网.将光标移到[Menu]-[ ...
- Singleton(单例)模式
Singleton(单例)模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. public class Singleton { private static Singleton ourIns ...
- Lombok的使用
下面介绍几个我常用的 lombok 注解: @Data :注解在类上:提供类所有属性的 getting 和 setting 方法,此外还提供了equals.canEqual.has ...
- 201521123056 《Java程序设计》第13周学习总结
1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 1.1 答: ...
- 201521123060 《Java程序设计》第14周学习总结
1.本周学习总结 1.1以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2.书面作业 1.MySQL数据库基本操作 1.1建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己 ...
- 201521123027 <java程序设计>第十周学习总结
1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 异常: 多线程: 2.书面作业 Q1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 ...
- logback:用slf4j+logback实现多功能日志解决方案
slf4j是原来log4j的作者写的一个新的日志组件,意思是简单日志门面接口,可以跟其他日志组件配合使用,常用的配合是slf4j+logback,无论从功能上还是从性能上都较之log4j有了很大的提升 ...