spring+hibernate單元測試案例


1,maven創建web工程

2,導入相關依賴 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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.test</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <url>http://maven.apache.org</url>
    <properties>
        <spring.version>4.3.3.RELEASE</spring.version>
        <mysql.connector.version>5.1.40</mysql.connector.version>
        <hibernate.version>4.3.11.Final</hibernate.version>    
    </properties>
    <dependencies>
        <!-- servlet jar -->
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2.1-b03</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.connector.version}</version>
        </dependency>
        <!-- 連接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.9</version>
        </dependency>

        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.7.1</version>
        </dependency>
        
        <!-- hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.common</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>4.0.5.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-ehcache</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
        </dependency>
    </dependencies>
</project>

 

3,配置相關文件

(1) db.properties

db.user=root
db.url=jdbc\:mysql\://localhost\:3306/test?useUnicode\=true&characterEncoding\=utf-8
db.password=123456
db.driver=com.mysql.jdbc.Driver
db.initialPoolSize=2
db.minPoolSize=2
db.maxpoolSize=5
db.checkoutTimeout=50000
db.timeBetweenEvictionRunsMillis=60000
db.minEvictableTimeMillis=300000

(2)applicationContext.xml

<?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:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
          http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 配置掃描的包,完成Bean創建和自動依賴注入的功能 -->
    <context:component-scan base-package="com.test.*" />

    <!-- 引入配置文件 -->
    <context:property-placeholder location="classpath*:*.properties" />
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        init-method="init" destroy-method="close">
        <!-- 連接數據庫基本參數 -->
        <property name="url" value="${db.url}"></property>
        <property name="username" value="${db.user}"></property>
        <property name="password" value="${db.password}"></property>
        <!-- druid連接池加密 -->
        <!-- <property name="filters" value="config"></property> <property name="connectionProperties" 
            value="config.decrypt=true"></property> -->
        <property name="driverClassName" value="${db.driver}"></property>
        <!-- 初始化大小,最小,最大連接數 -->
        <property name="initialSize" value="${db.initialPoolSize}"></property>
        <property name="minIdle" value="${db.minPoolSize}"></property>
        <property name="maxActive" value="${db.maxpoolSize}"></property>

        <!-- 獲取連接等待超時的時間 -->
        <property name="maxWait" value="${db.checkoutTimeout}"></property>
        <!-- 間隔檢測時長,檢測需要關閉的空閑連接,單位毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}"></property>
        <!-- 一個連接在池中最小生存的時間,單位毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="${db.minEvictableTimeMillis}"></property>

        <!-- ?? -->
        <property name="validationQuery" value="SELECT 'x'" />
        <property name="testWhileIdle" value="true" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />


        <!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
        <property name="poolPreparedStatements" value="false"></property>
        <property name="maxPoolPreparedStatementPerConnectionSize"
            value="20"></property>
        <!-- 配置監控統計攔截的filters,去掉后監控界面sql無法統計 -->
        <!-- <property name="filters" value="stat"/> -->
    </bean>

    <!-- hibernate+spring整合 -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <!-- hibernate相關屬性配置 -->
        <property name="hibernateProperties">
            <value>
                <!-- 設置方言 -->
                hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
                <!-- 設置自動創建|更新|驗證數據庫表結構 -->
                hibernate.hbm2ddl.auto=update
                <!-- 是的在控制台顯示sql -->
                hibernate.show_sql=true
                <!-- 是否格式化sql,優化顯示 -->
                hibernate.format_sql=true
                <!-- 是否開啟二級緩存 -->
                hibernate.cache.use_second_level_cache=false
                <!-- 是否開啟查詢緩存 -->
                hibernate.cache.use_query_cache=false
                <!-- 數據庫批量查詢最大數 -->
                hibernate.jdbc.fetch_size=50
                <!-- 數據庫批量更新、添加、刪除操作最大數 -->
                hibernate.jdbc.batch_size=50
                <!-- 是否自動提交事務 -->
                <!--  hibernate.connection.autocommit=false  -->
                <!-- 指定hibernate在何時釋放JDBC連接 -->
                <!-- hibernate.connection.release_mode=auto -->
                <!-- 創建session方式hibrenate4的方式 -->
                hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
            </value>
        </property>
        <!-- xml實體映射使用 -->
        <property name="mappingLocations">
            <value>classpath*:/com/test/entity/*.hbm.xml</value>
        </property>
    </bean>
    <!-- 啟動對事務注解的支持 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

    <!-- 定義事務管理器 -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!-- 事務的執行方式 -->
        <tx:attributes>
            <tx:method name="create*" propagation="REQUIRED"/>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="remove*" propagation="REQUIRED"/>
            <tx:method name="del*" propagation="REQUIRED"/>
            <tx:method name="next*" propagation="REQUIRED"/>
            <tx:method name="import*" propagation="REQUIRED"/>
            <tx:method name="insert*" read-only="false" propagation="REQUIRED"/>
            <!-- read-only="true"表示只讀 -->
            <tx:method name="get*" propagation="NOT_SUPPORTED"/>
            <tx:method name="find*" propagation="NOT_SUPPORTED"/>
        </tx:attributes>
    </tx:advice>
        
        <!-- 定義切面,在 .service 中執行有關的hibernate session的事務操作 -->
    <aop:config>
        <aop:pointcut id="serviceOperation"
            expression="execution(* com.test.service.*.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />
    </aop:config>
        
        
    <!-- 會自動注冊validator ConversionService -->
    <mvc:annotation-driven validator="validator" conversion-service="conversion-service" />

    <!-- 注冊HandlerMapper、HandlerAdapter兩個映射類 激活@Controller模式 -->
    <mvc:annotation-driven />
    <!-- 定義 Autowired 自動注入 bean -->
    <bean
        class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

    
    <!-- 訪問靜態資源 -->
    <mvc:default-servlet-handler />

    <!-- spring-context.jar 以下validator ConversionService在使用mvc:annotation-driven會自動注冊 -->
    <bean id="validator"
        class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <!-- 如果不加默認到classpath下的ValidationMessages.properties -->
        <property name="validationMessageSource" ref="messageSource"></property>
    </bean>
    <bean id="conversion-service"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="defaultEncoding" value="UTF-8" />
        <property name="basenames">
            <list>
                <value>classpath:ValidationMessages</value>
            </list>
        </property>

    </bean>

    <!-- 視圖解析器 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

 

(3)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    
    <!-- 配置spring的加載文件路徑及文件名稱 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:applicationContext.xml</param-value>
    </context-param>
    
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

4,寫dao層和實現類

import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.orm.hibernate4.HibernateCallback;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
/***
 * hibernate基礎實現類
 * @author 
 *
 * @param <T>
 */


