当前位置: 首页 > news >正文

拥抱JPA规范

为什么80%的码农都做不了架构师?>>>   hot3.png

JPA+HIbernate配置

下面是ApplicationContxt文件

<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="packagesToScan" value="sbeat.model" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
		</property>
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
			</props>
		</property>
	</bean>

	<bean id="hibernateJpaVendorAdapter"
		class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
		<property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
	</bean>

	<tx:annotation-driven />

	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">  
        <property name="entityManagerFactory" ref="entityManagerFactory"/> 
        <property name="dataSource" ref="dataSource" /> 
    </bean>  

JPA动态查询

CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery<T> query=cb.createQuery(clazz);
//clazz是你想要转换的类型,就是你的Entity.claa,如果你查的是count,就是Long.claa
Root<T> root=query.from(clazz);
query.select(root);//选取实体

//选择的条件
List<Predicate> predicates=new ArrayList<Predicate>();
predicates.add(cb.equal(..));
predicates.add(..);
...
query.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));

上面通过数组来组合与条件,还有一种方式:

Predicate predicate=cb.conjunction();//交集
predicate=cb.and(predicate,cb.equal(root.get("sex"),condition.get("sex")));

Predicate predicate=cb.disjunction();//并集
predicate=cb.or(predicate,cb.equal(root.get("sex"),condition.get("sex")));

JPA里面对类型控制比较严格,如下所示:

//比较大小
cb.gt(root.<Integer>get("degree"),(Integer) condition.get("degree"));

//like
cb.like(root.get("user").<String> get("nickName"),keyword)

//in 条件
root.get("tags").in(condition.get("tag"))

对于关联映射,如果是ToOne,你可以连写get

root.get("user").get("account");

对于ToMany的,你可以使用Join

CriteriaQuery<Parent> criteria = cb.createQuery((Class<Parent>) Parent.class);
Root<Parent> parent = criteria.from(Parent.class);

criteria.select((Selection<T>) parent);
SetJoin<Parent, Children> children = parent.joinSet("children", JoinType.LEFT);

Predicate sexPredicate = cb.equal(children.get("sex"), "MALE");
parent.fetch(children);
//parent.fetch("children");//try also this

criteria.where(sexPredicate);

JPA分页

取分页内容

TypedQuery<T> typedQuery=entityManager.createQuery(query);
typedQuery.setFirstResult((pageNum-1)*PAGE_SIZE);
typedQuery.setMaxResults(PAGE_SIZE);

取查询数目

CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery<Long> query=cb.createQuery(Long.class);
query.select(cb.count(query.from(clazz)));//选取实体
return entityManager.createQuery(query).getSingleResult();

JPA 动态更新

CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaUpdate<T> op=cb.createCriteriaUpdate(clazz);
Root<T> root=op.from(clazz);
op.set(fieldName, value);
op.where(cb.equal(root.get(keyName), delta.get(keyName)));
entityManager.createQuery(op).executeUpdate();

JPQL

JPA的JPQL语句和Hibernate的HQL语句十分类似

Query query=entityManager.createQuery("SELECT r FROM Resume r WHERE r.user.id=:userId");
query.setParameter("id", userId);
return (Resume) query.getSingleResult();

JPA CRUD

public interface GenericDAO<T> {
	public void insert(T t);

	public void update(T t);

	public void simpleUpdate(Map<Object, Object> delta);

	public void delete(T t);

	public T load(Long id);

	public void refresh(T t);

	public List<T> list(int pageNum);

	public Long count();

	public List<T> findByCondition(Map<Object,Object> condition);

	public Long countByCondition(Map<Object,Object> condition);
}

@SuppressWarnings("unchecked")
public class GenericDAOImpl<T> implements GenericDAO<T> {

	private Class<T> clazz;

	@PersistenceContext
	protected EntityManager entityManager;

	protected Session getCurrentSession() {
		return entityManager.unwrap(Session.class);
	}

	public GenericDAOImpl(){
		//取得T的类型变量
		ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
        clazz = (Class<T>) type.getActualTypeArguments()[0];
	}

	public void insert(T t) {
		entityManager.persist(t);
	}

	public void update(T t) {
		entityManager.merge(t);
	}

	public void simpleUpdate(Map<Object, Object> delta) {
		Field[] fields=clazz.getDeclaredFields();
		CriteriaBuilder cb=entityManager.getCriteriaBuilder();
		CriteriaUpdate<T> op=cb.createCriteriaUpdate(clazz);
		Root<T> root=op.from(clazz);

		String keyName="id";//默认选择基准为Id

		//调整选择域
		if(delta.containsKey("keyName")) keyName=(String) delta.get("keyName");

		for(Field field:fields){
			String fieldName=field.getName();
			if(fieldName==keyName) continue;
			if(delta.containsKey(fieldName)){
				op.set(fieldName, delta.get(fieldName));
			}
		}

		op.where(cb.equal(root.get(keyName), delta.get(keyName)));
		entityManager.createQuery(op).executeUpdate();
	}

