dao泛型及优化

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值