- 浏览: 73815 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
L504919167:
有个问题,“1.一对一主键关联 ”的时候。使用XML方式配置时 ...
hibernate和jpa注解关联总结 -
pangbuddy:
men4661273 写道一个都没看过,,,我也不是神,那就是 ...
程序员有影响的书 -
men4661273:
一个都没看过,,,我也不是神,那就是我out了
程序员有影响的书
spring+jpa的整合
数据库文件
实体类
泛型dao
泛型dao的实现
定义一个具体的dao继承泛型dao
GoodsDao的实现,这里继承泛型dao的实现
GoodsService 代码
Goodsservice实现
测试代码
spring的配置文件
数据库文件
/* Navicat MySQL Data Transfer Source Server : mysql Source Server Version : 50165 Source Host : localhost:3306 Source Database : testdb Target Server Type : MYSQL Target Server Version : 50165 File Encoding : 65001 Date: 2012-09-11 12:46:12 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `goods` -- ---------------------------- DROP TABLE IF EXISTS `goods`; CREATE TABLE `goods` ( `goodsId` int(11) unsigned NOT NULL AUTO_INCREMENT, `price` double(10,2) NOT NULL, `goodName` varchar(20) NOT NULL, PRIMARY KEY (`goodsId`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of goods -- ---------------------------- INSERT INTO `goods` VALUES ('1', '1.54', '冰激凌'); INSERT INTO `goods` VALUES ('2', '3.60', '面包'); INSERT INTO `goods` VALUES ('7', '5200.00', 'thinkpad笔记本'); INSERT INTO `goods` VALUES ('8', '5200.00', 'thinkpad笔记本');
实体类
package com.own.entity; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Goods implements Serializable { @Id @GeneratedValue(strategy=GenerationType.AUTO) public int getGoodsId() { return goodsId; } public void setGoodsId(int goodsId) { this.goodsId = goodsId; } public String getGoodName() { return goodName; } public void setGoodName(String goodName) { this.goodName = goodName; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } private int goodsId; private String goodName; private double price; }
泛型dao
package com.own.dao; import java.io.Serializable; public interface GenericDao<T extends Serializable,PK extends Serializable> { /** * 保存一个对象 * @param obj */ void saveObject(T obj); /** * 删除一个对象 * @param obj */ void deleteObject(T obj); /** * 更新一个对象 * @param ojb */ void updateObject(T ojb); /** * 根据主键id找到一个对象 * @param id */ T findObject(PK id); }
泛型dao的实现
package com.own.dao.impl; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import com.own.dao.GenericDao; public abstract class GenericDaoImpl<T extends Serializable ,PK extends Serializable> implements GenericDao<T,PK>{ @PersistenceContext protected EntityManager em; private Class<T> entityClass; @SuppressWarnings("unchecked") public GenericDaoImpl(){ /** * 获取泛型的实际类型 */ ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass(); entityClass = (Class<T>)type.getActualTypeArguments()[0]; } @Override public void deleteObject(T obj) { // TODO Auto-generated method stub em.remove(em.merge(obj)); } @Override public T findObject(PK id) { // TODO Auto-generated method stub return (T)em.find(entityClass,id); } @Override public void saveObject(T obj) { // TODO Auto-generated method stub em.persist(obj); } @Override public void updateObject(T obj) { // TODO Auto-generated method stub em.merge(obj); } }
定义一个具体的dao继承泛型dao
package com.own.dao; import com.own.entity.Goods; public interface GoodsDao extends GenericDao<Goods,Integer> { /** * 添加需要的方法 */ }
GoodsDao的实现,这里继承泛型dao的实现
package com.own.dao.impl; import org.springframework.stereotype.Repository; import com.own.dao.GoodsDao; import com.own.entity.Goods; @Repository("goodsDao") public class GoodsDaoImpl extends GenericDaoImpl<Goods,Integer> implements GoodsDao { }
GoodsService 代码
package com.own.service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.own.entity.Goods; public interface GoodsService { @Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class) void saveGoods(Goods goods); @Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class) void removeGoods(Goods goods); //查找方法不需要配置事务 Goods getGoodsById(int id); /** * 配置事务 * */ @Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class) void updateGoods(Goods goods); }
Goodsservice实现
package com.own.service.impl; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.own.dao.GoodsDao; import com.own.entity.Goods; import com.own.service.GoodsService; @Service("goodsService") public class GoodsServiceImpl implements GoodsService { @Resource(name="goodsDao") private GoodsDao goodsDao; @Override public Goods getGoodsById(int id) { // TODO Auto-generated method stub return goodsDao.findObject(id); } @Override public void removeGoods(Goods goods) { // TODO Auto-generated method stub goodsDao.deleteObject(goods); } @Override public void saveGoods(Goods goods) { // TODO Auto-generated method stub goodsDao.saveObject(goods); } @Override public void updateGoods(Goods goods) { // TODO Auto-generated method stub goodsDao.updateObject(goods); } }
测试代码
package com.own.service; import static org.junit.Assert.*; import javax.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.own.entity.Goods; @ContextConfiguration(locations={"classpath:applicationContext.xml"}) @RunWith(SpringJUnit4ClassRunner.class) public class GoodsServiceTest { @Resource(name="goodsService") private GoodsService goodsService; @Test public void testSaveGoods() { Goods goods = new Goods(); goods.setGoodName("电视机"); goods.setPrice(2300); goodsService.saveGoods(goods); } @Test public void testRemoveGoods() { Goods goods = new Goods(); goods.setGoodsId(2); //Goods good = (Goods)goodsService.getGoodsById(1); goodsService.removeGoods(goods); } @Test public void testGetGoodsById() { Goods good = (Goods)goodsService.getGoodsById(1); String name = good.getGoodName(); System.out.println(good.getGoodName()); assertEquals("冰激凌",name); } @Test public void testUpdateGoods() { Goods good = new Goods(); good.setGoodsId(7); good.setGoodName("巧克力"); goodsService.updateGoods(good); } }
spring的配置文件
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <!-- 配置连接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" > <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=UTF-8" /> <property name="username" value="root" ></property> <property name="password" value="zyp" ></property> <property name="maxActive" value="20" ></property> <property name="initialSize" value="3" > </property> <property name="maxWait" value="60000" ></property> <property name="maxIdle"><value>20</value></property> <property name="minIdle"><value>0</value></property> </bean> <!-- 配置jap实现提供商的特性 --> <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" > <property name="database" value="MYSQL" ></property> </bean> <!-- 持久化提供商 --> <bean id="persistenceProvider" class="org.hibernate.ejb.HibernatePersistence"/> <!--配置spring对jpa的支持 --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > <property name="dataSource"> <ref bean="dataSource" /> </property> <!-- 持久化单原名称 --> <property name="persistenceUnitName" value="zyp" /> <!-- 持久化提供商 --> <property name="persistenceProvider" > <ref bean="persistenceProvider" /> </property> <!-- 特性提供商配置 --> <property name="jpaVendorAdapter" > <ref bean="jpaVendorAdapter" /> </property> <!-- jpa 属性配置 --> <property name="jpaProperties"> <props> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.max_fetch_depth">3</prop> <prop key="hibernate.hbm2ddl.auto">false</prop> <prop key="hibernate.jdbc.fetch_size" >18</prop> <prop key="hibernate.jdbc.batch_size" >10</prop> <prop key="hibernate.format_sql" >true</prop> </props> </property> </bean> <context:component-scan base-package="com.own" /> <!-- 配置事物管理 --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
发表评论
-
mysql sqlserver oracel分页sql语句
2013-04-07 21:59 1353项目一直都用的hibernate,很少对分页查询写sql语句, ... -
数据库事物乐观锁和悲观锁
2012-10-16 00:09 1161数据库事物单个逻辑单元工作执行的一系列操作,就是一些sql语句 ... -
jpa persist,meger,remove,find方法介绍
2012-09-17 11:18 9159jpa规范提供了EntityManager接口来操作数据库,它 ... -
spring事务管理
2012-09-13 17:41 1451spring 提供了声明事务管 ... -
mybatis入门例子
2012-09-11 12:55 3833mybatis是由ibatis发展而来的,是一个很好用的jav ... -
测试访问时间的Filter
2012-08-24 13:54 894今天写了一个测试访问某个资源花费多少时间的过滤器,给大家分享一 ... -
servelt filter listener 的生命周期
2012-08-17 15:24 42451. servlet 当第一次请求一个servlet资 ...
相关推荐
综上所述,"spring3.1+hibernate4+jpa Dao"的集成是一个高效、灵活的企业级应用开发架构,它结合了Spring的IoC和AOP能力、Hibernate的ORM功能以及JPA的标准接口,通过泛型DAO实现和事务管理,为开发者提供了强大的...
泛型DAO(Data Access Object)是一种设计模式,用于抽象数据访问层的操作,提供通用的CRUD(Create, Read, Update, Delete)方法。通过泛型,DAO可以适用于多种类型的实体,降低了代码重复。例如,一个BaseDAO接口...
总的来说,"SSHWithAnnotationDemo"项目展示了如何利用现代Java技术栈的高级特性,包括Struts2、Spring3和Hibernate的注解功能,DAO层的泛型设计以及通用的分页实现,来构建一个高效、可维护的Web应用。这样的实践...
对于JPA,Spring Data通过泛型 Repository 接口提供了一种声明式的方法来执行CRUD(创建、读取、更新、删除)操作,减少了手动编写DAO(数据访问对象)和Repository层的代码。 **PostgreSQL** PostgreSQL是一种开源...
SpringDataJpa通过泛型接口和注解,大大简化了数据库操作,开发者无需编写大量的DAO层代码,即可实现对数据库的CRUD操作。它支持多种ORM框架,如Hibernate和MyBatis,使得开发者可以根据项目需求灵活选择。 Mysql...
通过提供泛型接口Repository,开发者无需编写大量的DAO层代码,就能实现对数据库的基本操作,如增删查改。在JavaConfig中,我们需要定义一个配置类,使用`@EnableJpaRepositories`注解来启用JPA仓库,并通过`@Bean`...
本文将详细介绍泛型DAO模式在Java Web开发中的应用,包括泛型机制、JPA框架、Struts框架和Spring框架的使用。 一、泛型机制 Java 5.0版本引入了泛型机制,提供了一种解决方案,使用类型参数来代替Object类型的变量...
【标题】"Hibernate泛型Dao"是针对Java开发中的数据持久化框架Hibernate的一个高级应用,主要目的是为了提高代码的复用性和简洁性。在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data ...
目录 企业级应用的特点 JPA及JPA使用技巧 使用泛型DAO来简化DAO层的开发 IOC容器、AOP及Spring2 EasyJWeb如何实现快速开发 小结
Spring Data JPA 通过提供一套简单而强大的API,极大地简化了基于JPA的数据访问操作。它不仅减少了大量冗余的代码编写工作,而且提高了开发效率和代码的可维护性。对于已具备一定Java编程基础的开发者来说,掌握...
Spring 数据 JPA 是一个强大的框架,它为使用 Java 持久化 API (JPA) 与 Spring 框架集成提供了便利。JPA 允许开发者使用注解来定义实体对象及其数据库行为,减少了手动编写 SQL 和 DAO 类的需求。在 Spring 中,JPA...
在实际的Java Web应用中,我们可以结合Spring框架的Hibernate或JPA支持,进一步简化泛型DAO的实现,利用Spring的模板类如JdbcTemplate、HibernateTemplate等,自动处理SQL执行和结果映射。 总的来说,泛型DAO在Java...
对数据库的操作无非就“增删改查”。就最为普遍的单表操作而言,除了表和字段不同外,语句都是类似的,开发人员需要写...Spring-data-jpa的出现正可以让这样一个已经很“薄”的数据访问层变成只是一层接口的编写方式。
- 泛型DAO:利用Java的泛型特性,创建可复用的DAO,减少代码冗余。 5. **Spring与JPA的事务管理** - 无XML配置事务:使用`@EnableTransactionManagement`注解,配合`@Transactional`注解在方法级别定义事务。 - ...
- `DAO(1).rar`可能包含使用泛型的DAO设计模式示例,展示了如何创建泛型DAO以处理不同类型的数据对象。 综上所述,SSH框架结合泛型能够提升Java应用的开发效率和代码质量。通过学习和理解这些示例,开发者可以更好...
通过这种方式,Spring Data JPA会自动为你生成接口的实现,你无需编写任何DAO层的实现类。只需注入Repository接口,就可以直接调用方法进行数据库操作。这种接口式的编程方式极大地提高了代码的可读性和可维护性。 ...
在Spring Data JPA中,我们通常将自己的DAO接口继承CrudRepository接口和JpaSpecificationExecutor接口。CrudRepository接口主要负责增/删/改的操作,而JpaSpecificationExecutor接口主要负责查询的操作。这两个接口...
Spring Data JPA简化了数据访问层的实现,通过自动化的 Repository 接口实现,使得开发者只需定义接口,而无需编写具体的DAO方法。 3. **Repository接口** Spring Data JPA的关键在于Repository接口,它是数据访问...
1. **代码生成**:Spring Data JPA可以根据接口自动生成实现,减少了手动编写DAO层代码的工作量。 2. **查询自动化**:通过方法命名规则,Spring Data JPA能自动解析方法名并生成相应的JPA查询,如`findAllByTitle...