至此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上面下载我的示例。