1. 程式人生 > >spring、MVC整合spring-data-jpa

spring、MVC整合spring-data-jpa

jar檔案

<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-jpa</artifactId>
			<version>1.10.6.RELEASE</version>
		</dependency>

spring整合JPA

<?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:tx="http://www.springframework.org/schema/tx"

       xmlns:context="http://www.springframework.org/schema/context"
       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/tx http://www.springframework.org/schema/tx/spring-tx.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

    <!--指定連線池配置-->
    <!-- dao層 資料庫連線部分-->
    <!-- 配置載入JDBC配置檔案 -->
    <context:property-placeholder location="classpath:/META-INF/jdbc.properties"/>

    <!-- 配置service包掃描 -->
    <context:component-scan base-package="com.jit.app.service"/>

    <!-- 配置資料庫連線池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClass" value="${basics.connection.driver_class}" />
		<property name="jdbcUrl" value="${basics.connection.url}" />
		<property name="user" value="${basics.connection.username}" />
		<property name="password" value="${basics.connection.password}" />
		<property name="maxPoolSize" value="${basics.connection.maxPoolSize}" />
		<property name="minPoolSize" value="${basics.connection.minPoolSize}" />
		<property name="initialPoolSize" value="${basics.connection.initialPoolSize}" />
		<property name="maxIdleTime" value="${basics.connection.maxIdleTime}" />
		<property name="checkoutTimeout" value="${basics.connection.checkoutTimeout}" />
		<property name="acquireIncrement" value="${basics.connection.acquireIncrement}" />
		<property name="acquireRetryAttempts" value="${basics.connection.acquireRetryAttempts}" />
		<property name="acquireRetryDelay" value="${basics.connection.acquireRetryDelay}" />
		<property name="autoCommitOnClose" value="${basics.connection.autoCommitOnClose}" />
		<!-- <property name="automaticTestTable" value="${basics.connection.automaticTestTable}"/> -->
		<property name="breakAfterAcquireFailure"
			value="${basics.connection.breakAfterAcquireFailure}" />
		<property name="idleConnectionTestPeriod"
			value="${basics.connection.idleConnectionTestPeriod}" />
		<property name="maxStatements" value="${basics.connection.maxStatements}" />
		<property name="maxStatementsPerConnection"
			value="${basics.connection.maxStatementsPerConnection}" />
    </bean>
    <!-- spring整合JPA -->
    <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!--JPA掃描的實體類所在的包-->
        <property name="packagesToScan" value="com.jit.app.pojo" />
        <property name="jpaDialect">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
        </property>
        <!-- 持久層提供者交給Hibernate -->
        <property name="persistenceProvider">
            <bean class="org.hibernate.ejb.HibernatePersistence" />
        </property>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <!--  sql控制檯列印
                <property name="generateDdl" value="true" />
                <property name="database" value="MYSQL" />
                <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" />
                <property name="showSql" value="true" />-->
            </bean>
        </property>
    </bean>

    <!-- 配置事務管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <!-- 開啟事務註解模式 -->
    <tx:annotation-driven transaction-manager="transactionManager" />
    <!--指定Spring Data JPA要進行掃描的包,該包中的類框架會自動為其建立代理-->
    <jpa:repositories base-package="com.jit.app.dao" />

</beans>

update、delete語句

1、方法頭需要加上兩個註解
    @Transactional
    @Modifying(clearAutomatically = true)

封裝原生sql介面

package com.jit.app.basic.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2017/1/8.
 */
@NoRepositoryBean
public interface BaseRepository<T,ID extends Serializable> extends JpaRepository<T,ID>,JpaSpecificationExecutor<T> {


    /** 
     * @param sql  原生sql語句
     * @param param 動態執行引數 type:List
     * @return 返回執行的結果集條數
     */
    public int executeUpdateBySQL(String sql,List<Object> param);
    /**
     * @param sql  原生sql語句
     * @param param 動態執行引數 type:Map
     * @return 返回執行的結果集條數
     */
    public int executeUpdateBySQL(String sql,Map<String,Object> param);
    /**
     * @param hql  hql語句
     * @param param 動態執行引數 type:List
     * @return 返回執行的結果集條數
     */
    public int executeUpdateByHql(String hql,List<Object> param);
    /**
     * @param hql  hql語句
     * @param param 動態執行引數 type:Map
     * @return 返回執行的結果集條數
     */
    public int executeUpdateByHql(String hql,Map<String,Object> param);

    /**
     * @param hql hql語句
     * @param param 動態查詢引數 type:List
     * @param t 單例項型別
     * @return 單例項結果集
     */
    public List<T> findByHql(String hql,List<Object> param,Class<T> t);

    /**
     * @param hql  hql語句
     * @param param 動態查詢引數 type:List
     * @param t  單例項型別
     * @param pageNo   頁碼數
     * @param pageSize  每頁條數
     * @return 單例項結果集
     */
    public List<T> findByHqlWithPage(String hql,List<Object> param,Class<T> t,int pageNo,int pageSize);

    /**
     * @param hql  hql 語句
     * @param param  動態查詢引數 type:List
     * @return 自定義欄位返回結果集
     */
    public List<Object[]> findByHql(String hql,List<Object> param);