	public void delete(T t) {
		entityManager.remove(t);
	}

	public T load(Long id) {
		return (T) entityManager.find(clazz, id);
	}

	public List<T> list(int pageNum) {
		CriteriaBuilder cb=entityManager.getCriteriaBuilder();
		CriteriaQuery<T> query=cb.createQuery(clazz);
		Root<T> root=query.from(clazz);
		query.select(root);//选取实体
		query.orderBy(cb.desc(root.get("created")));//排序
		TypedQuery<T> typedQuery=entityManager.createQuery(query);
		if(pageNum>0){
			typedQuery.setFirstResult((pageNum-1)*SbeatConfig.PAGE_SIZE);
			typedQuery.setMaxResults(SbeatConfig.PAGE_SIZE);
		}

		return typedQuery.getResultList();
	}

	public void refresh(T t) {
		entityManager.refresh(t);
	}

	public Long count() {
		//返回数目
		CriteriaBuilder cb=entityManager.getCriteriaBuilder();
		CriteriaQuery<Long> query=cb.createQuery(Long.class);
		query.select(cb.count(query.from(clazz)));//选取实体
		return entityManager.createQuery(query).getSingleResult();
	}

	public List<T> findByCondition( Map<Object, Object> condition) {
		Field[] fields=clazz.getDeclaredFields();
		CriteriaBuilder cb=entityManager.getCriteriaBuilder();
		CriteriaQuery<T> query=cb.createQuery(clazz);
		Root<T> root=query.from(clazz);
		query.select(root);//选取实体

		//选择的条件
		List<Predicate> predicates=new ArrayList<Predicate>();
		for(Field field:fields){
			String fieldName=field.getName();
			if(condition.containsKey(fieldName)){
				predicates.add(cb.equal(root.get(fieldName), condition.get(fieldName)));
			}
		}
		query.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));
		query.orderBy(cb.desc(root.get("created")));
		TypedQuery<T> typedQuery=entityManager.createQuery(query);

		Integer pageNum=0;
		if(condition.containsKey(pageNum)){
			pageNum=(Integer) condition.get("pageNum");
		}
		if(pageNum>0){
			typedQuery.setFirstResult((pageNum-1)*SbeatConfig.PAGE_SIZE);
			typedQuery.setMaxResults(SbeatConfig.PAGE_SIZE);
		}
		return typedQuery.getResultList();
	}

	public Long countByCondition(Map<Object, Object> condition) {
		Field[] fields=clazz.getDeclaredFields();
		CriteriaBuilder cb=entityManager.getCriteriaBuilder();
		CriteriaQuery<Long> query=cb.createQuery(Long.class);
		Root<T> root=query.from(clazz);
		query.select(cb.count(root));//选取实体

		List<Predicate> predicates=new ArrayList<Predicate>();
		for(Field field:fields){
			String fieldName=field.getName();
			if(condition.containsKey(fieldName)){
				predicates.add(cb.equal(root.get(fieldName), condition.get(fieldName)));
			}
		}
		query.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));
		return entityManager.createQuery(query).getSingleResult();
	}

}

转载于:https://my.oschina.net/suemi/blog/697180

相关文章:

  • ChemDraw在苹果电脑上能不能用
  • 版本控制系统svn搭建
  • I.MX6 U-boot imxotp MAC address 写入
  • XJOI网上同步训练DAY1 T3
  • 【java虚拟机系列】JVM类加载器与ClassNotFoundException和NoClassDefFoundError
  • phpStorm设置显示代码行号
  • 【DAY1】Linux的安装和基本命令学习笔记
  • ASP.net Membership角色与权限管理(二)
  • XML和HTML之间的差异
  • 互联网时代程序员如何避免知识半衰期?
  • MarkDown 语法
  • LAMP--Apache 不记录指定文件类型的日志
  • linux diff命令
  • sql linq lamda
  • 存储过程的输出参数为游标,PL/SQL中如何调用 Java代码如何调用
  • 【Leetcode】104. 二叉树的最大深度
  • 2017-08-04 前端日报
  • docker容器内的网络抓包
  • javascript数组去重/查找/插入/删除
  • Java到底能干嘛?
  • js如何打印object对象
  • Linux Process Manage
  • magento2项目上线注意事项
  • mysql外键的使用
  • React Native移动开发实战-3-实现页面间的数据传递
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SOFAMosn配置模型
  • spring学习第二天
  • Vue官网教程学习过程中值得记录的一些事情
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 蓝海存储开关机注意事项总结
  • 前端存储 - localStorage
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 源码安装memcached和php memcache扩展
  • 追踪解析 FutureTask 源码
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #、%和$符号在OGNL表达式中经常出现
  • #pragma pack(1)
  • #WEB前端(HTML属性)
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (转)Sql Server 保留几位小数的两种做法
  • (转)visual stdio 书签功能介绍
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • (状压dp)uva 10817 Headmaster's Headache
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET Core 中的路径问题
  • .net core控制台应用程序初识
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net mvc 获取url中controller和action
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调