下面是完整攻略:
1. 什么是Druid数据源
Druid是阿里巴巴开源的数据库连接池,也是一个数据源的实现类,它集成了多个功能,包括连接池、应用层监控、SQL监控、防御SQL注入攻击、分布式调用链、日志等,被广泛应用于互联网企业的数据连接使用场景。Druid更详细的介绍可以参考其官方文档 https://github.com/alibaba/druid。
2. SpringBoot数据访问使用Druid数据源的方法
在SpringBoot中,我们可以通过注入Druid数据源来实现对其的使用,具体方式如下:
- 首先,在Maven的依赖中添加Druid数据源的依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
- 在application.yml或application.properties文件中添加Druid数据源的配置信息:
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: 123456
druid:
initial-size: 1
max-active: 20
min-idle: 1
max-wait: 60000
filters: stat,wall,log4j
connection-properties: #此处省略不完全
- 在数据库操作类中注入Druid数据源,并使用该数据源进行数据库连接和操作:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private DruidDataSource dataSource;
//...
private Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public User findByUserName(String userName) {
User user = null;
Connection conn = getConnection();
PreparedStatement ps;
ResultSet rs;
try {
ps = conn.prepareStatement("select * from user where user_name=?");
ps.setString(1, userName);
rs = ps.executeQuery();
if (rs.next()) {
user = new User();
user.setUserId(rs.getLong("user_id"));
user.setUserName(rs.getString("user_name"));
user.setUserPwd(rs.getString("user_pwd"));
user.setUserEmail(rs.getString("user_email"));
user.setUserPhone(rs.getString("user_phone"));
}
rs.close();
ps.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return user;
}
//...
}
3. 示例
由于数据源的配置和使用都是在SpringBoot的上下文环境中进行的,因此我们可以在SpringBoot框架下快速实现一个基础的CRUD操作服务,以下我们通过创建一个显示用户列表信息的Web应用程序,对Druid作为数据源的CRUD操作进行演示。
- 创建一个SpringBoot项目
- 添加Druid的依赖
- 添加数据库连接配置信息到src/main/resources/application.yml或application.properties
- 创建一个用户数据表user,并插入一些数据,SQL如下:
CREATE TABLE `user` (
`user_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`user_name` VARCHAR(20) NOT NULL COMMENT '用户名',
`user_pwd` VARCHAR(32) NOT NULL COMMENT '用户密码',
`user_email` VARCHAR(50) NOT NULL COMMENT '用户邮箱',
`user_phone` VARCHAR(20) NOT NULL COMMENT '用户手机号',
PRIMARY KEY (`user_id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8MB4 COLLATE=UTF8MB4_UNICODE_CI COMMENT='用户表';
INSERT INTO `user`(`user_name`,`user_pwd`,`user_email`,`user_phone`) VALUES ('zhangsan','123456','zhangsan@126.com','18888888888'),('lisi','123456','lisi@126.com','18999999999'),('wangwu','123456','wangwu@qq.com','13333333333');
- 创建一个数据库操作类UserDao:
@Repository
public class UserDao {
@Autowired
private DataSource dataSource;
private Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
public List<User> findAll() throws SQLException {
Connection conn = getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
List<User> userList = new ArrayList<User>();
try {
ps = conn.prepareStatement("SELECT * FROM user");
rs = ps.executeQuery();
while (rs.next()) {
User user = new User();
user.setUserId(rs.getInt("user_id"));
user.setUserName(rs.getString("user_name"));
user.setUserPwd(rs.getString("user_pwd"));
user.setUserEmail(rs.getString("user_email"));
user.setUserPhone(rs.getString("user_phone"));
userList.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
rs.close();
ps.close();
conn.close();
}
return userList;
}
}
- 创建一个服务类UserServiceImpl并注入数据库操作类UserDao,并提供查询所有用户的接口:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<User> getAll() {
try {
return userDao.findAll();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
- 创建一个Controller类UserController,并提供响应用户列表信息的接口
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/list")
public List<User> userList() {
return userService.getAll();
}
}
- 启动程序,访问
http://localhost:8080/user/list
,可以看到控制台中输出了数据库查询用户信息的日志,页面上显示用户信息
以上是一个基础的CRUD操作服务示例,其中的业务、接口实现等都可以根据自己的需求进行扩展和调整。
示例2
以下是另一个示例,将Druid数据源应用于多数据源配置中。
假设我们的应用程序需要访问两个不同的数据库,我们可以在SpringBoot应用程序中配置多个Druid数据源来满足需求。
在配置多数据源时,需要用到Spring中的@Bean
注解,因为Spring的依赖注入只会在同一个ApplicationContext中起作用,因此我们需要通过@Bean
注解声明两个Druid数据库连接池,为其创建两个Spring的ApplicationContext,分别在不同的数据源上运行。
- 创建一个SpringBoot项目
- 添加Druid的依赖
- 配置application.yml或application.properties文件
#master数据源配置
spring:
datasource:
master:
type: com.alibaba.druid.pool.DruidDataSource
druid:
url: jdbc:mysql://localhost:3306/db_master?useUnicode=true&characterEncoding=UTF-8
username: root
password: root
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
#slave数据源配置
slave:
type: com.alibaba.druid.pool.DruidDataSource
druid:
url: jdbc:mysql://localhost:3306/db_slave?useUnicode=true&characterEncoding=UTF-8
username: root
password: root
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
- 创建两个数据源的配置类MasterDataSourceConfig和SlaveDataSourceConfig,并提供DruidDataSource实例
@Configuration
public class MasterDataSourceConfig {
@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.master")
public DruidDataSource masterDataSource() {
return new DruidDataSource();
}
}
@Configuration
public class SlaveDataSourceConfig {
@Bean(name = "slaveDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DruidDataSource slaveDataSource() {
return new DruidDataSource();
}
}
- 创建两个数据表对应的数据库操作类
@Repository
public class UserDao {
@Autowired
private DataSource dataSource;
private Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
public List<User> findAll() throws SQLException {
Connection conn = getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
List<User> userList = new ArrayList<User>();
try {
ps = conn.prepareStatement("SELECT * FROM user");
rs = ps.executeQuery();
while (rs.next()) {
User user = new User();
user.setUserId(rs.getInt("user_id"));
user.setUserName(rs.getString("user_name"));
user.setUserPwd(rs.getString("user_pwd"));
user.setUserEmail(rs.getString("user_email"));
user.setUserPhone(rs.getString("user_phone"));
userList.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
rs.close();
ps.close();
conn.close();
}
return userList;
}
}
@Repository
public class OrderDao {
@Autowired
@Qualifier("slaveDataSource")
private DataSource dataSource;
private Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
public List<Order> findAll() throws SQLException {
Connection conn = getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
List<Order> orderList = new ArrayList<Order>();
try {
ps = conn.prepareStatement("SELECT * FROM order");
rs = ps.executeQuery();
while (rs.next()) {
Order order = new Order();
order.setOrderId(rs.getInt("order_id"));
order.setOrderNo(rs.getString("order_no"));
order.setOrderAmount(rs.getBigDecimal("order_amount"));
order.setUserId(rs.getInt("user_id"));
order.setCreateTime(rs.getDate("create_time"));
orderList.add(order);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
rs.close();
ps.close();
conn.close();
}
return orderList;
}
}
- 创建两个服务类,并注入对应的数据库操作类
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<User> getAll() {
try {
return userDao.findAll();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderDao orderDao;
@Override
public List<Order> getAll() {
try {
return orderDao.findAll();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
- 创建两个Controller类,并提供对应的接口
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/list")
public List<User> userList() {
return userService.getAll();
}
}
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("/list")
public List<Order> userList() {
return orderService.getAll();
}
}
- 启动程序,分别访问
http://localhost:8080/user/list
及http://localhost:8080/order/list
,可以看到控制台中输出了两次数据库查询信息和日志,页面上分别显示了两个数据表的内容。
以上是一个基础的多数据源操作示例,其中的业务、接口实现等都可以根据自己的需求进行扩展和调整。同时在实际使用中可能还需要添加更多的Druid数据源配置和数据操作实现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot数据访问自定义使用Druid数据源的方法 - Python技术站