dao泛型及优化

来源:互联网 发布:阿里云的视频点播服务 编辑:程序博客网 时间:2024/06/12 09:32
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>
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>