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日

相关文章

  • Java超详细透彻讲解static

    Java超详细透彻讲解static 什么是static 在Java中,static关键字可以用来修饰变量、方法和代码块,它表示这个成员在类中只有一份,不需要创建实例就能访问。也可以说,static修饰的成员属于类本身而不属于对象。 static变量 static变量是在类中使用static关键字来修饰的变量,它是类共享的,对于该类的所有对象来说,static…

    Java 2023年5月26日
    00
  • 详解java 对象锁与类锁

    我们来详细讲解一下 Java 对象锁和类锁。 什么是对象锁? 在 Java 中,每一个对象都有一个锁,也就是监视器锁(Monitor Lock)。当一个线程访问某个对象的 synchronized 方法或 synchronized 块时,这个线程会试图获得这个对象的锁。获得对象锁后,这个线程才能进入 synchronized 方法或 synchronized…

    Java 2023年5月26日
    00
  • Atomic类的作用是什么?

    Atomic类是Java中原子性操作的一个封装类,可以用于无锁操作,避免多线程竞争问题。它提供了一组原子操作,具有以下三个特征:原子性、有序性和线程安全性。Atomic类对于高并发场景下的数据修改操作具有很大的帮助作用,可以提高程序的性能和稳定性。 在使用Atomic类时,常见的操作包括get获取当前值、set设置新值、compareAndSet(预期值,更…

    Java 2023年5月10日
    00
  • Mac配置 maven以及环境变量设置方式

    下面是具体操作步骤: 安装Maven 打开官方网站 (https://maven.apache.org/),进入下载页面。 下载最新版本的Maven,选择Binary Zip Archive 中的zip文件进行下载并解压。 将解压后的Maven目录移动到您喜欢的位置,例如 /usr/local/maven。 打开终端,进入Maven安装目录的bin目录,运行…

    Java 2023年5月19日
    00
  • jquery 隐藏与显示tr标签示例代码

    下面是关于jQuery隐藏与显示<tr>标签的攻略。 前置要求 在使用本教程前,需要确保您已经了解以下内容: HTML基础 CSS基础 jQuery基础 操作步骤 方法一:使用隐藏和显示方法 在jQuery中,可以使用hide()方法隐藏元素,show()方法显示元素。将这两个方法应用于<tr>标签,即可实现隐藏和显示<tr&g…

    Java 2023年6月16日
    00
  • 解决spring-boot 打成jar包后 启动时指定参数无效的问题

    当使用Spring Boot打成JAR包后,有时候需要在启动时指定参数来配置应用程序。但是有时候会遇到启动时指定的参数无效的问题,这时候需要按照以下步骤来解决这个问题: 1.在application.properties文件中配置参数 Spring Boot的配置文件默认是application.properties,我们可以在这个文件中配置应用程序需要的参…

    Java 2023年5月19日
    00
  • SpringMVC 如何使用注解完成登录拦截

    在SpringMVC中,我们可以使用注解来完成登录拦截。本文将详细介绍如何使用注解完成登录拦截,并提供两个示例说明。 实现步骤 步骤一:添加依赖 首先,我们需要在项目中添加Spring Security的依赖。可以通过以下方式添加: <dependency> <groupId>org.springframework.security&…

    Java 2023年5月17日
    00
  • java开发之MD5加密算法的实现

    Java开发之MD5加密算法的实现 简介 MD5是一种常用的加密算法,Java中可以通过MessageDigest类实现MD5加密。本攻略将介绍如何在Java中使用MessageDigest类实现MD5加密。 实现过程 1. 获取MessageDigest对象 使用MessageDigest类的getInstance方法获取MessageDigest对象,并…

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