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> {@PersistenceContextprivate EntityManager entityManager;@Transactional@Overridepublic boolean save(T entity){boolean flag=false;try {entityManager.persist(entity);flag=true;}catch (Exception e){System.out.println("---------------保存出错---------------");throw e;}return flag;}@Transactional@Overridepublic Object findByid(Object o,Long id) {return entityManager.find(o.getClass(),id);}@Transactional@Overridepublic 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;}@Overridepublic 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@Overridepublic 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@Overridepublic 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@Overridepublic 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@Overridepublic boolean update(T entity) {boolean flag = false;try {entityManager.merge(entity);flag = true;} catch (Exception e) {System.out.println("---------------更新出错---------------");}return flag;}@Transactional@Overridepublic 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@Overridepublic boolean delete(T entity) {boolean flag=false;try {entityManager.remove(entityManager.merge(entity));flag=true;}catch (Exception e){System.out.println("---------------删除出错---------------");}return flag;}@Overridepublic 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();} }
这一套就可以完成一个项目的差不多增删改查了,需要其他特殊功能的可以自行添加
【版本声明】本文为博主原创文章,转载请注明出处
转载于:https://www.cnblogs.com/zhouguanglin/p/7625655.html
Spring Boot-------JPA——EntityManager构建通用DAO相关推荐
- Spring Boot JPA 2.7.2
icon: edit date: 2022-01-02 category: CategoryA tag: tag A tag B star: true Spring Boot JPA 2.7.2 项目 ...
- 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 ...
- 使用Spring Boot和GraphQL构建安全的API
"我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. Grap ...
- (转)Spring Boot(五):Spring Boot Jpa 的使用
http://www.ityouknow.com/springboot/2016/08/20/spring-boot-jpa.html 在上篇文章Spring Boot(二):Web 综合开发中简单介 ...
- Spring Boot+JPA 有查询条件的查询
本篇介绍使用JPA 的条件查询, 关于JPA基本查询可以参考: Spring Boot+JPA 查询数据方式与代码演示 不安全的查询 在开发时, 为了简便, 习惯会拼接Where子句的查询条件, 查询 ...
- Spring Boot Jpa 表名小写转大写
今天在使用SpringBoot整合Hibernate后创建表,表名为小写,而在linux下,mysql的表名是区分大小写的,因此在我的数据表中,就出现了两个一样的表 act_id_user 和 AC ...
- Spring Boot Jpa 配置多个数据源,并读取其中一个表的具体数据
总体简介: Spring Boot Jpa配置多个数据源(此次两个mysql数据库),访问其中一个库 alime_counsel_assign_log下的assign_data_backflow表,实 ...
最新文章
- 设计模式之原型模式(Prototype)摘录
- 点击除元素以外的任意地方隐藏元素js
- 智慧停车介绍、产业链市场全透析
- Internet Explorer 8 使用技巧(2):加速器
- centos8共享文件夹挂载_MacOS自动挂载nfs服务器共享目录
- 数据中心运维认证中的管理要求
- 阿里巴巴开源容器镜像加速技术
- C++编程笔记:C++用new与不用new创建对象的区别
- [Effective JavaScript 笔记]第23条:永远不要修改arguments对象
- bigru参数计算_[数据挖掘]华中科技大学 李黎 周达明:基于CNN-BiGRU模型的操作票自动化校验方法...
- jquery 分页插件
- 弹幕服务器维护,分布式弹幕服务架构
- 线性和EWMA指数加权移动平均模型
- 摩尔庄园怎么显示全部服务器,摩尔庄园手游怎么看自己玩的什么服,服务器查看区别方法...
- Google map API:查询地理位置和经纬度信息示例
- VSCode配置Python教程
- 用ipv6校园网访问gg学术
- Docker 学习前置,网络IP地址以及交互
- 如何活让自己活得充实:其实很简单,把脑子里想的东西,变成行动,就能立刻充实起
- mac 安装 protoc
热门文章
- kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 【转】
- 在linux中emacs安装package.el
- vim文本编辑器的使用
- NativeXml (2):对象建立
- C# 学生信息管理系统 2.0
- oracle 删除已备份归档,通过RMAN联机全库备份,包括控制文件,归档日志文件,备份成功后,删除已备份的归档日志。...
- Haproxy实现负载均衡及相关配置(添加日志、设定自动刷新时间、控制访问、动静分离、读写分离)
- 2017小米面试题(句子反转)
- arraylist 初始化_ArrayList - 遍历ArrayList的三种方法
- 日历c语言程序,一个完整的日历程序(含有农历)