(六)mybatis-spring集成完整版
mybatis-spring集成完整版
一、项目整体
- mybatis接口层、mapper层
- Service层
- Test调用测试
二、自动生成代码-mybatis generator
主要修改:
接口、mapper、实体类的包结构
需要生成的数据库表
生成的包目录结构:
三、配置mybatis-config.xml
- 配置数据源:安装derby,使用网络模式连接
- 映射器
- 事务管理器、别名、插件之类
- 加级联,mapper.xml和实体类
- 配置setting懒加载
- 详细配置见--九、mybatis-config.xml
四、整合spring,配置applicationContext.xml
- 配置数据源
- 配置sqlSessionFactory:DataSource、引入mybatis-config.xml
- 自动加载映射文件
- 配置自动扫描接口
- 开启注解
- 详细配置见--九、applicationContext.xml(33-89行)
【注】此处使用多数据源配置,详见下篇
五、配置注解方式(自动创建bean)
- 启动aop注解
- service实现类上添加@service,并声明private mapper接口(添加@Autowired)
- 测试类上声明service接口(添加@Autowired)
- applicationContext.xml配置(16-21行)
User为例:
接口类:
@Component("USERMAPPER") //配置自动生成的bean的名字 public interface UserMapper { 。。。 }
service实现类
@Service("USERSERVICEIMP") public class UserServiceImpl implements UserService{ @Autowired private UserMapper userMapper; //... }
test类
public class UserTest extends SpringTestCase{ @Autowired private UserService userService; //... }
SpringTestCase类(此类是加载applicationContext.xml文件,可直接写个初始化方法启动加载)
import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @ContextConfiguration(locations={"classpath:applicationContext.xml"}) @RunWith(SpringJUnit4ClassRunner.class) public class SpringTestCase extends AbstractJUnit4SpringContextTests{ }
六、配置事务
Xml添加事务管理器配置,开启事务注解(详细配置见applicationContext.xml 91-95行)
在需要添加事务的方法或类上添加注解:
@Transactional(value="transactionManager",propagation=Propagation.REQUIRES_NEW,isolation=Isolation.READ_COMMITTED)
//事务名、传播方式、隔离级别
七、配置ehcache
- ApplicationContext.xml:(1)添加cache配置;(2)引入ehcache.xml;(3)开启cache注解;(详细配置见applicationContext.xml 23-31行)
- ehcache.xml:配置自定义缓存(需要配置属性)(见 九、ehcache.xml)
- 添加cache注解:
@Cacheable 属性,value、key和condition
@CachePut 属性,value、key和condition检查相同key的缓存元素
@CacheEvict 属性value、key、condition、allEntries和beforeInvocation清除缓存元素
【注】实体类需要序列化,否则写缓存出错
事务+cache运用
@Service("USERSERVICEIMP") public class UserServiceImpl implements UserService{ @Autowired private UserMapper userMapper; @Transactional(value="transactionManager",propagation=Propagation.REQUIRES_NEW,isolation=Isolation.READ_COMMITTED) public void Transaction(){ User user=new User(); user.setId(14); user.setAccount("admin"); user.setName("管理员"); user.setPassword("123456"); user.setRoleId(1); int i=userMapper.insert(user); User user1=new User(); user1.setId(14); user1.setAccount("admin"); user1.setName("管理员"); user1.setPassword("123456"); user1.setRoleId(2); int j=userMapper.insert(user1); System.out.println(i+"--"+j); } @Cacheable(value="sampleCache",key="#id") public User selectByPrimaryKey(Integer id) { User user=userMapper.selectByPrimaryKey(id); System.out.println(user); return user; } @Override @CacheEvict(value="sampleCache",key="#id",allEntries=true,beforeInvocation=true) public int updateByPrimaryKeySelective(User record) { // TODO Auto-generated method stub int i=userMapper.updateByPrimaryKeySelective(record); return i; } }
八、配置log4j、junit4
见 九、配置文件
九、配置文件
applicationContext.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xmlns:p="http://www.springframework.org/schema/p" 7 xmlns:tx="http://www.springframework.org/schema/tx" 8 xmlns:cache="http://www.springframework.org/schema/cache" 9 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 10 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd 11 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd 12 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd 13 http://www.springframework.org/schema/cache 14 http://www.springframework.org/schema/cache/spring-cache-4.2.xsd"> 15 16 <!-- 启动spring注解 --> 17 <context:annotation-config/> 18 <!-- 扫描注解所在的包 --> 19 <context:component-scan base-package="com.example"/> 20 <!-- 启动aop注解 --> 21 <aop:aspectj-autoproxy proxy-target-class="true"/> 22 23 <!-- cache配置 --> 24 <cache:annotation-driven cache-manager="cacheManager"/> 25 <!-- 声明cachemanager --> 26 <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> 27 <property name="cacheManager" ref="ehcache"></property> 28 </bean> 29 <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 30 <property name="configLocation" value="classpath:ehcache.xml"></property> 31 </bean> 32 33 <!-- 引入属性文件 --> 34 <context:property-placeholder location="classpath:jdbc.properties"/> 35 36 <!-- 配置数据源master --> 37 <bean id="dataSourceMaster" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 38 <property name="driverClassName" value="${driver}"/> 39 <property name="url" value="${url}" /> 40 <!-- 初始化连接大小 --> 41 <property name="initialSize" value="0" /> 42 <!-- 连接池最大使用连接数量 --> 43 <property name="maxActive" value="20" /> 44 <!-- 连接池最小空闲 --> 45 <property name="minIdle" value="1" /> 46 <!-- 连接池最大空闲 --> 47 <property name="maxIdle" value="20" /> 48 <!-- 获取连接最大等待时间 --> 49 <property name="maxWait" value="60000" /> 50 </bean> 51 <!-- 配置数据源master --> 52 <bean id="dataSourceSlave" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 53 <property name="driverClassName" value="${driver}"/> 54 <property name="url" value="${url_slave}" /> 55 <!-- 初始化连接大小 --> 56 <property name="initialSize" value="0" /> 57 <!-- 连接池最大使用连接数量 --> 58 <property name="maxActive" value="20" /> 59 <!-- 连接池最小空闲 --> 60 <property name="minIdle" value="0" /> 61 <!-- 连接池最大空闲 --> 62 <property name="maxIdle" value="20" /> 63 <!-- 获取连接最大等待时间 --> 64 <property name="maxWait" value="60000" /> 65 </bean> 66 <bean id="dataSource" class="com.example.util.ThreadLocalRountingDataSource"> 67 <property name="targetDataSources"> 68 <map key-type="com.example.enums.DataSources"> 69 <entry key="MASTER" value-ref="dataSourceMaster" /> 70 <entry key="SLAVE" value-ref="dataSourceSlave"/> 71 </map> 72 </property> 73 <property name="defaultTargetDataSource" ref="dataSourceMaster"></property> 74 75 </bean> 76 77 <!-- 配置SQLSessionFactory --> 78 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 79 <property name="dataSource" ref="dataSource"/> 80 <property name="configLocation" value="classpath:mybatis-config.xml"></property> 81 <!-- 加载映射文件 --> 82 <property name="mapperLocations" value="classpath*:/com/example/dao/*Mapper.xml"></property> 83 </bean> 84 85 <!-- 接口方式 --> 86 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 87 <property name="basePackage" value="com.example.dao"></property> 88 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> 89 </bean> 90 91 <!-- 配置jdbc事务管理器,完成数据的完整性和一致性 --> 92 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 93 <property name="dataSource" ref="dataSource"></property> 94 </bean> 95 <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> 96 97 </beans>
jdbc.properties
driver=org.apache.derby.jdbc.ClientDriver
url=jdbc:derby://localhost:1527/E:/my/derby/mydb
url_slave=jdbc:derby:E://shiny/DdlUtils-test/mydb
mybatis.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <settings> 7 <!-- 开启延迟加载 --> 8 <setting name="lazyLoadingEnabled" value="true"/> 9 <!-- 每种属性按需加载 --> 10 <setting name="aggressiveLazyLoading" value="false"/> 11 </settings> 12 13 </configuration>
ehcache.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" 4 updateCheck="false"> 5 6 <!-- 指定一个文件目录,当EhCache把数据写到硬盘上时,将把数据写到这个文件目录下 --> 7 <diskStore path="java.io.tempdir"/> 8 9 <!-- 设定缓存的默认数据过期策略 --> 10 <defaultCache 11 maxElementsInMemory="10000" 12 eternal="false" 13 overflowToDisk="true" 14 timeToIdleSeconds="10" 15 timeToLiveSeconds="20" 16 diskPersistent="false" 17 diskExpiryThreadIntervalSeconds="120"/> 18 19 <cache name="sampleCache" maxElementsInMemory="1000" eternal="false" overflowToDisk="true" diskSpoolBufferSizeMB="20" 20 timeToIdleSeconds="1" 21 timeToLiveSeconds="2" memoryStoreEvictionPolicy="LFU"/> 22 <cache name="Test" maxElementsInMemory="1" eternal="false" overflowToDisk="true" timeToIdleSeconds="1" timeToLiveSeconds="2" 23 diskPersistent="false" diskExpiryThreadIntervalSeconds="1" memoryStoreEvictionPolicy="LFU"> 24 25 </cache> 26 27 </ehcache>
log4j.properties
log4j.rootLogger=DEBUG, stdout
log4j.logger.org.mybatis=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n