Maven配置SpringMVC4+Spring4+Hibernate4环境
一、添加依赖
1、新建maven的web项目后,在pom.xml添加依赖信息,对应的groupId 、artifactId修改成自己新建的
<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>web-ssh</groupId> <artifactId>moyapp</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>moyapp Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <springVersion>4.3.0.RELEASE</springVersion> <jacksonVersion>2.9.3</jacksonVersion> <hibernateVersion>4.3.5.Final</hibernateVersion> <c3p0Version>0.9.5.2</c3p0Version> <mysqlVersion>5.1.38</mysqlVersion> <slf4jVersion>1.7.21</slf4jVersion> <log4jVersion>1.2.17</log4jVersion> <jstlVersion>1.2</jstlVersion> <servletApiVersion>3.1.0</servletApiVersion> <junitVersion>4.12</junitVersion> </properties> <dependencies> <!--junit 测试开始--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junitVersion}</version> <scope>test</scope> </dependency> <!--junit 测试结束--> <!--Slf4j + Log4j日志依赖 开始--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4jVersion}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4jVersion}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4jVersion}</version> </dependency> <!--Slf4j + Log4j日志依赖 结束--> <!--JavaEE web容器提供 开始--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servletApiVersion}</version> <scope>provided</scope> </dependency> <!--JavaEE web容器提供 开始--> <!--Jsp 常用标签库依赖 开始--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstlVersion}</version> <scope>runtime</scope> </dependency> <!--Jsp 常用标签库依赖 结束--> <!-- SpringMVC模块依赖 开始--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${springVersion}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jacksonVersion}</version> </dependency> <!-- SpringMVC模块依赖 结束--> <!-- Hibernate模块依赖 开始--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernateVersion}</version> </dependency> <!-- Hibernate模块依赖 结束--> <!--C3p0 数据库连接池依赖 开始--> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>${c3p0Version}</version> </dependency> <!--C3p0 数据库连接池依赖 结束--> <!--Jdbc 驱动依赖 开始 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysqlVersion}</version> </dependency> <!--Jdbc 驱动依赖 结束 --> <!--Spring常用模块依赖 开始--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${springVersion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${springVersion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${springVersion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${springVersion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${springVersion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${springVersion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${springVersion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${springVersion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${springVersion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${springVersion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${springVersion}</version> </dependency> <!--Spring常用模块依赖结束--> </dependencies> <build> <finalName>moyapp</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8080</port> <charset>${project.build.sourceEncoding}</charset> <server>tomcat7</server> </configuration> </plugin> </plugins> </build> </project>
2、个人使用的数据库是mysql,需要新建数据库moyapp
3、个人的项目信息结构
二、添加配置信息
1、在修改web.xml信息
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!-- *** 初始化Spring容器开始 *** --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </context-param> <!-- === 初始化Spring容器结束 === --> <!-- *** 初始化SpringMVC开始 *** --> <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- === 初始化SpringMVC结束 === --> </web-app>
2、在classpath下添加spring.xml文件,base-package属性值可以改成自己对应的项目基础包名
<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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"> <!-- *** 导入外部配置文件开始 *** --> <context:property-placeholder location="classpath:db.properties"/> <!-- === 导入外部配置文件结束 === --> <context:component-scan base-package="com.moy"/> <import resource="spring-mvc.xml"/> <import resource="spring-dao.xml"/> <import resource="spring-tx.xml"/> <import resource="spring-task.xml"/> </beans>
3、在classpath下添加spring-dao.xml,添加数据源配置,packagesToScan列出来的实体类包名可以换成自己的
<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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"> <!-- *** dataSource start *** --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- === dataSource end === --> <!-- *** sessionFactory start *** --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="packagesToScan"> <list> <value>com.moy.*.*.entity</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> </props> </property> </bean> <!-- === sessionFactory end === --> </beans>
4、(可选)在classpath下添加spring-task.xml,添加定时任务信息,spring3之后,可以更简单配置定时任务
<?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:p="http://www.springframework.org/schema/p" 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:task="http://www.springframework.org/schema/task" 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/task http://www.springframework.org/schema/task/spring-task.xsd"> <task:annotation-driven/> <task:scheduled-tasks> <task:scheduled ref="testTaskService" method="printCurrentTime" cron="* * * * * ?"/> </task:scheduled-tasks> </beans>
5、在classpath下添加spring-tx.xml,添加事务配置信息,defaultPointcut的包名可以换成自己的
<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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"> <!-- *** transactionManager start *** --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- === transactionManager end === --> <!-- *** 配置事务增强处理Bean,指定事务管理器 start *** --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" read-only="true" propagation="REQUIRED"/> <tx:method name="load*" read-only="true" propagation="REQUIRED"/> <tx:method name="find*" read-only="true" propagation="REQUIRED"/> <tx:method name="list*" read-only="true" propagation="REQUIRED"/> <tx:method name="count*" read-only="true" propagation="REQUIRED"/> <tx:method name="query*" read-only="true" propagation="REQUIRED"/> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="execute*" propagation="REQUIRED"/> <tx:method name="copy*" propagation="REQUIRED"/> <tx:method name="insert*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!-- === 配置事务增强处理Bean,指定事务管理器 end === --> <!-- *** 配置一个切入点 start *** --> <aop:config> <aop:pointcut id="defaultPointcut" expression=" execution(* com.moy.*.*.dao.*Dao.*(..)) || execution(* com.moy.*.*.dao.*Support.*(..)) || execution(* com.moy.*.*.dao.*Service.*(..)) || execution(* com.moy.*.*.dao.*Impl.*(..)) || execution(* com.moy.*.*.dao.impl.*impl.*(..)) || execution(* com.moy.*.*.support.*Support.*(..)) || execution(* com.moy.*.*.support.*Impl.*(..)) || execution(* com.moy.*.*.support.impl.*Impl.*(..)) || execution(* com.moy.*.*.service.*Service.*(..)) || execution(* com.moy.*.*.service.*Impl.*(..)) || execution(* com.moy.*.*.service.impl.*Impl.*(..)) "/> <aop:advisor advice-ref="txAdvice" pointcut-ref="defaultPointcut"/> </aop:config> <!-- === 配置一个切入点 end === --> <!-- *** 开启事务控制的注解支持(不建议使用) start *** --> <tx:annotation-driven transaction-manager="transactionManager"/> <!-- === 开启事务控制的注解支持 end === --> </beans>
6、在classpath下添加spring-mvc.xml,配置spring-mvc信息
<?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:p="http://www.springframework.org/schema/p" 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:mvc="http://www.springframework.org/schema/mvc" 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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <mvc:annotation-driven/> <mvc:default-servlet-handler/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!--只扫描@Controller注解类,否则影响事务--> <context:component-scan base-package="com.moy" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> </beans>
7、在classpath下添加db.properties ,配置数据库连接信息
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/moyapp?useSSL=false
jdbc.username=root
jdbc.password=123
8、(可选)在classpath下添加log4j.properties,配置日志信息
### 设置###
log4j.rootLogger=debug,stdout
### 输出信息到控制台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
三、添加应用代码
1、新建基础dao类,BaseProjectDao和实现类BaseProjectDao4Impl
package com.moy.moyapp.test.dao; import org.hibernate.SessionFactory; import java.io.Serializable; import java.util.List; import java.util.Map; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/2 <br/> * [Description]: hibernate公共dao操作 <br/> * * @author YeXiangYang */ public interface BaseProjectDao { /** * 获取SessionFactory * * @return SessionFactory */ SessionFactory getSessionFactory(); /** * 根据ID加载实体 * * @param entityClazz 实体class * @param id 唯一主键 * @return 实体 */ <T> T get(Class<T> entityClazz, Serializable id); /** * 保存实体 * * @param entity 保存的实体 * @return 实体 */ <T> Serializable save(T entity); /** * 更新实体 * * @param entity 实体 */ <T> void update(T entity); /** * 更新或保持实体 * * @param entity 实体 */ <T> void saveOrUpdate(T entity); /** * 删除实体 * * @param entity 实体 */ <T> void delete(T entity); /** * 根据ID删除实体 * * @param entityClazz 实体class * @param id 唯一主键 */ <T> int delete(Class<T> entityClazz, Serializable id); /** * 删除多个实体根据map * * @param entityClazz * @param fieldDeleteMap * @param <T> */ <T> int deleteByMap(Class<T> entityClazz, Map<String, Object> fieldDeleteMap); /** * 获取该实体所有列表 * * @param entityClazz 实体class * @return 实体列表 */ <T> List<T> listAll(Class<T> entityClazz); /** * 获取实体列表,根据类字段的map映射成hql的where过滤<br/> * <pre> * 例如:实体类 * class A{ * String bField;//字段 * } * Map<String, Object> fieldFilterMap = HashMap<>(2); * fieldFilterMap.put("bField" , "ABC"); * findAllByEntity(A.class, Map<String, Object> fieldFilterMap); * 则映射成hql为:select en from A en where en.bField='ABC'查询 * </pre> * * @param entityClazz 实体class * @param fieldFilterMap 根据实体类的字段对应的值进行过滤 * @return 实体列表 */ <T> List<T> listByMap(Class<T> entityClazz, Map<String, Object> fieldFilterMap); /** * 获取实体总数 * * @param entityClazz 实体class * @return 总数 */ <T> long countAll(Class<T> entityClazz); /** * 获取实体总数 * * @param entityClazz * @param fieldFilterMap * @param <T> * @return */ <T> long countByMap(Class<T> entityClazz, Map<String, Object> fieldFilterMap); /** * 根据HQL语句查询实体 * * @param hql hql语句 * @return 实体列表 */ List<Object> queryByHql(String hql); /** * 根据带占位符参数HQL语句查询实体 * * @param hql hql语句,?0的方式设置占位符号 * 例如:from Entity where id = ?0 and name = ?1 * @param params 参数 * @return 数据列表 */ List<Object> queryByHql(String hql, Object... params); /** * 根据带占位符参数HQL语句查询实体 * * @param hql * @param map * @return */ List<Object> queryByHql(String hql, Map<String, Object> map); /** * 使用hql 语句进行分页查询操作 * * @param hql 需要查询的hql语句 * @param pageNo 查询第pageNo页的记录 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 */ List<Object> queryByHql(String hql, int pageNo, int pageSize); /** * 使用hql 语句进行分页查询操作 * * @param hql 需要查询的hql语句,?0的方式设置占位符号 * @param params 如果hql带占位符参数,params用于传入占位符参数 * 例如:From Entity where id = ?0 * @param pageNo 查询第pageNo页的记录 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 */ List<Object> queryByHql(String hql, int pageNo, int pageSize, Object... params); List<Object> queryByHql(String hql, int pageNo, int pageSize, Map<String, Object> params); /** * 使用sql语句进行查询操作 * * @param sql 需要查询的sql语句 * @return 返回查询数据 */ List<Map<String, Object>> queryBySql(String sql); /** * 使用sql语句进行查询操作 * * @param sql 需要查询的sql语句,,?0的方式设置占位符号. * @param params 如果sql带占位符参数,params用于传入占位符参数 * 例如:select * from table where id = :index0 and name = :index1 * @return 返回查询数据 */ List<Map<String, Object>> queryBySql(String sql, Object... params); /** * 使用sql语句进行查询操作 * * @param sql 需要查询的sql语句 * @param params 如果sql带占位符参数,params用于传入map结构的占位符参数 * @return 返回查询数据 */ List<Map<String, Object>> queryBySql(String sql, Map<String, Object> params); /** * 使用sql语句进行查询操作 * * @param sql 需要查询的sql语句 * @param pageNo 查询第pageNo页的记录 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 */ List<Map<String, Object>> queryBySqlAndPage(String sql, int pageNo, int pageSize); /** * 使用sql语句进行查询操作 * * @param sql 需要查询的sql语句 * @param pageNo 查询第pageNo页的记录 * @param pageSize 每页需要显示的记录数 * @param params 如果sql带占位符参数,?0的方式设置占位符号 * @return 当前页的所有记录 */ List<Map<String, Object>> queryBySqlAndPage(String sql, int pageNo, int pageSize, Object... params); /** * 使用sql语句进行查询操作 * * @param sql 需要查询的sql语句 * @param pageNo 查询第pageNo页的记录 * @param pageSize 每页需要显示的记录数 * @param map 如果sql带占位符参数,params用于传入map结构的占位符参数 * @return 当前页的所有记录 */ List<Map<String, Object>> queryBySqlAndPage(String sql, int pageNo, int pageSize, Map<String, Object> map); /** * 使用sql语句进行查询操作,返回唯一结果 * * @param sql 需要查询的sql语句 * @return 返回唯一结果 */ Object queryUniqueResult(String sql); /** * 使用sql语句进行查询操作,返回唯一结果 * * @param sql 需要查询的sql语句 * @param params 如果sql带占位符参数,?0的方式设置占位符号 * @return 返回唯一结果 */ Object queryUniqueResult(String sql, Object... params); /** * 使用sql语句进行查询操作,返回唯一结果 * * @param sql 需要查询的sql语句 * @param map 如果sql带占位符参数,传入map作为参数 * @return 返回唯一结果 */ Object queryUniqueResult(String sql, Map<String, Object> map); /** * 执行hql语句,返回变化的数量 * * @param hql hql语句 * @return 变化的数量 */ int executeHql(String hql); /** * 执行hql语句,返回变化的数量 * * @param hql hql语句 * @param params hql占位符参数,,?0的方式设置占位符号 * @return 变化的数量 */ int executeHql(String hql, Object... params); /** * 执行hql语句,返回变化的数量 * * @param hql hql语句 * @param map hql占位符参数,根据map的key和value设置参数 * @return 变化的数量 */ int executeHql(String hql, Map<String, Object> map); /** * 执行sql语句,返回变化的数量 * * @param sql sql语句 * @return 变化的数量 */ int executeSql(String sql); /** * 执行sql语句,返回变化的数量 * * @param sql sql语句 * @param params hql占位符参数,,?0的方式设置占位符号 * @return 变化的数量 */ int executeSql(String sql, Object... params); /** * 执行sql语句,返回变化的数量 * * @param sql sql语句 * @param map hql占位符参数,根据map的key和value设置参数 * @return 变化的数量 */ int executeSql(String sql, Map<String, Object> map); }
package com.moy.moyapp.test.dao.impl; import com.moy.moyapp.test.dao.BaseProjectDao; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.transform.Transformers; import org.springframework.stereotype.Repository; import javax.annotation.Resource; import java.io.Serializable; import java.util.*; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/2 <br/> * [Description]: hibernate公共dao操作 <br/> * * @author YeXiangYang */ @Repository("baseProjectDao") public class BaseProjectDao4Impl implements BaseProjectDao { private static final Object[] EMPTY_OBJECT_ARRAY = {}; private static final Map<String, Object> EMPTY_MAP = Collections.EMPTY_MAP; @Resource private SessionFactory sessionFactory; @Override public SessionFactory getSessionFactory() { return sessionFactory; } private Session getSession() { return getSessionFactory().getCurrentSession(); } @SuppressWarnings("unchecked") @Override public <T> T get(Class<T> entityClazz, Serializable id) { return (T) getSession().get(entityClazz, id); } @Override public <T> Serializable save(T entity) { return getSession().save(entity); } @Override public <T> void update(T entity) { getSession().update(entity); } public <T> void saveOrUpdate(T entity) { getSession().saveOrUpdate(entity); } @Override public <T> void delete(T entity) { getSession().delete(entity); } @Override public <T> int delete(Class<T> entityClazz, Serializable id) { Map<String, Object> fieldFilterMap = new HashMap<>(2); fieldFilterMap.put("id", id); return deleteByMap(entityClazz, fieldFilterMap); } @Override public <T> int deleteByMap(Class<T> entityClazz, Map<String, Object> fieldDeleteMap) { StringBuilder sb = buildHql("DELETE ", entityClazz.getSimpleName(), " en WHERE 1 = 1 "); appendEqualsCondition(fieldDeleteMap, sb); Query query = getSession().createQuery(sb.toString()); setParamsByMap(fieldDeleteMap, query); return query.executeUpdate(); } /** * 追加equals条件 * * @param fieldFilterMap 类字段参数map * @param sb hql语句 */ private void appendEqualsCondition(Map<String, Object> fieldFilterMap, StringBuilder sb) { if (null != fieldFilterMap) { for (Map.Entry<String, Object> en : fieldFilterMap.entrySet()) { String key = en.getKey().trim(); sb.append(" and en.").append(key); sb.append(" = :").append(key); } } } @Override public <T> List<T> listAll(Class<T> entityClazz) { return listByMap(entityClazz, EMPTY_MAP); } @SuppressWarnings("unchecked") public <T> List<T> listByMap(Class<T> entityClazz, Map<String, Object> fieldFilterMap) { StringBuilder sb = buildHql("FROM ", entityClazz.getSimpleName(), " en WHERE 1 = 1 "); appendEqualsCondition(fieldFilterMap, sb); Query query = getSession().createQuery(sb.toString()); setParamsByMap(fieldFilterMap, query); return (List<T>) query.list(); } @Override public <T> long countAll(Class<T> entityClazz) { return countByMap(entityClazz, null); } @Override public <T> long countByMap(Class<T> entityClazz, Map<String, Object> fieldFilterMap) { StringBuilder sb = buildHql("SELECT COUNT(*) FROM ", entityClazz.getSimpleName(), " en WHERE 1 = 1 "); appendEqualsCondition(fieldFilterMap, sb); List<?> l = queryByHql(sb.toString(), fieldFilterMap); if (null != l && 1 == l.size()) { return (Long) l.get(0); } return 0; } @Override public List<Object> queryByHql(String hql) { return queryByHql(hql, EMPTY_OBJECT_ARRAY); } @SuppressWarnings("unchecked") @Override public List<Object> queryByHql(String hql, Object... params) { Query query = getSession().createQuery(hql); setParamsByArray(query, params); return query.list(); } @Override public List<Object> queryByHql(String hql, Map<String, Object> map) { Query query = getSession().createQuery(hql); setParamsByMap(map, query); return query.list(); } @Override public List<Object> queryByHql(String hql, int pageNo, int pageSize) { return queryByHql(hql, pageNo, pageSize, EMPTY_OBJECT_ARRAY); } @SuppressWarnings("unchecked") @Override public List<Object> queryByHql(String hql, int pageNo, int pageSize, Object... params) { Query query = getSession().createQuery(hql); setPageParam(pageNo, pageSize, query); setParamsByArray(query, params); return (List<Object>) query.list(); } @Override public List<Object> queryByHql(String hql, int pageNo, int pageSize, Map<String, Object> params) { Query query = getSession().createQuery(hql); setPageParam(pageNo, pageSize, query); setParamsByMap(params, query); return (List<Object>) query.list(); } @Override public List<Map<String, Object>> queryBySql(String sql) { return queryBySql(sql, EMPTY_OBJECT_ARRAY); } @SuppressWarnings("unchecked") @Override public List<Map<String, Object>> queryBySql(String sql, Object... params) { SQLQuery sqlQuery = getSession().createSQLQuery(sql); sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); setParamsByArray(sqlQuery, params); return (List<Map<String, Object>>) sqlQuery.list(); } public List<Map<String, Object>> queryBySql(String sql, Map<String, Object> map) { SQLQuery sqlQuery = getSession().createSQLQuery(sql); sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); setParamsByMap(map, sqlQuery); return (List<Map<String, Object>>) sqlQuery.list(); } @Override public List<Map<String, Object>> queryBySqlAndPage(String sql, int pageNo, int pageSize) { return queryBySqlAndPage(sql, pageNo, pageSize, EMPTY_OBJECT_ARRAY); } @SuppressWarnings("unchecked") @Override public List<Map<String, Object>> queryBySqlAndPage(String sql, int pageNo, int pageSize, Object... params) { SQLQuery sqlQuery = getSession().createSQLQuery(sql); sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); setPageParam(pageNo, pageSize, sqlQuery); setParamsByArray(sqlQuery, params); return (List<Map<String, Object>>) sqlQuery.list(); } public List<Map<String, Object>> queryBySqlAndPage(String sql, int pageNo, int pageSize, Map<String, Object> map) { SQLQuery sqlQuery = getSession().createSQLQuery(sql); sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); setPageParam(pageNo, pageSize, sqlQuery); setParamsByMap(map, sqlQuery); return (List<Map<String, Object>>) sqlQuery.list(); } @Override public Object queryUniqueResult(String sql) { return queryUniqueResult(sql, EMPTY_OBJECT_ARRAY); } @Override public Object queryUniqueResult(String sql, Object... params) { SQLQuery sqlQuery = getSession().createSQLQuery(sql); setParamsByArray(sqlQuery, params); return sqlQuery.uniqueResult(); } @Override public Object queryUniqueResult(String sql, Map<String, Object> map) { SQLQuery sqlQuery = getSession().createSQLQuery(sql); setParamsByMap(map, sqlQuery); return sqlQuery.uniqueResult(); } @Override public int executeHql(String hql) { return executeHql(hql, EMPTY_OBJECT_ARRAY); } @Override public int executeHql(String hql, Object... params) { Query query = getSession().createQuery(hql); setParamsByArray(query, params); return query.executeUpdate(); } @Override public int executeHql(String hql, Map<String, Object> map) { Query query = getSession().createQuery(hql); setParamsByMap(map, query); return query.executeUpdate(); } @Override public int executeSql(String sql) { return executeSql(sql, EMPTY_OBJECT_ARRAY); } @Override public int executeSql(String sql, Object... params) { Query query = getSession().createSQLQuery(sql); setParamsByArray(query, params); return query.executeUpdate(); } @Override public int executeSql(String sql, Map<String, Object> map) { Query query = getSession().createSQLQuery(sql); setParamsByMap(map, query); return query.executeUpdate(); } /** * 根据数组设置org.hibernate.Query查询参数,?0的方式设置占位符号 * * @param query org.hibernate.Query * @param array 数组 */ private void setParamsByArray(Query query, Object[] array) { if (null != array) { for (int i = 0, len = array.length; i < len; i++) { query.setParameter(String.valueOf(i), array[i]); } } } private StringBuilder buildHql(String keyword, String className, String where) { StringBuilder sb = new StringBuilder(keyword); sb.append(className).append(where); return sb; } /** * 设置分页参数 * * @param pageNo 第几页 * @param pageSize 每页多少数目 * @param query org.hibernate.Query */ private void setPageParam(int pageNo, int pageSize, Query query) { query.setFirstResult((pageNo - 1) * pageSize); query.setMaxResults(pageSize); } /** * 根据map的key和value设置org.hibernate.Query查询参数 * * @param map map * @param query org.hibernate.Query */ private void setParamsByMap(Map<String, Object> map, Query query) { if (null != query && null != map && map.size() > 0) { for (Map.Entry<String, Object> each : map.entrySet()) { String key = each.getKey(); Object value = each.getValue(); if (null == value) { query.setParameter(key, value); } else if (value.getClass().isArray()) { query.setParameterList(key, (Object[]) value); } else if (value instanceof Collection) { query.setParameterList(key, (Collection) value); } else { query.setParameter(key, value); } } } } }
2、新建实体类TestEntity
package com.moy.moyapp.test.entity; import javax.persistence.*; import java.io.Serializable; import java.util.Date; import java.util.UUID; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/2 <br/> * [Description]: <br/> * * @author YeXiangYang */ @Entity @Table(name = "t_test") public class TestEntity implements Serializable { private static final long serialVersionUID = 8530202658667667146L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "gtm_create") private Date gtmCreate; @Column(name = "gtm_modified") private Date gtmModified; @Column(name = "description") private String desc; public TestEntity() { } public static TestEntity createInstance() { TestEntity test = new TestEntity(); test.setGtmCreate(new Date()); test.setGtmModified(new Date()); test.setDesc("测试数据描述:[" + UUID.randomUUID() + "]"); return test; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Date getGtmCreate() { return gtmCreate; } public void setGtmCreate(Date gtmCreate) { this.gtmCreate = gtmCreate; } public Date getGtmModified() { return gtmModified; } public void setGtmModified(Date gtmModified) { this.gtmModified = gtmModified; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } @Override public String toString() { return "TestEntity{" + "id=" + id + ", gtmCreate=" + gtmCreate + ", gtmModified=" + gtmModified + ", desc='" + desc + '\'' + '}'; } }
3、新建基础服务类BaseProjectService和实现类BaseProjectServiceImpl
package com.moy.moyapp.test.service; import java.io.Serializable; import java.util.List; import java.util.Map; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/2 <br/> * [Description]: 简化操作,项目基础Service类 <br/> * * @author YeXiangYang */ public interface BaseProjectService<E> { /** * 保存 */ Serializable save(E entity); /** * 删除根据id */ int delete(Serializable id); /** * 删除根据map条件 */ int deleteByMap(Map<String, Object> fieldFilterMap); /** * 删除 */ void delete(E entity); /** * 删除根据实体类 */ void update(E entity); /** * 保存或者更新 */ void saveOrUpdate(E entity); /** * 查询根据id */ E get(Serializable id); /** * 查询所有 */ List<E> listAll(); /** * 查询根据map条件 */ List<E> listByMap(Map<String, Object> fieldFilterMap); /** * 查询个数 */ long countAll(); /** * 查询个数根据map条件 */ long countByMap(Map<String, Object> fieldFilterMap); }
package com.moy.moyapp.test.service.impl; import com.moy.moyapp.test.dao.BaseProjectDao; import com.moy.moyapp.test.service.BaseProjectService; import javax.annotation.Resource; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.util.List; import java.util.Map; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/2 <br/> * [Description]: 简化操作,项目基础Service类 <br/> * * @author YeXiangYang */ public abstract class BaseProjectServiceImpl<E> implements BaseProjectService<E> { @Resource protected BaseProjectDao baseProjectDao; protected final Class<E> clazz; { try { ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass(); clazz = (Class<E>) parameterizedType.getActualTypeArguments()[0]; } catch (Exception e) { throw new RuntimeException("未声明实体泛型,继承BaseService需要按照规范!!!"); } } @Override public Serializable save(E entity) { return baseProjectDao.save(entity); } @Override public int delete(Serializable id) { return baseProjectDao.delete(clazz, id); } @Override public int deleteByMap(Map<String, Object> fieldFilterMap) { return baseProjectDao.deleteByMap(clazz, fieldFilterMap); } @Override public void delete(E entity) { baseProjectDao.delete(entity); } @Override public void update(E entity) { baseProjectDao.update(entity); } @Override public void saveOrUpdate(E entity) { baseProjectDao.saveOrUpdate(entity); } @Override public E get(Serializable id) { return baseProjectDao.get(clazz, id); } @Override public List<E> listAll() { return baseProjectDao.listAll(clazz); } @Override public List<E> listByMap(Map<String, Object> fieldFilterMap) { return baseProjectDao.listByMap(clazz, fieldFilterMap); } @Override public long countAll() { return baseProjectDao.countAll(clazz); } @Override public long countByMap(Map<String, Object> fieldFilterMap) { return baseProjectDao.countByMap(clazz, fieldFilterMap); } }
4、新建操作实体TestEntity的服务类TestService,和实现类TestServiceImpl
package com.moy.moyapp.test.service; import com.moy.moyapp.test.entity.TestEntity; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/4 <br/> * [Description]: <br/> * * @author YeXiangYang */ public interface TestService extends BaseProjectService<TestEntity> { void saveTxTest(); }
package com.moy.moyapp.test.service.impl; import com.moy.moyapp.test.entity.TestEntity; import com.moy.moyapp.test.service.TestService; import org.springframework.stereotype.Service; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/4 <br/> * [Description]: <br/> * * @author YeXiangYang */ @Service public class TestServiceImpl extends BaseProjectServiceImpl<TestEntity> implements TestService { @Override public void saveTxTest() { TestEntity instance = TestEntity.createInstance(); instance.setDesc("在事务下,我保存不上"); save(instance); int i = 1 / 0; } }
5、(可选)新建定时任务测试类TestTaskServiceImpl
package com.moy.moyapp.test.task; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/3/6 <br/> * [Description]: <br/> * * @author YeXiangYang */ @Component("testTaskService") public class TestTaskServiceImpl { public void printCurrentTime() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date())); } }
6、新建TestController
package com.moy.moyapp.test.controller; import com.moy.moyapp.test.entity.TestEntity; import com.moy.moyapp.test.service.TestService; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.Serializable; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/4 <br/> * [Description]: <br/> * * @author YeXiangYang */ @Controller @RequestMapping("/test") public class TestController { @Resource TestService testService; @RequestMapping("/save") @ResponseBody public Serializable save(HttpServletRequest request, HttpServletResponse response) { TestEntity instance = TestEntity.createInstance(); return testService.save(instance); } @ResponseBody @RequestMapping("/saveTxTest") public String saveTxTest(HttpServletRequest request, HttpServletResponse response) { try { testService.saveTxTest(); } catch (Exception e) { return e.getMessage(); } return "success"; } }
7、在WEB-INF同级目录添加index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Test</title> </head> <% String contextPath = request.getContextPath(); %> <body> <a href="<%=contextPath%>/test/save.do">save</a><br/> <a href="<%=contextPath%>/test/saveTxTest.do">saveTxTest</a><br/> </body> </html>
四、测试
1、测试dao类BaseProjectDao4ImplTest
package com.moy.moyapp.test.dao.impl; import com.moy.moyapp.test.dao.BaseProjectDao; import com.moy.moyapp.test.entity.TestEntity; import org.hibernate.SessionFactory; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; import java.io.Serializable; import java.util.HashMap; import java.util.List; import java.util.Map; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/2/3 <br/> * [Description]: <br/> * * @author YeXiangYang */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/spring.xml") public class BaseProjectDao4ImplTest { @Resource BaseProjectDao baseProjectDao; Logger logger = LoggerFactory.getLogger(getClass()); long beforeTime; long afterTime; @Before public void before() { logger.info(this.toString()); beforeTime = System.currentTimeMillis(); logger.info("test method before : {}ms", beforeTime); } @After public void After() { afterTime = System.currentTimeMillis(); logger.info("test method After : {}ms", afterTime); logger.info("total time : {}ms", afterTime - beforeTime); } @Test public void getSessionFactory() { SessionFactory sessionFactory = baseProjectDao.getSessionFactory(); logger.info(sessionFactory.toString()); } @Test public void getTest() { TestEntity saveEntity = TestEntity.createInstance(); logger.info(saveEntity.toString()); Serializable save = baseProjectDao.save(saveEntity); logger.info(save.toString()); TestEntity testEntity = baseProjectDao.get(TestEntity.class, saveEntity.getId()); logger.info(testEntity.toString()); } @Test public void saveTest() { TestEntity test = TestEntity.createInstance(); baseProjectDao.save(test); } @Test public void updateTest() { TestEntity testEntity = TestEntity.createInstance(); logger.info(testEntity.toString()); logger.info(baseProjectDao.save(testEntity).toString()); testEntity.setGtmModified(null); testEntity.setDesc("修改后"); baseProjectDao.update(testEntity); } @Test public void saveOrUpdateTest() { TestEntity testEntity = TestEntity.createInstance(); baseProjectDao.saveOrUpdate(testEntity); testEntity.setDesc("保存或修改"); baseProjectDao.saveOrUpdate(testEntity); } @Test public void deleteTest() { TestEntity testEntity = TestEntity.createInstance(); Serializable id = baseProjectDao.save(testEntity); logger.info("" + baseProjectDao.delete(TestEntity.class, id)); baseProjectDao.save(testEntity); baseProjectDao.delete(testEntity); } @Test public void deleteByMapTest() { TestEntity testEntity = TestEntity.createInstance(); baseProjectDao.save(testEntity); HashMap param = new HashMap(); param.put("desc", testEntity.getDesc()); logger.info(String.valueOf(baseProjectDao.deleteByMap(TestEntity.class, param))); } @Test public void listAllTest() { List<TestEntity> list = baseProjectDao.listAll(TestEntity.class); printList(list); } @Test public void listByMapTest() { TestEntity testEntity = TestEntity.createInstance(); baseProjectDao.save(testEntity); Map param = new HashMap(); param.put("desc", testEntity.getDesc()); List<TestEntity> list = baseProjectDao.listByMap(TestEntity.class, param); printList(list); } private void printList(List list) { if (null != list) { for (Object each : list) { logger.info(each.toString()); } } } @Test public void countAllTest() { long count = baseProjectDao.countAll(TestEntity.class); logger.info(String.valueOf(count)); } @Test public void countByMapTest() { TestEntity testEntity = TestEntity.createInstance(); baseProjectDao.save(testEntity); Map param = new HashMap(); param.put("desc", testEntity.getDesc()); long count = baseProjectDao.countByMap(TestEntity.class, param); logger.info(String.valueOf(count)); } @Test public void queryByHqlTest() { String hql = "from TestEntity"; List<Object> list = baseProjectDao.queryByHql(hql); printList(list); TestEntity testEntity = TestEntity.createInstance(); Serializable id = baseProjectDao.save(testEntity); String hqlByListParam = hql + " where id = ?0"; Object[] objects = {id}; List<Object> hqlByListParamList = baseProjectDao.queryByHql(hqlByListParam, objects); printList(hqlByListParamList); List<Object> hqlByListParamListPage = baseProjectDao.queryByHql(hqlByListParam, 0, 5, objects); printList(hqlByListParamListPage); String hqlByListMap = hql + " where id = :id"; Map<String, Object> param = new HashMap<>(); param.put("id", id); List<Object> hqlByListMapList = baseProjectDao.queryByHql(hqlByListMap, param); printList(hqlByListMapList); List<Object> hqlByListMapListPage = baseProjectDao.queryByHql(hqlByListMap, 0, 5, param); printList(hqlByListMapListPage); } @Test public void queryBySqlTest() { String sql = "select * from t_test"; List<Map<String, Object>> list = baseProjectDao.queryBySql(sql); printList(list); TestEntity testEntity = TestEntity.createInstance(); Serializable id = baseProjectDao.save(testEntity); String sqlByListParam = sql + " where id = ?0"; Object[] objects = {id}; List<Map<String, Object>> sqlByListParamList = baseProjectDao.queryBySql(sqlByListParam, objects); printList(sqlByListParamList); List<Map<String, Object>> sqlByListParamListPage = baseProjectDao.queryBySqlAndPage(sqlByListParam, 0, 5, objects); printList(sqlByListParamListPage); String sqlByListMap = sql + " where id = :id"; Map<String, Object> param = new HashMap<>(); param.put("id", id); List<Map<String, Object>> sqlByListMapList = baseProjectDao.queryBySql(sqlByListMap, param); printList(sqlByListMapList); List<Map<String, Object>> sqlByListMapListPage = baseProjectDao.queryBySqlAndPage(sqlByListMap, 0, 5, param); printList(sqlByListMapListPage); } @Test public void queryUniqueResultTest() { String sql = "select count(*) from t_test"; TestEntity testEntity = TestEntity.createInstance(); Serializable id = baseProjectDao.save(testEntity); Object count = baseProjectDao.queryUniqueResult(sql); logger.info(String.valueOf(count)); String sqlByListParam = sql + " where id = ?0"; Object countByListParam = baseProjectDao.queryUniqueResult(sqlByListParam, new Object[]{id}); logger.info(String.valueOf(countByListParam)); String sqlByListMap = sql + " where id = :id"; Map<String, Object> param = new HashMap<>(); param.put("id", id); Object countByMapCount = baseProjectDao.queryUniqueResult(sqlByListMap, param); logger.info(String.valueOf(countByMapCount)); } @Test public void executeHqlTest() { String hql = "delete TestEntity "; TestEntity testEntity = TestEntity.createInstance(); baseProjectDao.save(testEntity); Object count = baseProjectDao.executeHql(hql); logger.info(String.valueOf(count)); Serializable id = baseProjectDao.save(testEntity); String hqlByListParam = hql + " where id = ?0"; int countByList = baseProjectDao.executeHql(hqlByListParam, new Object[]{id}); logger.info(String.valueOf(countByList)); id = baseProjectDao.save(testEntity); String hqlByMapParam = hql + " where id = :id"; Map<String, Object> param = new HashMap<>(); param.put("id", id); int countByMap = baseProjectDao.executeHql(hqlByMapParam, param); logger.info(String.valueOf(countByMap)); } @Test public void executeSqlTest() { String sql = "delete from t_test "; TestEntity testEntity = TestEntity.createInstance(); baseProjectDao.save(testEntity); Object count = baseProjectDao.executeSql(sql); logger.info(String.valueOf(count)); Serializable id = baseProjectDao.save(testEntity); String hqlByListParam = sql + " where id = ?0"; int countByList = baseProjectDao.executeSql(hqlByListParam, new Object[]{id}); logger.info(String.valueOf(countByList)); id = baseProjectDao.save(testEntity); String hqlByMapParam = sql + " where id = :id"; Map<String, Object> param = new HashMap<>(); param.put("id", id); int countByMap = baseProjectDao.executeSql(hqlByMapParam, param); logger.info(String.valueOf(countByMap)); } }
2、测试service类TestServiceImplTest
package com.moy.moyapp.test.service.impl; import com.moy.moyapp.test.entity.TestEntity; import com.moy.moyapp.test.service.TestService; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; import java.io.Serializable; import java.util.HashMap; import java.util.List; import java.util.Map; /** * [Project]:moy-gradle-project <br/> * [Email]:moy25@foxmail.com <br/> * [Date]:2018/3/6 <br/> * [Description]: <br/> * * @author YeXiangYang */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/spring.xml") public class TestServiceImplTest { @Resource TestService testService; Logger logger = LoggerFactory.getLogger(getClass()); long beforeTime; long afterTime; @Before public void before() { logger.info(this.toString()); beforeTime = System.currentTimeMillis(); logger.info("test method before : {}ms", beforeTime); } @After public void After() { afterTime = System.currentTimeMillis(); logger.info("test method After : {}ms", afterTime); logger.info("total time : {}ms", afterTime - beforeTime); } @Test public void saveTest() { TestEntity entity = TestEntity.createInstance(); logger.info(testService.save(entity).toString()); } @Test public void deleteTest() { TestEntity entity = TestEntity.createInstance(); Serializable id = testService.save(entity); logger.info(String.valueOf(testService.delete(id))); logger.info(String.valueOf(testService.save(entity))); testService.delete(entity); } @Test public void deleteByMapTest() { TestEntity entity = TestEntity.createInstance(); Serializable id = testService.save(entity); HashMap<String, Object> param = new HashMap<>(); param.put("id", id); logger.info(String.valueOf(testService.deleteByMap(param))); testService.save(entity); testService.delete(entity); id = testService.save(entity); testService.delete(id); } @Test public void updateTest() { TestEntity entity = TestEntity.createInstance(); testService.save(entity); entity.setDesc(null); testService.update(entity); } @Test public void saveOrUpdateTest() { TestEntity entity = TestEntity.createInstance(); testService.saveOrUpdate(entity); entity.setDesc(null); testService.saveOrUpdate(entity); } @Test public void getTest() { TestEntity entity = TestEntity.createInstance(); Serializable id = testService.save(entity); TestEntity testEntity = testService.get(id); logger.info(testEntity.toString()); } @Test public void listAllTest() { List<TestEntity> list = testService.listAll(); printList(list); } @Test public void listByMapTest() { TestEntity entity = TestEntity.createInstance(); testService.save(entity); Map<String, Object> param = new HashMap<>(); param.put("desc", entity.getDesc()); List<TestEntity> list = testService.listByMap(param); printList(list); } @Test public void countAllTest() { TestEntity entity = TestEntity.createInstance(); testService.save(entity); logger.info(String.valueOf(testService.countAll())); } @Test public void countByMapTest() { TestEntity entity = TestEntity.createInstance(); testService.save(entity); Map<String, Object> param = new HashMap<>(); param.put("id", entity.getId()); logger.info(String.valueOf(testService.countByMap(param))); } @Test public void saveTxTest() { try { testService.saveTxTest(); } catch (Exception e) { e.printStackTrace(); } } private void printList(List list) { if (null != list) { for (Object each : list) { logger.info(each.toString()); } } } }
3、运行tomcat7插件后,打开浏览器,输入127.0.0.1:8080/moyapp测试接口和事务接口。
yexiangyang
moyyexy@gmail.com