Druid数据源使用(一)---单独使用与整合springboot+mybatis

在springboot中使用(不整合mybatis):

	@Bean
	public ServletRegistrationBean createRegistrationBean() {
		ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/stat/*");
		Map<String, String> initParams = new HashMap<String, String>();
		initParams.put("loginUsername", "hurricane");
		initParams.put("loginPassword", "1003");
		bean.setInitParameters(initParams);
		return bean;
	}
	
	@Bean(initMethod="init",destroyMethod="close")
	public DruidDataSource createDataSource() throws SQLException {
		DruidDataSource druidDataSource = new DruidDataSource();
		druidDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/temp");
		druidDataSource.setUsername("root");
		druidDataSource.setPassword("root");
//		druidDataSource.setTimeBetweenLogStatsMillis(3000);
		
		druidDataSource.setMaxActive(15);
		druidDataSource.setInitialSize(5);
		druidDataSource.setMaxWait(60000);
		druidDataSource.setMinIdle(1);
		
		druidDataSource.setFilters("stat");
		druidDataSource.setConnectionProperties(""
				+ "druid.stat.mergeSql=true;"
				+ "druid.stat.slowSqlMillis=1;"
				+ "druid.stat.logSlowSql=true");
		return druidDataSource;
	}

第一个bean是用来查看统计信息的页面展示,可不使用,第二个是数据源,在需要的地方注入即可使用。

package com.hurricane.app.file.server.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import com.hurricane.app.file.server.entity.User;

@Repository
public class UserDao {
	@Autowired
	private DruidDataSource dataSource;

	
	public User getUserById(int id) throws Exception{
		DruidPooledConnection connection = dataSource.getConnection();
		PreparedStatement prepareStatement = connection.prepareStatement("select * from user where id =  ?");
		prepareStatement.setInt(1, id);
		ResultSet executeQuery = prepareStatement.executeQuery();
		List<User> users = new ArrayList<User>();
		while (executeQuery.next()) {
			String username = executeQuery.getString("username");
			String password = executeQuery.getString("password");
			String desc = executeQuery.getString("description");
			User user  = new User();
			user.setUsername(username);
			user.setPassword(password);
			users.add(user);
		}
		executeQuery.close();
		if (users.size()>0) {
			return users.get(0);
		}
		return null;
	}

}

这种方式注入的数据源建立的连接会一直处于active状态,不知道怎么让连接池回收,解决方法待进一步学习。

springboot+mybatis+druid:

引入mybatis对springboot的支持依赖:

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>

Dao层接口:

package com.hurricane.app.file.server.dao;

import org.apache.ibatis.annotations.Mapper;

import com.hurricane.app.file.server.entity.User;

@Mapper
public interface UserDao {
	public User getUserById(int id);
}

映射文件src/main/resources/mapper/UserMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hurricane.app.file.server.dao.UserDao">


    <select id="getUserById" resultType="com.hurricane.app.file.server.entity.User">
        select * from user where id=#{id}
    </select>

</mapper>

application.properties的内容为:

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/temp?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver

# 连接池配置,下面配置说明请参考Druid Github Wiki,配置_DruidDataSource参考配置
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=20
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-wait=30000
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.validation-query-timeout=3000
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.time-between-eviction-runs-millis=6000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.max-evictable-idle-time-millis=600000
spring.datasource.druid.time-between-log-stats-millis=3000
# MyBatis 配置
mybatis.mapper-locations=classpath:mapper/*.xml

注意只是通过上面的properties文件,仅仅连接信息(url,username,password,driverClassName)可以正常传递到连接池,但是下面的通用配置无法传递到连接池,分别尝试了如下格式,均无法成功将属性注入:

spring.datasource.druid.max-active=20
spring.datasource.druid.maxActive=20
spring.datasource.maxActive=20
spring.datasource.max-active=20

参考druid官方提供的demo,将DruidDataSource进行一层封装,如下:

package com.hurricane.app.file.server.datasource;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;

import com.alibaba.druid.pool.DruidDataSource;

@ConfigurationProperties("spring.datasource.druid")
class DruidDataSourceWrapper extends DruidDataSource implements InitializingBean {
    @Autowired
    private DataSourceProperties basicProperties;

    @Override
    public void afterPropertiesSet() throws Exception {
        //if not found prefix 'spring.datasource.druid' jdbc properties ,'spring.datasource' prefix jdbc properties will be used.
    	System.out.println("============afterPropertiesSet============");
    	System.out.println(getUsername()+"---"+getPassword()+"---"+getUrl()+"---"+getDriverClassName());
    	if (super.getUsername() == null) {
            super.setUsername(basicProperties.determineUsername());
        }
        if (super.getPassword() == null) {
            super.setPassword(basicProperties.determinePassword());
        }
        if (super.getUrl() == null) {
            super.setUrl(basicProperties.determineUrl());
        }
        if(super.getDriverClassName() == null){
            super.setDriverClassName(basicProperties.getDriverClassName());
        }

    }

}

之后将spring.properties的文件配置数据源类型指定为封装过后的数据源:

spring.datasource.type=com.hurricane.app.file.server.datasource.DruidDataSourceWrapper

这样,数据源的其他配置属性就可以正常注入使用了。

参考:

        https://blog.csdn.net/u011244202/article/details/54709060(测试发现其中的数据源基本配置无法正常注入,解决方法见上面)

        https://github.com/alibaba/druid/wiki/

        http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/






猜你喜欢

转载自blog.csdn.net/hurricane_li/article/details/80049190
今日推荐