    /**
     * @param hql hql語句
     * @param param  動態查詢引數 type:List
     * @param pageNo  頁碼數
     * @param pageSize 每頁條數
     * @return 自定義欄位返回結果集
     */
    public List<Object[]> findByHqlWithPage(String hql,List<Object> param,int pageNo,int pageSize);

    /**
     * @param sql  原生sql語句
     * @param param  動態查詢引數 type:List
     * @return  執行原生sql返回結果集
     */
    public List<Object[]> findBySQL(String sql,List<Object> param);

    /**
     * @param sql 原生sql語句
     * @param param 動態查詢引數 type:List
     * @param pageNo 頁碼數
     * @param pageSize 每頁條數
     * @return
     */
    public List<Object[]> findBySQLWithPage(String sql,List<Object> param ,int pageNo,int pageSize);
}

實現類

package  com.jit.ota4.basic.repository;

import org.springframework.data.jpa.repository.support.SimpleJpaRepository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2017/1/8.
 */
public class BaseRepositoryImpl<T,ID extends Serializable> extends SimpleJpaRepository<T,ID> implements BaseRepository<T,ID>{
    @PersistenceContext
    private final EntityManager em;

    public BaseRepositoryImpl(Class<T> domainClass, EntityManager em) {
        super(domainClass, em);
        this.em = em;
    }

    @Override
    public int executeUpdateBySQL(String sql, List<Object> param) {
        Query query = em.createNativeQuery(sql);
        if(param != null && !param.isEmpty()){
            for(int i = 0 ;i<param.size();i++){
                query.setParameter(i+1,param.get(i));
            }
            return query.executeUpdate();
        }
        return 0;
    }

    @Override
    public int executeUpdateBySQL(String sql, Map<String, Object> param) {
        Query query = em.createNativeQuery(sql);
        if(param != null && !param.isEmpty()){
            for(String name:param.keySet()){
                query.setParameter(name,param.get(name));
            }
            return query.executeUpdate();
        }
        return 0;
    }

    @Override
    public int executeUpdateByHql(String hql, List<Object> param) {
        Query query = em.createQuery(hql);
        if(param != null && !param.isEmpty()){
            for(int i = 0 ;i<param.size();i++){
                query.setParameter(i+1,param.get(i));
            }
            return query.executeUpdate();
        }
        return 0;
    }

    @Override
    public int executeUpdateByHql(String hql, Map<String, Object> param) {
        Query query = em.createQuery(hql);
        if(param != null && !param.isEmpty()){
            for(String name:param.keySet()){
                query.setParameter(name,param.get(name));
            }
            return query.executeUpdate();
        }
        return 0;
    }

    @Override
    public List<T> findByHql(String hql, List<Object> param,Class<T> t) {
       Query query = em.createQuery(hql,t);
       if(param != null && !param.isEmpty()){
           for(int i = 0 ;i<param.size();i++){
               query.setParameter(i+1,param.get(i));
           }
           return query.getResultList();
       }
       return null;
    }

    @Override
    public List<T> findByHqlWithPage(String hql, List<Object> param,Class<T> t,int pageNo, int pageSize) {
        Query query = em.createQuery(hql,t);
        if(param != null && !param.isEmpty()){
            for(int i = 0 ;i<param.size();i++){
                query.setParameter(i+1,param.get(i));
                query.setFirstResult((pageNo-1) * pageSize);
                query.setMaxResults(pageSize);
            }
            return query.getResultList();
        }
        return null;
    }

    @Override
    public List<Object[]> findByHql(String hql, List<Object> param) {
        Query query = em.createQuery(hql);
        if(param != null && !param.isEmpty()){
            for(int i = 0 ;i<param.size();i++){
                query.setParameter(i+1,param.get(i));
            }
            return query.getResultList();
        }
        return null;
    }

    @Override
    public List<Object[]> findByHqlWithPage(String hql, List<Object> param, int pageNo, int pageSize) {
        Query query = em.createQuery(hql);
        if(param != null && !param.isEmpty()){
            for(int i = 0 ;i<param.size();i++){
                query.setParameter(i+1,param.get(i));
                query.setFirstResult((pageNo-1) * pageSize);
                query.setMaxResults(pageSize);
            }
            return query.getResultList();
        }
        return null;
    }

    @Override
    public List<Object[]> findBySQL(String sql, List<Object> param) {
       Query query = em.createNativeQuery(sql);
       if(param != null && !param.isEmpty()){
            for(int i = 0 ;i<param.size();i++){
                query.setParameter(i+1,param.get(i));
            }
            return query.getResultList();
       }
       return null;
    }

    @Override
    public List<Object[]> findBySQLWithPage(String sql, List<Object> param, int pageNo, int pageSize) {
        Query query = em.createNativeQuery(sql);
        if(param != null && !param.isEmpty()){
            for(int i = 0 ;i<param.size();i++){
                query.setParameter(i+1,param.get(i));
                query.setFirstResult((pageNo-1) * pageSize);
                query.setMaxResults(pageSize);
            }
            return query.getResultList();
        }
        return null;
    }
}