dao泛型优化使用
1.加依赖
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.10.2.RELEASE</version>
</dependency>
2.配置bean.xml,@:entityManagerFactory的配置
<?
xml version
="1.0"
encoding
="UTF-8"
?>
<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: aop ="http://www.springframework.org/schema/aop" xmlns: tx ="http://www.springframework.org/schema/tx"
xmlns: jpa ="http://www.springframework.org/schema/data/jpa"
xsi :schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd" >
< context :component-scan base-package ="com.babasport" >
< context :exclude-filter type ="annotation" expression ="org.springframework.stereotype.Controller" ></ context :exclude-filter>
</ context :component-scan>
<!-- dataSource -->
<bean id ="dataSource" class ="com.alibaba.druid.pool.DruidDataSource"
init-method ="init" destroy-method ="close" >
<property name ="driverClassName" value ="com.mysql.jdbc.Driver" />
<property name ="url" value ="jdbc:mysql://localhost:3306/babasport" />
<property name ="username" value ="root" />
<property name ="password" value ="root" />
<property name ="filters" value ="stat" />
<property name ="maxActive" value ="20" />
<property name ="initialSize" value ="1" />
<property name ="maxWait" value ="60000" />
<property name ="minIdle" value ="1" />
<property name ="timeBetweenEvictionRunsMillis" value ="3000" />
<property name ="minEvictableIdleTimeMillis" value ="300000" />
<property name ="validationQuery" value ="SELECT 'x'" />
<property name ="testWhileIdle" value ="true" />
<property name ="testOnBorrow" value ="false" />
<property name ="testOnReturn" value ="false" />
</bean>
<bean id ="entityManagerFactory"
class ="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
<property name ="dataSource" ref ="dataSource" />
<property name ="packagesToScan" value ="com.babasport.entity" />
<property name ="jpaVendorAdapter" ref ="jpaVendorAdapter" />
<property name ="jpaProperties" >
<props>
<prop key ="hibernate.hbm2ddl.auto" >update </prop>
<prop key ="hibernate.show_sql" >true </prop>
<prop key ="hibernate.format_sql" >true </prop>
</props>
</property>
</bean>
<bean id ="jpaVendorAdapter"
class ="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >
<property name ="generateDdl" value ="true" />
<property name ="database" value ="MYSQL" />
</bean>
<!-- 配置Spring Data JPA扫描目录 -->
< jpa :repositories base-package ="com.babasport.dao" />
<!-- 配置事务管理器 -->
<bean id ="transactionManager" class ="org.springframework.orm.jpa.JpaTransactionManager" >
<property name ="entityManagerFactory" ref ="entityManagerFactory" />
</bean>
< aop :config>
< aop :pointcut id ="service" expression ="execution(public * com.babasport.service..*.*(..))" />
< aop :advisor pointcut-ref ="service" advice-ref ="txAdvice" />
</ aop :config>
< tx :advice id ="txAdvice" transaction-manager ="transactionManager" >
< tx :attributes>
< tx :method name ="get*" read-only ="true" />
< tx :method name ="save*" propagation ="REQUIRED" />
< tx :method name ="del*" propagation ="REQUIRED" />
< tx :method name ="update*" propagation ="REQUIRED" />
</ tx :attributes>
</ tx :advice>
</beans>
<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: aop ="http://www.springframework.org/schema/aop" xmlns: tx ="http://www.springframework.org/schema/tx"
xmlns: jpa ="http://www.springframework.org/schema/data/jpa"
xsi :schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd" >
< context :component-scan base-package ="com.babasport" >
< context :exclude-filter type ="annotation" expression ="org.springframework.stereotype.Controller" ></ context :exclude-filter>
</ context :component-scan>
<!-- dataSource -->
<bean id ="dataSource" class ="com.alibaba.druid.pool.DruidDataSource"
init-method ="init" destroy-method ="close" >
<property name ="driverClassName" value ="com.mysql.jdbc.Driver" />
<property name ="url" value ="jdbc:mysql://localhost:3306/babasport" />
<property name ="username" value ="root" />
<property name ="password" value ="root" />
<property name ="filters" value ="stat" />
<property name ="maxActive" value ="20" />
<property name ="initialSize" value ="1" />
<property name ="maxWait" value ="60000" />
<property name ="minIdle" value ="1" />
<property name ="timeBetweenEvictionRunsMillis" value ="3000" />
<property name ="minEvictableIdleTimeMillis" value ="300000" />
<property name ="validationQuery" value ="SELECT 'x'" />
<property name ="testWhileIdle" value ="true" />
<property name ="testOnBorrow" value ="false" />
<property name ="testOnReturn" value ="false" />
</bean>
<bean id ="entityManagerFactory"
class ="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
<property name ="dataSource" ref ="dataSource" />
<property name ="packagesToScan" value ="com.babasport.entity" />
<property name ="jpaVendorAdapter" ref ="jpaVendorAdapter" />
<property name ="jpaProperties" >
<props>
<prop key ="hibernate.hbm2ddl.auto" >update </prop>
<prop key ="hibernate.show_sql" >true </prop>
<prop key ="hibernate.format_sql" >true </prop>
</props>
</property>
</bean>
<bean id ="jpaVendorAdapter"
class ="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >
<property name ="generateDdl" value ="true" />
<property name ="database" value ="MYSQL" />
</bean>
<!-- 配置Spring Data JPA扫描目录 -->
< jpa :repositories base-package ="com.babasport.dao" />
<!-- 配置事务管理器 -->
<bean id ="transactionManager" class ="org.springframework.orm.jpa.JpaTransactionManager" >
<property name ="entityManagerFactory" ref ="entityManagerFactory" />
</bean>
< aop :config>
< aop :pointcut id ="service" expression ="execution(public * com.babasport.service..*.*(..))" />
< aop :advisor pointcut-ref ="service" advice-ref ="txAdvice" />
</ aop :config>
< tx :advice id ="txAdvice" transaction-manager ="transactionManager" >
< tx :attributes>
< tx :method name ="get*" read-only ="true" />
< tx :method name ="save*" propagation ="REQUIRED" />
< tx :method name ="del*" propagation ="REQUIRED" />
< tx :method name ="update*" propagation ="REQUIRED" />
</ tx :attributes>
</ tx :advice>
</beans>
3.定义接口继承一个类PagingAndSortingRepository<Province,Integer> @:CrudRepository的子类,内置很多常用增删查改,findAll() save() delete(Id) findOne(Id) 功能更强大,包含分页方法:findAll(pageRequest);
public interface ProvinceRepository extends PagingAndSortingRepository<Province,Integer>{
@Query("select count(b.id) from Brand b") //可以自己写hql语句,和方法绑定,调用方法,执行语句,返回结果
long count();
@Query("select b from Brand b where b.name like ?1 and b.description like ?2")
Brand findByNameLike(String name, String description);
}
PagingAndSortingRepository CrudRepository 只能被接口继承,接口自动由容器自动重写方法,不能被类继承,否则其父接口实现类全要自己写,列如findAll(),findOne()等等
jpa要写在配置Spring Data JPA扫描目录
<!-- 配置Spring Data JPA扫描目录 -->
<jpa:repositories base-package="com.babasport.dao"/>
Dao自定义接口继承即可使用,service下注入接口后即可使用方法
public interface BrandRepository extends PagingAndSortingRepository<Brand,Integer> {
}
Service实现方法
@Override //不带条件的分页显示
public Page<Brand> getPage(Integer pageNumber, Integer pageSize) {
PageRequest pageRequest = this.buildPageRequest(pageNumber, pageSize);
Page<Brand> brandPage = brandRepository.findAll(pageRequest);
return brandPage;
}
@Resource
private BrandRepository brandRepository; //一定是父接口,这里使用泛型,只有父接口,和底层动态代理相关
@Override
public Iterable<Brand> getAll() {
return brandRepository.findAll();
}
@Override
public void saveOrUpdate(Brand brand) {
brandRepository.save(brand);
}
@Override
public void delBrandById(int brandId) {
brandRepository.delete(brandId);
}
@Override
public Brand getBrandById(int brandId) {
return brandRepository.findOne(brandId);
}
//构建PageRequest
private PageRequest buildPageRequest(Integer pageNumber, Integer pageSize) {
return new PageRequest(pageNumber - 1, pageSize, null);
}
优化Dao后补充 待条件的分页显示 sql原生 效率高;hql效率低,开发速率快
@Repository
public class ProductDaoImpl implements ProductDao {
@PersistenceContext // @Resource
private EntityManager entityManager; //相当于 private SessionFactory sessionFactory;
@Override
public long getCounts(String name, Byte isShow, Integer brandId) {
// String sql = "select count(1) from bbs_product where 1=1";
// if (!name.equals("")) {
// sql = sql + " and name like '%" + name + "%'";
// }
// if (isShow != null) {
// sql = sql + " and is_show=" + isShow;
// }
// if (brandId != 0) {
// sql = sql + " and brand_id=" + brandId;
// }
// Query query = entityManager.createNativeQuery(sql);
// long counts = new BigInteger(query.getSingleResult().toString()).longValue();
// return counts;
String hql="select count(1) from Product p where 1=1";
if(!name.equals("")){
hql=hql+" and p.name like '%"+name+"%'";
}
if (isShow != null) {
hql = hql + " and p.isShow=" + isShow;
}
if (brandId != 0) {
hql = hql + " and p.brand.id=" + brandId;
}
Query query = entityManager.createQuery(hql);
long counts = new BigInteger(query.getSingleResult().toString()).longValue();
return counts;
}
@Override
public List<Object[]> getProductsPage(String name, Byte isShow, Integer brandId, Integer pageNumber, Integer pageSize) {
List<Object[]> productList=new ArrayList<>();
int begin=(pageNumber-1)*pageSize;
String sql = "select * from bbs_product where 1=1";
if (!name.equals("")) {
sql = sql + " and name like '%" + name + "%'";
}
if (isShow != null) {
sql = sql + " and is_show=" + isShow;
}
if (brandId != 0) {
sql = sql + " and brand_id=" + brandId;
}
Query query = entityManager.createNativeQuery(sql);
query.setFirstResult(begin);
query.setMaxResults(pageSize);
List<Object[]> resultList = query.getResultList();
return resultList;
}
public List<Product> getProductsPage1(String name, Byte isShow, Integer brandId, Integer pageNumber, Integer pageSize){
int begin=(pageNumber-1)*pageSize;
String hql="from Product p where 1=1";
if(!name.equals("")){
hql=hql+" and p.name like '%"+name+"%'";
}
if (isShow != null) {
hql = hql + " and p.isShow=" + isShow;
}
if (brandId != 0) {
hql = hql + " and p.brand.id=" + brandId;
}
Query query = entityManager.createQuery(hql);
query.setFirstResult(begin);
query.setMaxResults(pageSize);
List<Product> resultList = query.getResultList();
return resultList;
}
}
@Repository
public class ProductDaoImpl implements ProductDao {
@PersistenceContext // @Resource
private EntityManager entityManager; //相当于 private SessionFactory sessionFactory;
@Override
public long getCounts(String name, Byte isShow, Integer brandId) {
// String sql = "select count(1) from bbs_product where 1=1";
// if (!name.equals("")) {
// sql = sql + " and name like '%" + name + "%'";
// }
// if (isShow != null) {
// sql = sql + " and is_show=" + isShow;
// }
// if (brandId != 0) {
// sql = sql + " and brand_id=" + brandId;
// }
// Query query = entityManager.createNativeQuery(sql);
// long counts = new BigInteger(query.getSingleResult().toString()).longValue();
// return counts;
String hql="select count(1) from Product p where 1=1";
if(!name.equals("")){
hql=hql+" and p.name like '%"+name+"%'";
}
if (isShow != null) {
hql = hql + " and p.isShow=" + isShow;
}
if (brandId != 0) {
hql = hql + " and p.brand.id=" + brandId;
}
Query query = entityManager.createQuery(hql);
long counts = new BigInteger(query.getSingleResult().toString()).longValue();
return counts;
}
@Override
public List<Object[]> getProductsPage(String name, Byte isShow, Integer brandId, Integer pageNumber, Integer pageSize) {
List<Object[]> productList=new ArrayList<>();
int begin=(pageNumber-1)*pageSize;
String sql = "select * from bbs_product where 1=1";
if (!name.equals("")) {
sql = sql + " and name like '%" + name + "%'";
}
if (isShow != null) {
sql = sql + " and is_show=" + isShow;
}
if (brandId != 0) {
sql = sql + " and brand_id=" + brandId;
}
Query query = entityManager.createNativeQuery(sql);
query.setFirstResult(begin);
query.setMaxResults(pageSize);
List<Object[]> resultList = query.getResultList();
return resultList;
}
public List<Product> getProductsPage1(String name, Byte isShow, Integer brandId, Integer pageNumber, Integer pageSize){
int begin=(pageNumber-1)*pageSize;
String hql="from Product p where 1=1";
if(!name.equals("")){
hql=hql+" and p.name like '%"+name+"%'";
}
if (isShow != null) {
hql = hql + " and p.isShow=" + isShow;
}
if (brandId != 0) {
hql = hql + " and p.brand.id=" + brandId;
}
Query query = entityManager.createQuery(hql);
query.setFirstResult(begin);
query.setMaxResults(pageSize);
List<Product> resultList = query.getResultList(); //
entityManagerFactory的query方法,若果是hibernate的query就是query.list();
return resultList;
}
}
4.补充 pom。xml
<project
xmlns
="http://maven.apache.org/POM/4.0.0"
xmlns:
xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi :schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" >
<modelVersion>4.0.0 </modelVersion>
<groupId>com.dengry </groupId>
<artifactId>babasport </artifactId>
<packaging>war </packaging>
<version>1.0-SNAPSHOT </version>
<name>babasport Maven Webapp </name>
<url>http://maven.apache.org </url>
<dependencies>
<dependency>
<groupId>junit </groupId>
<artifactId>junit </artifactId>
<version>4.12 </version>
<scope>test </scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp </groupId>
<artifactId>jsp-api </artifactId>
<version>2.2 </version>
<scope>provided </scope>
</dependency>
<dependency>
<groupId>javax.servlet </groupId>
<artifactId>servlet-api </artifactId>
<version>2.5 </version>
<scope>provided </scope>
</dependency>
<dependency>
<groupId>javax.servlet </groupId>
<artifactId>jstl </artifactId>
<version>1.2 </version>
</dependency>
<dependency>
<groupId>org.springframework </groupId>
<artifactId>spring-webmvc </artifactId>
<version>4.2.6.RELEASE </version>
</dependency>
<dependency>
<groupId>org.hibernate </groupId>
<artifactId>hibernate-entitymanager </artifactId>
<version>4.3.11.Final </version>
</dependency>
<dependency>
<groupId>mysql </groupId>
<artifactId>mysql-connector-java </artifactId>
<version>5.1.38 </version>
</dependency>
<dependency>
<groupId>com.alibaba </groupId>
<artifactId>druid </artifactId>
<version>1.0.23 </version>
</dependency>
<dependency>
<groupId>org.springframework </groupId>
<artifactId>spring-orm </artifactId>
<version>4.2.6.RELEASE </version>
</dependency>
<dependency>
<groupId>org.springframework </groupId>
<artifactId>spring-test </artifactId>
<version>4.2.6.RELEASE </version>
</dependency>
<dependency>
<groupId>org.springframework </groupId>
<artifactId>spring-tx </artifactId>
<version>4.2.6.RELEASE </version>
</dependency>
<dependency>
<groupId>org.aspectj </groupId>
<artifactId>aspectjweaver </artifactId>
<version>1.8.9 </version>
</dependency>
<dependency>
<groupId>org.springframework.data </groupId>
<artifactId>spring-data-jpa </artifactId>
<version>1.10.2.RELEASE </version>
</dependency>
</dependencies>
<build>
<finalName>babasport </finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin </artifactId>
<configuration>
<source>1.7 </source>
<target>1.7 </target>
</configuration>
</plugin>
</plugins>
</build>
</project>
xsi :schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" >
<modelVersion>4.0.0 </modelVersion>
<groupId>com.dengry </groupId>
<artifactId>babasport </artifactId>
<packaging>war </packaging>
<version>1.0-SNAPSHOT </version>
<name>babasport Maven Webapp </name>
<url>http://maven.apache.org </url>
<dependencies>
<dependency>
<groupId>junit </groupId>
<artifactId>junit </artifactId>
<version>4.12 </version>
<scope>test </scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp </groupId>
<artifactId>jsp-api </artifactId>
<version>2.2 </version>
<scope>provided </scope>
</dependency>
<dependency>
<groupId>javax.servlet </groupId>
<artifactId>servlet-api </artifactId>
<version>2.5 </version>
<scope>provided </scope>
</dependency>
<dependency>
<groupId>javax.servlet </groupId>
<artifactId>jstl </artifactId>
<version>1.2 </version>
</dependency>
<dependency>
<groupId>org.springframework </groupId>
<artifactId>spring-webmvc </artifactId>
<version>4.2.6.RELEASE </version>
</dependency>
<dependency>
<groupId>org.hibernate </groupId>
<artifactId>hibernate-entitymanager </artifactId>
<version>4.3.11.Final </version>
</dependency>
<dependency>
<groupId>mysql </groupId>
<artifactId>mysql-connector-java </artifactId>
<version>5.1.38 </version>
</dependency>
<dependency>
<groupId>com.alibaba </groupId>
<artifactId>druid </artifactId>
<version>1.0.23 </version>
</dependency>
<dependency>
<groupId>org.springframework </groupId>
<artifactId>spring-orm </artifactId>
<version>4.2.6.RELEASE </version>
</dependency>
<dependency>
<groupId>org.springframework </groupId>
<artifactId>spring-test </artifactId>
<version>4.2.6.RELEASE </version>
</dependency>
<dependency>
<groupId>org.springframework </groupId>
<artifactId>spring-tx </artifactId>
<version>4.2.6.RELEASE </version>
</dependency>
<dependency>
<groupId>org.aspectj </groupId>
<artifactId>aspectjweaver </artifactId>
<version>1.8.9 </version>
</dependency>
<dependency>
<groupId>org.springframework.data </groupId>
<artifactId>spring-data-jpa </artifactId>
<version>1.10.2.RELEASE </version>
</dependency>
</dependencies>
<build>
<finalName>babasport </finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin </artifactId>
<configuration>
<source>1.7 </source>
<target>1.7 </target>
</configuration>
</plugin>
</plugins>
</build>
</project>