SpringBoot数据访问自定义使用Druid数据源的方法

下面是完整攻略:

1. 什么是Druid数据源

Druid是阿里巴巴开源的数据库连接池,也是一个数据源的实现类,它集成了多个功能,包括连接池、应用层监控、SQL监控、防御SQL注入攻击、分布式调用链、日志等,被广泛应用于互联网企业的数据连接使用场景。Druid更详细的介绍可以参考其官方文档 https://github.com/alibaba/druid

2. SpringBoot数据访问使用Druid数据源的方法

在SpringBoot中,我们可以通过注入Druid数据源来实现对其的使用,具体方式如下:

  1. 首先,在Maven的依赖中添加Druid数据源的依赖:
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.23</version>
</dependency>
  1. 在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: #此处省略不完全
  1. 在数据库操作类中注入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操作进行演示。

  1. 创建一个SpringBoot项目
  2. 添加Druid的依赖
  3. 添加数据库连接配置信息到src/main/resources/application.yml或application.properties
  4. 创建一个用户数据表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');
  1. 创建一个数据库操作类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;
    }
}
  1. 创建一个服务类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;
    }
}
  1. 创建一个Controller类UserController,并提供响应用户列表信息的接口
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/list")
    public List<User> userList() {
        return userService.getAll();
    }
}
  1. 启动程序,访问 http://localhost:8080/user/list,可以看到控制台中输出了数据库查询用户信息的日志,页面上显示用户信息

以上是一个基础的CRUD操作服务示例,其中的业务、接口实现等都可以根据自己的需求进行扩展和调整。

示例2

以下是另一个示例,将Druid数据源应用于多数据源配置中。

假设我们的应用程序需要访问两个不同的数据库,我们可以在SpringBoot应用程序中配置多个Druid数据源来满足需求。

在配置多数据源时,需要用到Spring中的@Bean注解,因为Spring的依赖注入只会在同一个ApplicationContext中起作用,因此我们需要通过@Bean注解声明两个Druid数据库连接池,为其创建两个Spring的ApplicationContext,分别在不同的数据源上运行。

  1. 创建一个SpringBoot项目
  2. 添加Druid的依赖
  3. 配置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
  1. 创建两个数据源的配置类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();
    }
}
  1. 创建两个数据表对应的数据库操作类
@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;
    }
}
  1. 创建两个服务类,并注入对应的数据库操作类
@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;
    }
}
  1. 创建两个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();
    }
}
  1. 启动程序,分别访问 http://localhost:8080/user/listhttp://localhost:8080/order/list,可以看到控制台中输出了两次数据库查询信息和日志,页面上分别显示了两个数据表的内容。

以上是一个基础的多数据源操作示例,其中的业务、接口实现等都可以根据自己的需求进行扩展和调整。同时在实际使用中可能还需要添加更多的Druid数据源配置和数据操作实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot数据访问自定义使用Druid数据源的方法 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 基于Spring Boot的Environment源码理解实现分散配置详解

    基于Spring Boot的Environment源码理解实现分散配置详解 什么是分散配置 分散配置(Decentralized Configuration)是指将应用程序的配置从中心化的配置中心中分发到多个不同的配置文件中,并在应用程序部署时进行组合。这种方式可以提高应用程序的可维护性和灵活性。Spring Boot提供了多种实现分散配置的方式,其中Env…

    Java 2023年5月19日
    00
  • Spring框架web项目实战全代码分享

    下面是我对于“Spring框架web项目实战全代码分享”的完整攻略: 概述 Spring框架是目前业界最流行的开源框架之一,提供了很多方便开发的工具与组件,使得开发者可以更加快速地构建企业级应用程序。本攻略将分享一个基于Spring框架的web项目实战全代码,并且提供具体的步骤与示例来帮助读者更好地理解和运用Spring框架进行web项目开发。 环境搭建 在…

    Java 2023年5月19日
    00
  • Java对称加密算法DES实例详解

    Java对称加密算法DES实例详解 什么是对称加密算法 对称加密算法:使用相同的密钥进行加密和解密。对称加密算法的加密速度快,但密钥的管理和分配比较困难。 什么是DES加密算法 DES(Data Encryption Standard)是一种数据加密的标准,它是一种对称加密算法,使用密钥对数据进行加密和解密。DES算法已广泛应用于各种安全领域,如金融、电子政…

    Java 2023年5月19日
    00
  • 解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理

    SpringMVC是一款非常优秀的JavaWeb框架,但是在返回Java8时间JSON数据时,常会遇到一些格式化上的问题。为了解决这些问题,我们需要采用一些特殊的方式来处理。本文将提供两种常见的解决方案。 解决方案1:使用@JsonFormat注解 在我们的Java实体类中,可以使用@JsonFormat注解进行配置。该注解可以控制Java8时间的序列化或者…

    Java 2023年5月20日
    00
  • SpringBoot实现阿里云短信发送的示例代码

    下面是详细讲解“SpringBoot实现阿里云短信发送的示例代码”的完整攻略,包含示例说明: 1. 注册阿里云短信服务 首先需要在阿里云官网上注册一个账号,进入控制台后选择开通短信服务。 开通短信服务后,获取AccessKey ID和AccessKey Secret。 2. 添加阿里云短信依赖 在SpringBoot项目中,使用Maven或Gradle添加阿…

    Java 2023年5月26日
    00
  • javascript中负数算术右移、逻辑右移的奥秘探索

    JavaScript中负数算术右移、逻辑右移的奥秘探索 1. 什么是右移运算符 在 JavaScript 中,右移运算符由三个大于号(>>>),两个大于号(>>) 和一个小于号(<<)组成。右移运算符可以对二进制数进行运算,将其向右移动指定的位数。右移运算符在常见的开发中并不常用,但是在某些场景下会非常有用。 1.1…

    Java 2023年6月15日
    00
  • java中对象调用成员变量与成员实例方法

    Java 中,对象调用成员变量和成员实例方法的过程是通过对象的引用来实现的。下面是完整的攻略: 对象调用成员变量 首先需要创建一个对象的实例,即对象的地址,然后通过对象的引用来调用成员变量。Java 中的成员变量可以分为类变量和实例变量。对于类变量,直接使用类名来调用即可。对于实例变量,则必须使用对象的引用来调用。 调用类变量 调用类变量可以直接使用类名,例…

    Java 2023年5月26日
    00
  • 详解spring security之httpSecurity使用示例

    针对“详解spring security之httpSecurity使用示例”的完整攻略,我分别从以下几个方面进行详细说明。 1. httpSecurity的基本介绍 首先,httpSecurity是Spring Security用于定义Web安全性的Java配置对象,其主要作用是用于配置Web应用程序的安全性,包括登录认证、授权访问、页面跳转等功能。 在使用…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部