SpringBoot--整合Mybatis和Redis

BtWangZhi發表於2017-11-19

1 SpringBoot並沒有提供整合Mybatis的工具包
第一種:使用mybatis官方提供的Spring Boot整合包實現,下載地址:https://github.com/mybatis/spring-boot-starter
第二種:自己整合,與Spring整合Mybatis類似。

2 配置JDBC,將資料來源新增到容器中。

/**
 * JDBC配置
 * @author Tang 
 * 2017年11月18日
 */
@Configuration
@PropertySource(value = { "jdbc.properties" })//讀取外部配置檔案
public class JdbcConfig {

	// 資料庫配置開始
	@Value("${driverClassName}")
	private String driverClassName;

	@Value("${url}")
	private String url;

	@Value("${username}")
	private String username;

	@Value("${password}")
	private String password;

	@Bean(destroyMethod = "close")
	public BasicDataSource dataSource() {
		BasicDataSource basicDataSource = new BasicDataSource();
		basicDataSource.setDriverClassName(driverClassName);
		basicDataSource.setUrl(url);
		basicDataSource.setUsername(username);
		basicDataSource.setPassword(password);
		return basicDataSource;
	}
}

需要讀取外部的配置檔案:
jdbc.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=true
username=root
password=123123

3 整合Mybatis

/**
 * Mybatis的配置
 * @author Tang
 * 2017年11月18日
 */
@Configuration
@AutoConfigureAfter(JdbcConfig.class)//保證在JDBC配置完成後例項化
public class MybatisConfig {

	@Autowired
	private DataSource dataSource;
	
	@Bean
    @ConditionalOnMissingBean //當容器裡沒有指定的Bean的情況下建立該物件
    public SqlSessionFactoryBean sqlSessionFactory() {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        // 設定資料來源
        sqlSessionFactoryBean.setDataSource(dataSource);
        // 設定mybatis的主配置檔案
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource mybatisConfigXml = resolver.getResource("classpath:mybatis-config.xml");
        sqlSessionFactoryBean.setConfigLocation(mybatisConfigXml);
        return sqlSessionFactoryBean;
    }
	
	/**
	 * 定義掃描
	 * @return
	 */
	@Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.text.springboot.dao");
        return mapperScannerConfigurer;
    }
}

通過Spring的自動注入,注入上一步配置好的JDBC資料來源。

4 配置宣告式事務管理
在Spring Boot中推薦使用@Transactional註解來申明事務。
首先需要匯入依賴:

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>

當引入jdbc依賴之後,Spring Boot會自動預設分別注入DataSourceTransactionManager或JpaTransactionManager,所以我們不需要任何額外配置就可以用@Transactional註解進行事務的使用。
在需要事務的Service中新增@Transactional註解即可,具體可看Spring的官方文件,關於宣告式事務。

5 整合Redis

/**
 * Redis相關配置
 * @author Tang
 * 2017年11月18日
 */
@Configuration
@PropertySource(value="classpath:redis.properties")
public class RedisConfig {


    @Value("${redis.url}")
    private String url;

    @Value("${redis.port}")
    private Integer port;

    @Value("${redis.maxTotal}")
    private Integer maxTotal;

    @Bean
    public ShardedJedisPool shardedJedisPool() {
        List<JedisShardInfo> jedisShardInfos = new ArrayList<JedisShardInfo>();
        jedisShardInfos.add(new JedisShardInfo(url, port));
        return new ShardedJedisPool(jedisPoolConfig(), jedisShardInfos);
    }
    
    /**
     * 執行緒池配置
     * @return
     */
    private JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(maxTotal);
        return jedisPoolConfig;
    }
}

配置檔案:

redis.url=127.0.0.1
redis.port=6379
redis.maxTotal=10

和JDBC類似。讀取配置檔案,對映到變數中,然後初始化物件到SpringBoot容器中。

整合redis方式二:
.properties:

# Redis配置
# Redis資料庫索引(預設為0)
spring.redis.database=1
# Redis伺服器地址
spring.redis.host=192.168.41.101
# Redis伺服器連線埠
spring.redis.port=6379
# 連線池最大連線數(使用負值表示沒有限制)
spring.redis.pool.max-active=8
# 連線池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1
# 連線池中的最大空閒連線
spring.redis.pool.max-idle=8
# 連線池中的最小空閒連線
spring.redis.pool.min-idle=1
# 連線超時時間(毫秒)
spring.redis.timeout=10000
@Configuration
public class RedisConfig {

	/**
	 * retemplate相關配置
	 * 
	 * @param factory
	 * @return
	 */
	@Bean
	public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {

		RedisTemplate<String, Object> template = new RedisTemplate<>();
		// 配置連線工廠
		template.setConnectionFactory(factory);

		// 使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(預設使用JDK的序列化方式)
		Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);

		ObjectMapper om = new ObjectMapper();
		// 指定要序列化的域,field,get和set,以及修飾符範圍,ANY是都有包括private和public
		om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
		// 指定序列化輸入的型別,類必須是非final修飾的,final修飾的類,比如String,Integer等會跑出異常
		om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
		jacksonSeial.setObjectMapper(om);

		// 值採用json序列化
		template.setValueSerializer(jacksonSeial);
		// 使用StringRedisSerializer來序列化和反序列化redis的key值
		template.setKeySerializer(new StringRedisSerializer());

		// 設定hash key 和value序列化模式
		template.setHashKeySerializer(new StringRedisSerializer());
		template.setHashValueSerializer(jacksonSeial);
		template.afterPropertiesSet();

		return template;
	}
}

依賴包:

<!-- Redis支援 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-redis</artifactId>
			<version>1.3.2.RELEASE</version>
		</dependency>

工具類:

@Autowired
	private RedisTemplate<String, Object> redisTemplate;  
	
/** 
     * 普通快取獲取 
     * @param key 鍵 
     * @return 值 
     */  
    public Object get(String key){  
        return key==null?null:redisTemplate.opsForValue().get(key);  
    }  

參考:https://blog.csdn.net/plei_yue/article/details/79362372

部分摘自某智播客。

相關文章