项目截图
pom.xml如下
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.alibaba</groupId><artifactId>mybatispring</artifactId><version>0.0.1-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><springversion>4.0.0.RELEASE</springversion><junitversion>4.12</junitversion></properties><dependencies><!-- junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junitversion}</version><scope>test</scope></dependency><!-- db --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.35</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.1.1</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.2</version></dependency><!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>${springversion}</version><type>jar</type><scope>compile</scope></dependency><!-- cglib --><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>2.2.2</version></dependency><!-- log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!-- c3p0数据源 --><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5-pre10</version></dependency></dependencies></project>
然后配置spring,applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"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-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/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 "><!-- 加载配置文件 --><context:property-placeholder location="classpath:db.properties" /><!-- 数据源,使用dbcp --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"><property name="driverClass" value="${jdbc.driverClass}" /><property name="jdbcUrl" value="${jdbc.jdbcUrl}" /><property name="user" value="${jdbc.user}" /><property name="password" value="${jdbc.password}" /><property name="minPoolSize" value="${jdbc.miniPoolSize}" /><property name="maxPoolSize" value="${jdbc.maxPoolSize}" /><property name="initialPoolSize" value="${jdbc.initialPoolSize}" /><property name="maxIdleTime" value="${jdbc.maxIdleTime}" /><property name="acquireIncrement" value="${jdbc.acquireIncrement}" /><property name="acquireRetryAttempts" value="${jdbc.acquireRetryAttempts}" /><property name="acquireRetryDelay" value="${jdbc.acquireRetryDelay}" /><property name="testConnectionOnCheckin" value="${jdbc.testConnectionOnCheckin}" /><property name="automaticTestTable" value="${jdbc.automaticTestTable}" /><property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}" /><property name="checkoutTimeout" value="${jdbc.checkoutTimeout}" /></bean><!-- sqlSessinFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 加载mybatis的配置文件 --><property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" /><!-- 数据源 --><property name="dataSource" ref="dataSource" /></bean><!-- 原始dao接口 --><bean id="userDao" class="com.alibaba.dao.UserDaoImpl"><property name="sqlSessionFactory" ref="sqlSessionFactory" /></bean><!-- mapper配置 MapperFactoryBean:根据mapper接口生成代理对象 --><!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> mapperInterface指定mapper接口 <property name="mapperInterface" value="cn.itcast.ssm.mapper.UserMapper"/> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> --><!-- mapper批量扫描,从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册 遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录 中 自动扫描出来的mapper的bean的id为mapper类名(首字母小写) --><!-- 指定扫描的包名 如果扫描多个包,每个包中间使用半角逗号分隔 --><!-- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="cn.itcast.ssm.mapper"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> --></beans>
引用的db.properties如下
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl = jdbc:mysql://localhost:3306/test
jdbc.user = root
jdbc.password = 123456
jdbc.miniPoolSize = 1
jdbc.maxPoolSize = 20
jdbc.initialPoolSize = 1
jdbc.maxIdleTime = 25000
jdbc.acquireIncrement = 1jdbc.acquireRetryAttempts = 30
jdbc.acquireRetryDelay = 1000
jdbc.testConnectionOnCheckin = true
jdbc.automaticTestTable = c3p0TestTable
jdbc.idleConnectionTestPeriod = 18000
jdbc.checkoutTimeout=3000
SqlMapConfig.xml如下
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!-- 别名定义 --><typeAliases><!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)--><package name="com.alibaba"/></typeAliases><!-- 加载 映射文件 --><mappers><mapper resource="mybatis/UserMapper.xml"/><!-- 批量加载mapper指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中上边规范的前提是:使用的是mapper代理方法和spring整合后,使用mapper扫描器,这里不需要配置了--><!-- <package name="cn.itcast.ssm.mapper"/> --></mappers></configuration>
UserDao.java
package com.alibaba.dao;import com.alibaba.po.User;public interface UserDao {public User findUserById(int id) throws Exception; }
UserDaoImpl.java
package com.alibaba.dao;import org.apache.ibatis.session.SqlSession; import org.mybatis.spring.support.SqlSessionDaoSupport;import com.alibaba.po.User;public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{public User findUserById(int id) throws Exception {SqlSession sqlSession = this.getSqlSession();User user = sqlSession.selectOne("mapper.UserMapper.getUser", id);return user;}}
UserDaoTest.java
package com.alibaba.dao;import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;import com.alibaba.po.User;public class UserDaoTest {private ApplicationContext applicationContext;//在setUp这个方法得到spring容器 @Beforepublic void setUp() throws Exception {applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");}@Testpublic void testFindUserById() throws Exception {UserDao userDao = (UserDao) applicationContext.getBean("userDao");//调用userDao的方法User user = userDao.findUserById(1);System.out.println(user);}}
log4j如下
# Global logging configuration #\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error log4j.rootLogger=DEBUG, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
如果项目运行会报c3p0找不到文件错误,那个没影响,只需要把Log4jdebug改为Info即可,生产环境就不会报错。
加入ehcache
<!-- ehcache --><dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ehcache</artifactId><version>1.0.3</version></dependency><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache-core</artifactId><version>2.6.11</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.12</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.12</version></dependency><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>2.2.2</version></dependency>
配置文件ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"><diskStore path="D:\develop\ehcache" /><defaultCache maxElementsInMemory="1000" maxElementsOnDisk="10000000"eternal="false" overflowToDisk="false" timeToIdleSeconds="120"timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"></defaultCache> </ehcache>
<!-- name:缓存名称。
maxElementsInMemory:缓存最大个数。
eternal:对象是否永久有效,一但设置了,timeout将不起作用。
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds:设置对象在失效前允许存活时间,最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时 间无穷大。
overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
maxElementsOnDisk:硬盘最大缓存个数。
diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU。你可以设置为 FIFO或是LFU。
clearOnFlush:内存数量最大时是否清除。 -->
在SqlMapConfig.xml里设置,其实是默认设置好的,另外两个是设置延迟加载的没影响,第三个默认是true放这只是方便管理
<settings><!-- 打开延迟加载 的开关 --><setting name="lazyLoadingEnabled" value="true" /><!-- 将积极加载改为消极加载即按需要加载 --><setting name="aggressiveLazyLoading" value="false" /><!-- 开启二级缓存 --><setting name="cacheEnabled" value="true" /></settings>
在UserMapper.xml里配置
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
此外User需要序列化,因为有可能缓存是存在硬盘上。
此时就可以使用ehcache了。