@Repository
public class BaseDao<T> extends HibernateDaoSupport {
    
    @Autowired()
    @Qualifier("sessionFactory")
    public void setBaseSessionFactory(SessionFactory sessionFactory) {
        super.setSessionFactory(sessionFactory);
    }
    
  protected    List<T> getList(final String entityName, final int beginIndex,final int length){
        
      return this.getHibernateTemplate().execute(new HibernateCallback<List<T>>() {

            @Override
            public List<T> doInHibernate(Session session) throws HibernateException {
            final    String hql=" from "+entityName;
                Query query=session.createQuery(hql);
                query.setFirstResult(beginIndex);
                query.setMaxResults(length);                
                @SuppressWarnings("unchecked")
                List<T> list=query.list();
                return list;
            }
            
        });
    }
    
    
}
import java.util.List;
import org.springframework.stereotype.Repository;
import com.test.entity.Goods;
@Repository
public interface GoodsDao {
    public  List<Goods> getList();
}
import java.util.List;
import org.springframework.stereotype.Repository;
import com.test.dao.GoodsDao;
import com.test.entity.Goods;
@Repository
public class GoodsDaoImpl extends BaseDao<Goods> implements GoodsDao {
    @Override
    public List<Goods> getList() {        
        return this.getList("Goods", 0, 1);
    }

}

5,service和實現類

import java.util.List;
import org.springframework.stereotype.Service;
import com.test.entity.Goods;
@Service
public interface GoodsService {
    public List<Goods> getList();
}
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.test.dao.GoodsDao;
import com.test.entity.Goods;
import com.test.service.GoodsService;
@Service
public class GoodsServiceImpl implements GoodsService {
    
    @Autowired
    private GoodsDao goodsDao;
    @Override
    public List<Goods> getList() {
        // TODO Auto-generated method stub
        return goodsDao.getList();
    }

}

6,測試

import java.util.List;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import com.test.entity.Goods;
import com.test.service.GoodsService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:applicationContext.xml" })
@Transactional
public class GoodsTest {
    @Autowired
    private GoodsService goodsService;
    
    @org.junit.Test
    public void getList() {
        List<Goods> goods=goodsService.getList();
        for(Goods g:goods) {
            System.out.println(g.getName());
        }
        
    }

}

 注:在單元測試插入數據時,默認會將事務回滾,如果想阻止spring transactional回滾,在test方法上加注解@Rollback(false)即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM