spring+spring mvc+mybatis+jpa+freeMarker+redis集成
一、前序
在集成这框架之前,之前我用的一直ssm+freeMarker+redis,这个框架整体来说还是可以,但是每次项目都要写基础服务,就有点琐碎,
于是打算集成一下jpa(Java Persistence API)帮助减少一下基础代码的搬运工作
二、项目结构

三、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.SMJ</groupId> <artifactId>SMJ</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>SMJ Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <!-- 设置项目编码编码 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!-- spring版本号 --> <spring.version>5.2.0.RELEASE</spring.version> <!-- mybatis版本号 --> <mybatis.version>3.4.1</mybatis.version> </properties> <dependencies> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.29</version> </dependency> <!-- java ee --> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>8.0.1</version> <scope>provided</scope> </dependency> <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- jedis依赖 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.2.RELEASE</version> <exclusions> <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> </exclusion> <exclusion> <artifactId>spring-context</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-tx</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-aop</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-data-commons</artifactId> <groupId>org.springframework.data</groupId> </exclusion> </exclusions> </dependency> <!-- 数据库 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.41</version> <scope>runtime</scope> </dependency> <!-- 数据库连接池 --> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <!-- mybatis/spring整合包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</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-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> <exclusions> <exclusion> <artifactId>spring-aop</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- spring data jpa 数据库持久层 --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>2.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.5.Final</version> </dependency> <!-- for JPA, use hibernate-entitymanager instead of hibernate-core --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.3.5.Final</version> </dependency> <!-- optional --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-osgi</artifactId> <version>4.3.5.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-envers</artifactId> <version>4.3.5.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>4.3.5.Final</version> <exclusions> <exclusion> <artifactId>mchange-commons-java</artifactId> <groupId>com.mchange</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-proxool</artifactId> <version>4.3.5.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-infinispan</artifactId> <version>4.3.5.Final</version> <exclusions> <exclusion> <artifactId>jboss-logging</artifactId> <groupId>org.jboss.logging</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>4.3.5.Final</version> <exclusions> <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> <!-- 上传组件包 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> <exclusions> <exclusion> <artifactId>commons-io</artifactId> <groupId>commons-io</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.13</version> </dependency> <!-- 分页依赖 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.10</version> </dependency> <!-- 解析表格依赖--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.16</version> <exclusions> <exclusion> <artifactId>commons-codec</artifactId> <groupId>commons-codec</groupId> </exclusion> </exclusions> </dependency> <!--处理2007 excel--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.16</version> </dependency> <!-- gson 解析 --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.2</version> </dependency> <!-- 定时器Quertz --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.1</version> <exclusions> <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> </exclusion> <exclusion> <artifactId>c3p0</artifactId> <groupId>com.mchange</groupId> </exclusion> </exclusions> </dependency> <!-- token使用json --> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> <exclusions> <exclusion> <artifactId>commons-lang</artifactId> <groupId>commons-lang</groupId> </exclusion> </exclusions> </dependency> <!-- 时间格式化--> <!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.6</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.6</version> <exclusions> <exclusion> <artifactId>jackson-annotations</artifactId> <groupId>com.fasterxml.jackson.core</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.28</version> </dependency> <!-- Commons.Lang --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency> <!-- 事物管理 https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> <!-- 请求头参数分析包 --> <dependency> <groupId>eu.bitwalker</groupId> <artifactId>UserAgentUtils</artifactId> <version>1.21</version> </dependency> <!-- 请求头参数分析包 --> <dependency> <groupId>cz.mallat.uasparser</groupId> <artifactId>uasparser</artifactId> <version>0.6.2</version> </dependency> <!-- 请求头参数分析包 --> <dependency> <groupId>net.sourceforge.jregex</groupId> <artifactId>jregex</artifactId> <version>1.2_01</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.10</version> <exclusions> <exclusion> <artifactId>commons-codec</artifactId> <groupId>commons-codec</groupId> </exclusion> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> </exclusions> </dependency> </dependencies> <build> <finalName>SMJ</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <!-- 设置JDK版本 --> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
4、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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:util="http://www.springframework.org/schema/util" 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-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/aop http://www.springframework.org/schema/aop/spring-aop-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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/data/jpa https://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> <aop:aspectj-autoproxy/> <!-- 扫描web相关的bean --> <context:component-scan base-package="com.smj.controller"/> <context:component-scan base-package="com.smj.service"/> <context:component-scan base-package="com.smj.jpa"/> <!-- 开启SpringMVC注解模式 --> <mvc:annotation-driven/> <!-- 引入配置文件 --> <import resource="classpath*:environment.config.xml"/> <!-- 配置数据库相关参数properties的属性:${url} --> <context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true"/> <context:property-placeholder location="classpath:sysconfig.properties" ignore-unresolvable="true"/> <!-- 数据库连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/> <property name="minPoolSize" value="${c3p0.minPoolSize}"/> <property name="autoCommitOnClose" value="${c3p0.autoCommitOnClose}"/> <property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/> <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/> </bean> <!-- jpa数据连接管理工厂 --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitName" value="FastDFSPersistenceUnit"/> <property name="dataSource" ref="dataSource"/> <property name="packagesToScan" value="com.smj.model" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <!-- 是否生成ddl文件 --> <property name="generateDdl" value="true"/> <!-- 是否展示sql --> <property name="showSql" value="false"/> <!-- 必要的数据库库使用的详细信息 --> <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/> <!-- mysql,自行选择 --> <property name="database" value="MYSQL"/> </bean> </property> <!-- 指定JPA属性;如Hibernate中指定是否显示SQL的是否显示、方言等 --> <property name="jpaProperties"> <props> <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.enable_lazy_load_no_trans">true</prop> </props> </property> </bean> <!-- mybatis配置SqlSessionFactory对象 --> <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入数据库连接池 --> <property name="dataSource" ref="dataSource"/> <!-- 扫描model包 使用别名 --> <property name="typeAliasesPackage" value="com.smj.model"/> <!-- 扫描sql配置文件:mapper需要的xml文件 --> <property name="mapperLocations" value="classpath:mapper/*.xml"/> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties"> <!--使用下面的方式配置参数,一行配置一个 --> <value> reasonable=true </value> </property> </bean> </array> </property> </bean> <!-- mybatis自动扫描mapper接口 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.smj.dao"/> <property name="sqlSessionFactoryBeanName" value="sessionFactory"/> </bean> <!-- mybatis配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入数据库连接池 --> <property name="dataSource" ref="dataSource"/> </bean> <!-- mybatis注解方式配置事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- JPA配置启用扫描并自动创建代理的功能 factory-class="com.monk.base.jpa.PeakJpaRepositoryFactory"自己定义的bean注解方式,可以不写,直接注解所有包下的 --> <jpa:repositories base-package="com.smj.jpa" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/> <!-- JPA配置的事务管理器 --> <bean id="transactionJpaManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"></property> </bean> <!-- JPA配置基于注解的事务 --> <tx:annotation-driven transaction-manager="transactionJpaManager"/> <!-- mybatis拦截器方式配置事物 --> <tx:advice id="mybatisTransactionAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="append*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="edit*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="repair" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="delAndRepair" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="get*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="find*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="load*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="search*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="datagrid*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> </tx:attributes> </tx:advice> <!-- JPA拦截器方式配置事物 --> <tx:advice id="jpaTransactionAdvice" transaction-manager="transactionJpaManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="append*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="edit*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="repair" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="delAndRepair" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="get*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="find*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="load*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="search*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="datagrid*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> </tx:attributes> </tx:advice> <!-- mybatis把事务控制在service层 --> <aop:config> <aop:pointcut id="mybatisPointcut" expression="execution(* com.smj.service.*.*(..))"/> <aop:advisor pointcut-ref="mybatisPointcut" advice-ref="mybatisTransactionAdvice"/> </aop:config> <!-- jpa把事务控制在service层 --> <aop:config> <aop:pointcut id="jpaPointcut" expression="execution(* com.smj.jpa.*.*(..))"/> <aop:advisor pointcut-ref="jpaPointcut" advice-ref="jpaTransactionAdvice"/> </aop:config> <!-- rest client --> <bean id="httpClientFactory" class="org.springframework.http.client.SimpleClientHttpRequestFactory"> <property name="connectTimeout" value="10000"/> <property name="readTimeout" value="10000"/> </bean> <!--RestTemplate--> <bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> <constructor-arg ref="httpClientFactory"/> </bean> <import resource="spring-redis.xml"/> <!-- spring线程池--> <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 线程池维护线程的最少数量 --> <property name="corePoolSize" value="5" /> <!-- 线程池维护线程所允许的空闲时间,默认为60s --> <property name="keepAliveSeconds" value="200" /> <!-- 线程池维护线程的最大数量 --> <property name="maxPoolSize" value="20" /> <!-- 缓存队列最大长度 --> <property name="queueCapacity" value="20" /> <!-- 对拒绝task的处理策略 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者--> <property name="rejectedExecutionHandler"> <!-- AbortPolicy:直接抛出java.util.concurrent.RejectedExecutionException异常 --> <!-- CallerRunsPolicy:主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度 --> <!-- DiscardOldestPolicy:抛弃旧的任务、暂不支持;会导致被丢弃的任务无法再次被执行 --> <!-- DiscardPolicy:抛弃当前任务、暂不支持;会导致被丢弃的任务无法再次被执行 --> <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /> </property> <property name="waitForTasksToCompleteOnShutdown" value="true" /> </bean> </beans>
时间处理器
package com.smj.common; import org.apache.commons.lang3.time.DateUtils; import org.springframework.core.convert.converter.Converter; import java.text.ParseException; import java.util.Date; /** * Created by ben on 2017-03-07 0007. */ public class DateConverter implements Converter<String, Date> { private static final String[] patterns = {"yyyy-MM-dd HH:mm:ss" ,"yyyy-MM-dd HH:mm","yyyy-MM-dd","HH:mm"}; @Override public Date convert(String s) { if (s == null || s.trim().equals("")){ return null; } try { return DateUtils.parseDate(s, patterns); } catch (ParseException e) { throw new IllegalArgumentException("字符串转日期失败", e); } } }
5、jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver #测试数据库 jdbc.url=jdbc:mysql://127.0.0.1:3306/boot?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false #用户名 jdbc.username=root #密码 jdbc.password=123456 #连接池中保留的最大连接数。Default: 15 c3p0.maxPoolSize=30 #连接池中保留的最小连接数。 c3p0.minPoolSize=10 #连接关闭时默认将所有未提交的操作回滚。默认为false c3p0.autoCommitOnClose=false #当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒,默认为0; c3p0.checkoutTimeout=10000 #定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 c3p0.acquireRetryAttempts=2 #每60秒检查所有连接池中的空闲连接。Default: 0 c3p0.idleConnectionTestPeriod=60 #最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 c3p0.maxIdleTime=60
6、redis.properties
#访问地址
redis.host=127.0.0.1
redis.database=0
#访问端口
redis.port=6379
#注意,如果没有password,此处不设置值,但这一项要保留
redis.password=
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
redis.maxIdle=300
#连接池的最大数据库连接数。设为0表示无限制
redis.maxActive=600
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWait=1000
#在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
redis.testOnBorrow=true
#最大连接数:能够同时建立的“最大链接个数”
redis.maxTotal=1000
#最小空闲数
redis.minIdle=3
#空闲对象被清除需要达到的最小空闲时间
redis.minEvictableIdleTimeMillis=30000
#空闲检测线程,sleep 间隔多长时间,去处理与idle相关的事情
redis.timeBetweenEvictionRunsMillis=30000
#当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
redis.timeout=2000
#默认对象过期时间(秒)
redis.defaultExpiration=3600
7.、log4j.properties
log4j.rootLogger=DEBUG,INFO,ERROR
##控制台日志
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n
#info log
log4j.appender.INFO=org.apache.log4j.RollingFileAppender
log4j.appender.INFO.File=logs/INFOLOG.log
log4j.appender.INFO.Threshold=INFO
log4j.appender.INFO.MaxFileSize=10MB
log4j.appender.INFO.layout=org.apache.log4j.PatternLayout
log4j.appender.INFO.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n
log4j.appender.INFO.filter.infoFilter = org.apache.log4j.varia.LevelRangeFilter
log4j.appender.INFO.filter.infoFilter.LevelMin=INFO
log4j.appender.INFO.filter.infoFilter.LevelMax=INFO
#debug log
log4j.appender.ERROR=org.apache.log4j.RollingFileAppender
log4j.appender.ERROR.File=logs/ERRORLOG.log
log4j.appender.ERROR.Threshold=ERROR
log4j.appender.ERROR.MaxFileSize=10MB
log4j.appender.ERROR.MaxBackupIndex=3
log4j.appender.ERROR.layout=org.apache.log4j.PatternLayout
log4j.appender.ERROR.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n
log4j.appender.ERROR.filter.infoFilter = org.apache.log4j.varia.LevelRangeFilter
log4j.appender.ERROR.filter.infoFilter.LevelMin=ERROR
log4j.appender.ERROR.filter.infoFilter.LevelMax=ERROR
8、spring-mvc.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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:context="http://www.springframework.org/schema/context" 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/aop http://www.springframework.org/schema/aop/spring-aop-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/cache http://www.springframework.org/schema/cache/spring-cache.xsd xmlns:task=http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!-- 引入同文件夹下的redis属性配置文件 --> <import resource="spring-redis.xml"/> <!-- 扫描web相关的bean --> <context:component-scan base-package="com.smj.controller"/> <context:component-scan base-package="com.smj.service"/> <context:component-scan base-package="com.smj.jpa"/> <!-- 静态资源默认servlet配置 --> <mvc:default-servlet-handler/> <!-- 处理静态资源文件 --> <mvc:resources mapping="/static/**" location="/static/" /> <context:property-placeholder location="classpath:sysconfig.properties" ignore-unresolvable="true"/> <!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默认编码 --> <property name="defaultEncoding" value="utf-8"/> <!-- 文件大小最大值 --> <property name="maxUploadSize" value="10485760000"/> <!-- 内存中的最大值 --> <property name="maxInMemorySize" value="40960"/> </bean> <!-- 配置freeMarker视图解析器 --> <bean id="viewResolverFtl" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/> <property name="contentType" value="text/html; charset=UTF-8"/> <property name="exposeRequestAttributes" value="true"/> <property name="exposeSessionAttributes" value="true"/> <property name="exposeSpringMacroHelpers" value="true"/> <property name="requestContextAttribute" value="request"/> <property name="allowSessionOverride" value="true"/> <property name="cache" value="true"/> <property name="suffix" value=".ftl"/> <property name="prefix" value=""/> <property name="order" value="0"/> </bean> <!-- 配置freeMarker的模板路径 --> <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <!--<property name="templateLoaderPath" value="/WEB-INF/ftl/"/>--> <property name="templateLoaderPaths"> <list> <value>/WEB-INF/views/</value> </list> </property> <property name="freemarkerVariables"> <map> <entry key="xml_escape" value-ref="fmXmlEscape"/> </map> </property> <property name="defaultEncoding" value="UTF-8"/> <property name="freemarkerSettings"> <props> <prop key="template_update_delay">1</prop> <prop key="number_format">#.##</prop> <prop key="object_wrapper">freemarker.ext.beans.BeansWrapper</prop> <!-- <prop key="locale">zh_CN</prop> <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop> <prop key="date_format">yyyy-MM-dd</prop> <prop key="classic_compatible">true</prop> --> </props> </property> </bean> <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/> <!-- json转换器 --> <bean id="jsonConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> <property name="fastJsonConfig"> <bean class="com.alibaba.fastjson.support.config.FastJsonConfig"> <property name="features"> <list> <value>AllowArbitraryCommas</value> <value>AllowUnQuotedFieldNames</value> <value>DisableCircularReferenceDetect</value> </list> </property> <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"></property> </bean> </property> </bean> <mvc:annotation-driven conversion-service="conversionService"> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" /> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <!--日期输入参数转换器 --> <bean class="com.smj.common.DateConverter"/> </set> </property> </bean> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.smj.interceptor.BaseInterceptor"></bean> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/api/**"/> <bean class="com.smj.interceptor.PerformanceInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> <!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效 --> <cache:annotation-driven cache-manager="redisCacheManager"/> <!-- spring线程池--> <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 线程池维护线程的最少数量 --> <property name="corePoolSize" value="5" /> <!-- 线程池维护线程所允许的空闲时间,默认为60s --> <property name="keepAliveSeconds" value="200" /> <!-- 线程池维护线程的最大数量 --> <property name="maxPoolSize" value="20" /> <!-- 缓存队列最大长度 --> <property name="queueCapacity" value="20" /> <!-- 对拒绝task的处理策略 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者--> <property name="rejectedExecutionHandler"> <!-- AbortPolicy:直接抛出java.util.concurrent.RejectedExecutionException异常 --> <!-- CallerRunsPolicy:主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度 --> <!-- DiscardOldestPolicy:抛弃旧的任务、暂不支持;会导致被丢弃的任务无法再次被执行 --> <!-- DiscardPolicy:抛弃当前任务、暂不支持;会导致被丢弃的任务无法再次被执行 --> <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /> </property> <property name="waitForTasksToCompleteOnShutdown" value="true" /> </bean> </beans>
9、spring-mybatis-jpa.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:aop="http://www.springframework.org/schema/aop" 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/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd "> <!-- 扫描service包下所有使用注解的类型 --> <context:component-scan base-package="com.smj.service.*"/> <context:component-scan base-package="com.smj.jpa.*"/> <!-- 配置数据库相关参数properties的属性:${url} --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 数据库连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/> <property name="minPoolSize" value="${c3p0.minPoolSize}"/> <property name="autoCommitOnClose" value="${c3p0.autoCommitOnClose}"/> <property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/> <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/> <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}"/> <property name="maxIdleTime" value="${c3p0.maxIdleTime}"/> </bean> <!-- mybatis配置SqlSessionFactory对象 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入数据库连接池 --> <property name="dataSource" ref="dataSource"/> <!-- 扫描model包 使用别名 --> <property name="typeAliasesPackage" value="com.smj.model"/> <!-- 扫描sql配置文件:mapper需要的xml文件 --> <property name="mapperLocations" value="classpath:mapper/*.xml"/> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties"> <!--使用下面的方式配置参数,一行配置一个 --> <value> reasonable=true </value> </property> </bean> </array> </property> </bean> <!-- jpa数据连接管理工厂 --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitName" value="FastDFSPersistenceUnit"/> <property name="dataSource" ref="dataSource"/> <property name="packagesToScan" value="com.smj.model" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <!-- 是否生成ddl文件 --> <property name="generateDdl" value="true"/> <!-- 是否展示sql --> <property name="showSql" value="false"/> <!-- 必要的数据库库使用的详细信息 --> <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/> <!-- mysql,自行选择 --> <property name="database" value="MYSQL"/> </bean> </property> <!-- 指定JPA属性;如Hibernate中指定是否显示SQL的是否显示、方言等 --> <property name="jpaProperties"> <props> <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.enable_lazy_load_no_trans">true</prop> </props> </property> </bean> <!-- mybatis配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 注入sqlSessionFactory --> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <!-- 给出需要扫描Dao接口包 --> <property name="basePackage" value="com.smj.dao"/> </bean> <!-- mybatis配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入数据库连接池 --> <property name="dataSource" ref="dataSource"/> </bean> <!-- mybatis注解方式配置事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- jpa配置启用扫描并自动创建代理的功能 factory-class="com.monk.base.jpa.PeakJpaRepositoryFactory"自己定义的bean注解方式,可以不写,直接注解所有包下的 --> <jpa:repositories base-package="com.smj.jpa" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/> <!-- 配置JPA的注解 --> <bean id="transactionJpaManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"></property> </bean> <!-- jpa配置基于注解的事务 --> <tx:annotation-driven transaction-manager="transactionJpaManager" proxy-target-class="true"/> <!-- mybatis拦截器方式配置事物 --> <tx:advice id="mybatisTransactionAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="append*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="edit*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="repair" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="delAndRepair" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="get*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="find*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="load*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="search*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="datagrid*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> </tx:attributes> </tx:advice> <!-- jpa拦截器方式配置事物 --> <tx:advice id="jpaTransactionAdvice" transaction-manager="transactionJpaManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="append*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="edit*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="repair" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="delAndRepair" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="get*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="find*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="load*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="search*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> <tx:method name="datagrid*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/> </tx:attributes> </tx:advice> <!-- mybatis把事务控制在service层 --> <aop:config> <aop:pointcut id="mybatisPointcut" expression="execution(* com.smj.service.*.*(..))"/> <aop:advisor pointcut-ref="mybatisPointcut" advice-ref="mybatisTransactionAdvice"/> </aop:config> <!-- jpa把事务控制在service层 --> <aop:config> <aop:pointcut id="jpaPointcut" expression="execution(* com.smj.jpa.*.*(..))"/> <aop:advisor pointcut-ref="jpaPointcut" advice-ref="jpaTransactionAdvice"/> </aop:config> </beans>
10、spring-redis.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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.2.xsd"> <!-- 连接池基本参数配置,类似数据库连接池 --> <context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/> <!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效 --> <cache:annotation-driven cache-manager="redisCacheManager"/> <!-- redis连接池 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="${redis.maxActive}"/> <property name="maxIdle" value="${redis.maxIdle}"/> <property name="testOnBorrow" value="${redis.testOnBorrow}"/> </bean> <!-- 连接池配置,类似数据库连接池 --> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${redis.host}"></property> <property name="port" value="${redis.port}"></property> <!-- <property name="password" value="${redis.pass}"></property> --> <property name="poolConfig" ref="poolConfig"></property> </bean> <!--redis操作模版,使用该对象可以操作redis --> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="jedisConnectionFactory"/> <!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!! --> <property name="keySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> </property> <property name="hashKeySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <property name="hashValueSerializer"> <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/> </property> <!--开启事务 --> <property name="enableTransactionSupport" value="true"></property> </bean> <!-- spring自己的缓存管理器,这里定义了缓存位置名称 ,即注解中的value --> <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager"> <property name="caches"> <set> <!-- 这里可以配置多个redis --> <!-- <bean class="com.cn.util.RedisCache"> <property name="redisTemplate" ref="redisTemplate" /> <property name="name" value="default"/> </bean> --> <bean class="com.smj.cache.RedisCache"> <property name="redisTemplate" ref="redisTemplate"/> <property name="name" value="common"/> <!-- common名称要在类或方法的注解中使用 --> </bean> </set> </property> </bean> <!-- 配置缓存 --> <bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"> <constructor-arg ref="redisTemplate"/> <!--<property name="cacheNames">--> <!--<list>--> <!--<value>adminUserCache</value>--> <!--<value>lotteryTypeCache</value>--> <!--<value>lotteryPlayMethodCache</value>--> <!--<value>adminNoticeCache</value>--> <!--</list>--> <!--</property>--> <!--默认缓存超时时间(秒) --> <property name="defaultExpiration" value="${redis.defaultExpiration}"/> <!-- 给特定的cacheName设置超时时间 (秒)--> <!--<property name="expires">--> <!--<util:map>--> <!--<entry value="1800" key="adminUserCache"/>--> <!--<entry value="1800" key="lotteryTypeCache"/>--> <!--<entry value="1800" key="lotteryPlayMethodCache"/>--> <!--<entry value="86400" key="adminNoticeCache"/>--> <!--</util:map>--> <!--</property>--> </bean> </beans>
11、spring-task.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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task" 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/aop http://www.springframework.org/schema/aop/spring-aop-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/task http://www.springframework.org/schema/task/spring-task-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!-- 配置注解扫描 --> <context:annotation-config/> <!-- Spring定时器注解开关--> <task:annotation-driven></task:annotation-driven> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> <!-- 此处对于定时时间的配置会被注解中的时间配置覆盖,因此,以注解配置为准--> <!--<task:scheduled-tasks scheduler="myScheduler">--> <!--</task:scheduled-tasks>--> <!-- 配置线程池 --> <task:scheduler id="myScheduler" pool-size="20"/> </beans>
12、sysconfig.properties
headico=com.mysql.jdbc.Driver
13、实体(因为加入了JPA所以实体需要添加注解,关联到数据库的表上)
package com.smj.model; import com.smj.utils.PagingParameter; import javax.persistence.*; import java.io.Serializable; import java.util.Date; /** * Created by Administrator on 2019/10/4 0004. */ @Entity @Table(name = "demo") public class Demo extends PagingParameter implements Serializable { @Id @Column(name = "id", unique = true, nullable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "user_name") private String userName; @Column(name = "pass_Word") private String passWord; @Column(name = "create_Time") private Date createTime; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } }
14、mybatis---dao编写与Mapper
(1)IDemoDao
package com.smj.dao; import com.smj.model.Demo; import org.apache.ibatis.annotations.Param; import java.util.List; /** * Created by Administrator on 2019/10/4 0004. */ public interface IDemoDao { Demo selectDemoById(@Param("id") Integer id); List<Demo> selectDemoPageInfo(@Param("demo") Demo demo); int insertDemo(@Param("demo") Demo demo); }
(2)IDemoDaoMapper.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.smj.dao.IDemoDao"> <resultMap id="BaseResultMap" type="com.smj.model.Demo"> <id column="id" property="id"/> <result column="user_name" property="userName"/> <result column="pass_word" property="passWord"/> <result column="create_time" property="createTime"/> </resultMap> <sql id="Base_Column_List"> id, user_name, pass_word, create_time </sql> <insert id="insertDemo" useGeneratedKeys="true" keyProperty="demo.id" parameterType="com.smj.model.Demo"> INSERT INTO demo ( user_name, pass_word, create_time ) VALUES ( #{demo.userName}, #{demo.passWord}, #{demo.createTime} ) </insert> <select id="selectDemoById" resultMap="BaseResultMap"> SELECT <include refid="Base_Column_List"></include> FROM demo WHERE id=#{id} </select> <select id="selectDemoPageInfo" resultMap="BaseResultMap"> SELECT <include refid="Base_Column_List"></include> FROM demo WHERE 1=1 </select> </mapper>
14、service与jpa
(1)Service
IBaseService(用于整合JPA为一个Service用的)
package com.smj.service; /** * Created by Administrator on 2019/10/4 0004. */ public interface IBaseService<T> { /** * 获取jpa持久化对象 * @return */ public T getJpa(); }
IDemoService
package com.smj.service; import com.smj.model.Demo; import com.smj.jpa.IDemoJpaService; import com.github.pagehelper.PageInfo; import org.apache.ibatis.annotations.Param; /** * Created by Administrator on 2019/10/4 0004. */ public interface IDemoService extends IBaseService<IDemoJpaService>{ Demo selectDemoById(@Param("id") Integer id); PageInfo<Demo> selectDemoPageInfo(@Param("demo") Demo demo); int insertDemo(@Param("demo") Demo demo); }
DemoService
package com.smj.service.impl; import com.smj.dao.IDemoDao; import com.smj.model.Demo; import com.smj.service.IDemoService; import com.smj.jpa.IDemoJpaService; import com.smj.utils.PagingParameter; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; /** * Created by Administrator on 2019/10/4 0004. */ @Service public class DemoService implements IDemoService { @Autowired IDemoJpaService iDemoJpaService; @Autowired IDemoDao iDemoDao; @Override public IDemoJpaService getJpa() { return iDemoJpaService; } @Override public Demo selectDemoById(Integer id) { if(id!=null){ return iDemoDao.selectDemoById(id); } return null; } @Override public PageInfo<Demo> selectDemoPageInfo(Demo demo) { PagingParameter.setDefault(demo); //查询第一页,每页10条 PageHelper.startPage(demo.getPageNum(), demo.getPageSize()); List<Demo> adminUsers = iDemoDao.selectDemoPageInfo(demo); return new PageInfo<>(adminUsers); } @Override public int insertDemo(Demo demo) { demo.setCreateTime(new Date()); return iDemoDao.insertDemo(demo); } }
(2)JPA
package com.smj.jpa; import com.smj.model.Demo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.stereotype.Repository; import java.io.Serializable; import java.util.List; /** * Created by Administrator on 2019/10/4 0004. */ @Repository public interface IDemoJpaService extends JpaRepository<Demo,Integer>, JpaSpecificationExecutor<Demo>, Serializable { /** * 根据用户名查询 * @param userName * @return */ List<Demo> findByUserName(String userName); /** * 根据用户名密码查询 * @param userName * @param password * @return */ List<Demo> findAllByUserNameAndPassWord(String userName,String password); }
15、controller
package com.smj.controller.web; import com.smj.model.Demo; import com.smj.service.IDemoService; import com.smj.utils.ResponseResult; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import java.util.List; /** * Created by Administrator on 2019/10/4 0004. */ @Controller @RequestMapping("demo") public class WebDemoController { @Autowired IDemoService iDemoService; /** * 使用jpa * 使用mapper * @param model * @param request * @param demo * @return * @throws Exception */ @RequestMapping(value = "/useJpaAndMapper") @ResponseBody public ResponseResult useJpa(Model model, HttpServletRequest request, Demo demo) throws Exception { //使用Jpa demo = iDemoService.getJpa().save(demo); iDemoService.insertDemo(demo); // Demo sqlDemo=iDemoService.getJpa().findById(2).get(); List<Demo> listDemo=iDemoService.getJpa().findAll(); long count=iDemoService.getJpa().count(); //使用mapper Demo sqlDemoMapper=iDemoService.selectDemoById(demo.getId()); PageInfo<Demo> pageInfo=iDemoService.selectDemoPageInfo(demo); List<Demo> demoList=iDemoService.getJpa().findAllByUserNameAndPassWord("info","info"); if(demoList==null){ } iDemoService.getJpa().deleteById(demo.getId()); iDemoService.getJpa().deleteAll(); return ResponseResult.successResult(""); } }
16、redis
(1)RedisBaiseTakes
package com.smj.takes; import java.util.List; /** * Created by Owner on 2018/9/27. */ public interface RedisBaiseTakes<H, K, V> { //增 void addLongTime(K key, String value); long setIncrValue(K key); //增 void addShotTime(K key, String value); void addObj(H objectKey, K key, V object); //删 void delete(K key); void delete(List<K> listKeys); void deletObj(H objecyKey, K key); //改 void update(K key, String value); void updateObj(H objectKey, K key, V object); //查 String get(K key); V getObj(H objectKey, K key); }
(2)UserTokenReaisTakes
package com.smj.takes; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.util.List; import java.util.concurrent.TimeUnit; /** * Created by Owner on 2018/9/27. */ @Component public class UserTokenReaisTakes implements RedisBaiseTakes<String, String, Object> { @Autowired private RedisTemplate redisTemplate; @Override public void addLongTime(String key, String value) { if (redisTemplate == null) { System.out.println("redisTemplate 实例化失败"); return; } else { redisTemplate.opsForValue().set(key, value, 365, TimeUnit.DAYS); } } @Override public long setIncrValue(String key) { return redisTemplate.opsForValue().increment(key, 1); } @Override public void addShotTime(String key, String value) { if (redisTemplate == null) { System.out.println("redisTemplate 实例化失败"); return; } else { redisTemplate.opsForValue().set(key, value, 1, TimeUnit.DAYS); } } @Override public void addObj(String objectKey, String key, Object object) { if (redisTemplate == null) { System.out.println("redisTemplate 实例化失败"); return; } else { redisTemplate.opsForHash().put(objectKey, key, object); } } @Override public void delete(String key) { redisTemplate.delete(key); } @Override public void delete(List<String> listKeys) { redisTemplate.delete(listKeys); } @Override public void deletObj(String objecyKey, String key) { redisTemplate.opsForHash().delete(objecyKey, key); } @Override public void update(String key, String value) { } @Override public void updateObj(String objectKey, String key, Object object) { } @Override public String get(String key) { String value = (String) redisTemplate.opsForValue().get(key); return value; } @Override public Object getObj(String objectKey, String key) { Object seeUser = (Object) redisTemplate.opsForHash().get(objectKey, key); return seeUser; } }

浙公网安备 33010602011771号