至此springMVC已經配置完畢了,由於項目中需要使用mybatis,所以需要spring來集成mybatis,可以獲取一定的好處。
首先來看一下我們正常流程使用mybatis訪問數據庫時,
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(reader);
SqlSession session = factory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
其中UserMapper是包含了mybatis實現和定義的接口,在後面會進行講解,但是可以顯而易見的是,每次訪問數據庫的時候,我們都需要建立一個SqlSession,當大量的訪問的時候,內存中會存在大量的連接,導致響應時間長,甚至宕機的情況發生,所以使用spring來集成mybatis的一個好處是,不必再手動管理數據庫連接,而交由spring管理,可以專注於業務邏輯的實現。
集成方法,首先建立一個db.properties放入resources目錄下,可以通過classpath進行訪問資源目錄,用於配置數據庫的細節。
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jx?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull
jdbc.username=root
jdbc.password=root
還需要一個sqlMapConfig來配置所有的mapper的掃描基礎包,之前建立的mapper包需要一個xml來掃描。
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>
<properties resource="db.properties"></properties>
<!-- 配置別名 -->
<typeAliases>
<!-- 批量掃描別名 -->
<package name="com.neusoft.model"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.neusoft.mapper"></package>
</mappers>
</configuration>
配置好mybatis後,我們就要在ModuleConfig中配置spring來集成mybatis,其餘組件的集成也是在這個文件中,如redis,mq等,也就是讀取配置文件。
,在mvcConfig.java中已經讀取了sqlMapConfig.xml,所以直接在資源目錄下建立即可。ModuleConfig.java
@Configuration
@EnableCaching
@EnableTransactionManagement()
@ComponentScan(basePackages = {"com.neusoft.service"})
public class ModuleConfig {
@Bean
public PropertyPlaceholderConfigurer propertyPlaceholderConfigurer(
@Value("classpath:db.properties") Resource locationDB,
@Value("classpath:redis.properties") Resource locationsRedis) {
PropertyPlaceholderConfigurer propertyPlaceholderConfigurer = new PropertyPlaceholderConfigurer();
propertyPlaceholderConfigurer.setLocations(locationDB, locationsRedis);
return propertyPlaceholderConfigurer;
}
@Bean
public DataSource dataSource(@Value("${jdbc.username}") String userName,
@Value("${jdbc.password}") String password,
@Value("${jdbc.driver}") String driverClassName,
@Value("${jdbc.url}") String jdbcUrl) {
HikariDataSource dataSource=new HikariDataSource();
// BasicDataSource dataSource = new BasicDataSource();
dataSource.setUsername(userName);
dataSource.setPassword(password);
dataSource.setDriverClassName(driverClassName);
dataSource.setJdbcUrl(jdbcUrl);
return dataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource);
return sqlSessionFactory.getObject();
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.neusoft.mapper");
return mapperScannerConfigurer;
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
//redis配置參考http://www.cnblogs.com/s648667069/p/6473412.html
//jedis連接池 配置
@Bean
public JedisPoolConfig poolConfig(@Value("${redis.maxIdle}") int maxIdle,
@Value("${redis.maxWait}") int maxWaitMillis,
@Value("${redis.testOnBorrow}") Boolean testOnBorrow) {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
jedisPoolConfig.setTestOnBorrow(testOnBorrow);
return jedisPoolConfig;
}
// redis服務器中心
@Bean
public JedisConnectionFactory connectionFactory(@Value("#{poolConfig}") JedisPoolConfig poolConfig , @Value("${redis.host}") String hostName,
@Value("${redis.port}") int port, @Value("${redis.maxWait}") int timeout, @Value("${redis.password}") String password) {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setPoolConfig(poolConfig);
jedisConnectionFactory.setHostName(hostName);
jedisConnectionFactory.setPort(port);
jedisConnectionFactory.setPassword(password);
jedisConnectionFactory.setTimeout(timeout);
return jedisConnectionFactory;
}
// redis template
@Bean
public RedisTemplate redisTemplate(@Value("#{connectionFactory}") JedisConnectionFactory connectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(connectionFactory);
StringRedisSerializer keySerializer=new StringRedisSerializer();
redisTemplate.setKeySerializer(keySerializer);
JdkSerializationRedisSerializer jdkSerializationRedisSerializer=new JdkSerializationRedisSerializer();
redisTemplate.setValueSerializer(jdkSerializationRedisSerializer);
return redisTemplate;
}
// cache manager
@Bean()
public RedisCacheManager cacheManager(@Value("#{redisTemplate}") RedisTemplate redisTemplate) {
RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);
return redisCacheManager;
}
}
首先我們需要一個數據源,通過數據源來訪問數據庫,比較穩定,速度比較快的數據源是HikariDataSource,在Pom.xml已經引入了jar包,也可使用比較普遍的BasicDataSource。
數據源同樣需要配置driver,url,username,password,配置完後把數據源放入sqlSessionFactory中,並把這個函數設爲一個Bean即可。
在之前使用myBatis的方法中,每次訪問數據庫就需要實例化一個sqlSessionFactory,而交由數據源管理後,不必如此。
在下面配置的是redis,redis是一個鍵值對數據庫,使用的時候數據是保存在內存中的,讀取速度快,所以通常用於存儲一個同樣參數返回同樣結果的東西,比如搜索結果,當搜索同一個關鍵字時,返回的結果查詢過程不必再次執行,直接從數據庫返回執行結果即可,減輕運算壓力,當涉及到的數據庫變化時,比如添加數據,則需要清除redis的數據庫內容,重新運算,這是不可避免的。具體配置過程也是在resources目錄下創建redis.properties。
redis.properties
# Redis settings
redis.host=127.0.0.1
redis.port=6379
redis.password=123q456w
redis.maxIdle=300
redis.maxActive=600
redis.maxWait=1000
redis.testOnBorrow=true
redis在小項目中可有可無,也可以不添加此功能。
到此我們需要的基礎配置都已經完成,下面將編寫一個登錄註冊功能的“麻雀”,也可以在github上面下載我的示例。