在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/