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日

相关文章

  • SpringSecurity自定义登录成功处理

    Spring Security是一个基于Spring框架的安全框架,它提供了一系列的安全服务,包括身份验证、授权、攻击防护等。在Spring Security中,我们可以自定义登录成功处理来实现自定义的登录成功逻辑。在本文中,我们将详细讲解Spring Security自定义登录成功处理的完整攻略。 自定义登录成功处理 在Spring Security中,我…

    Java 2023年5月18日
    00
  • Java生成CSV文件实例详解

    Java生成CSV文件实例详解 什么是CSV文件 CSV (Comma Separated Values),即逗号分隔值文件,是一种纯文本文件,其中数据由单个逗号分隔,用于存储数据表类数据。通常,第一行包含列标题。CSV文件可以在各种软件程序(如Microsoft Excel)之间轻松共享。使用Java程序可以轻松生成CSV文件。 使用Java生成CSV文件…

    Java 2023年5月20日
    00
  • Java序列化常见实现方法代码实例

    Java序列化常见实现方法代码实例 Java序列化是将Java对象转化为字节流的过程,方便进行Java对象在网络中的传输或者持久化储存。本文将介绍Java序列化的常见实现方法以及代码实例。 Java序列化实现方法 Serializable接口 Java的原生序列化实现采用Serializable接口,它是Java提供的一个标记接口,将一个类实现Seriali…

    Java 2023年5月23日
    00
  • 一起来了解Java的File类和IO流

    一起来了解Java的File类和IO流 File类 Java中的File类是一个用于操作文件和目录的类。使用File类可以实现文件的创建、删除、重命名、遍历等操作。File类的构造函数可以传入一个文件路径字符串或者一个URI,用于表示文件或者目录的路径。下面是一些常用的File类的操作示例: 创建和删除文件 File file = new File(&quo…

    Java 2023年5月19日
    00
  • 关于Java中Json的各种处理

    Java中Json的处理攻略 Json是什么? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。JSON格式可以用来描述“键值对”(key-value)类别的数据,通常用于Web服务与Web程序之间的数据交换。 Java中Json的处理方法 1. 使用JSON库 Java中有很多处理JSON的库,比如Gson、Ja…

    Java 2023年5月26日
    00
  • 浅谈Spring学习之request,session与globalSession作用域

    浅谈Spring学习之request,session与globalSession作用域 1. 介绍 在 Spring 中,我们可以通过 request、session 和 globalSession 三种作用域来存储数据。这些作用域的范围从小到大逐级升高,对应的生命周期也逐级递增,具体的介绍如下: request:处理一次请求的过程中有效,即发送一次请求到服…

    Java 2023年6月15日
    00
  • SpringBoot yaml语法与JRS303校验超详细讲解

    下面我就给你介绍一下Spring Boot中的yaml语法和JRS303校验的全面攻略。 一、Spring Boot yaml语法 1.1 简介 在Spring Boot项目中,我们可以通过yaml语法来配置项目相关信息。yaml是一种人类可读的数据序列化格式,而且在Spring Boot中默认使用了yaml作为配置文件的语法。相比于xml和properti…

    Java 2023年5月19日
    00
  • java实现的n*n矩阵求值及求逆矩阵算法示例

    1. 求矩阵的值 求n*n矩阵的值,需要使用行列式的计算方法,具体算法如下: 当矩阵为1*1时,其值即为该矩阵中的元素。 当矩阵为22时,其值为:a[1][1]a[2][2]-a[1][2]*a[2][1]。 当矩阵为n*n时,其值为:按矩阵的第一行、第一列、第二行、第二列等开始,按矩阵的行列式展开来求得。 具体来说,可以使用递归算法来求解矩阵的行列式。递归…

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