SpringBoot中怎么利用JDBC对数据库进行操作

发布时间:2021-06-15 14:23:23 作者:Leah
来源:亿速云 阅读:279

这篇文章将为大家详细讲解有关SpringBoot中怎么利用JDBC对数据库进行操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一、JDBC简介

JDBC(Java Data Base Connectivity,Java 数据库连接),说白了 JDBC 就是一套 Java 访问数据库的 API 规范;Spring Boot 支持了主流的 ORM 框架:MyBatis、Hibernate 和 Spring JDBC,几种 ORM 在不同的场景下各有优势,在 Spring Boot 体系内都有对应的 Starter 包以方便集成

try {
    // 1、加载数据库驱动
    Class.forName(driver);
    // 2、获取数据库连接
    conn = DriverManager.getConnection(url, username, password);
    // 3、获取数据库操作对象
    stmt = conn.createStatement();
    // 4、定义操作的 SQL 语句
    String sql = "select * from user where id = 6";
    // 5、执行数据库操作
    rs = stmt.executeQuery(sql);
    // 6、获取并操作结果集
    while (rs.next()) {
    // 解析结果集
    }
} catch (Exception e) {
    // 日志信息
} finally {
    // 7、关闭资源
}

通过上面的示例可以看出直接使用 JDBC 来操作数据库比较复杂,因此后期在 JDBC 的基础上又发展出了很多著名的 ORM 框架,其中最为流行的是 Hibernate、MyBatis 和 Spring JDBC,这里主要了解一下 Spring JDBC 在 Spring Boot 中的使用

二、单数据源操作示例

Spring Boot 集成 JDBC 很简单,需要引入依赖并做基础配置即可,在开发项目之前需要先创建表,作为项目演示使用。设计一个 User 用户表,有 id、name、password、age 等字段,对应的 SQL 脚本如下:

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `name` varchar(32) DEFAULT NULL COMMENT '用户名',
  `password` varchar(32) DEFAULT NULL COMMENT '密码',
  `age`  int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  1. 添加配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

SpringBoot中怎么利用JDBC对数据库进行操作

SpringBoot中怎么利用JDBC对数据库进行操作

spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

值得注意的是,在 Spring Boot 2.1.0 中,com.mysql.jdbc.Driver 已经过期,推荐使用 com.mysql.cj.jdbc.Driver。

  1. 实体类

public class User  {
    private Long id;
    private String name;
    private String password;
    private int age;

    public User(String name, String password, int age) {
        this.name = name;
        this.password = password;
        this.age = age;
    }
    // 省略 getter setter
}
  1. 封装 Repository

public interface UserRepository  {
    int save(User user);
    int update(User user);
    int delete(long id);
    List<User> findALL();
    User findById(long id);
}
@Repository
public class UserRepositoryImpl implements UserRepository {
    @Autowired
    private JdbcTemplate jdbcTemplate;
}
@Override
public int save(User user) {
    return jdbcTemplate.update("INSERT INTO users(name, password, age) values(?, ?, ?)",
          user.getName(), user.getPassword(), user.getAge());
}

@Override
public int update(User user) {
    return jdbcTemplate.update("UPDATE users SET name = ? , password = ? , age = ? WHERE id=?",
           user.getName(), user.getPassword(), user.getAge(), user.getId());
}

@Override
public int delete(long id) {
    return jdbcTemplate.update("DELETE FROM users where id = ? ",id);
}

@Override
public User findById(long id) {
    return jdbcTemplate.queryForObject("SELECT * FROM users WHERE id=?", new Object[] { id }, new BeanPropertyRowMapper<User>(User.class));
}

@Override
public List<User> findALL() {
    return jdbcTemplate.query("SELECT * FROM users", new UserRowMapper());
    // return jdbcTemplate.query("SELECT * FROM users", new BeanPropertyRowMapper(User.class));
}

这里使用了 new BeanPropertyRowMapper<User>(User.class) 对返回的数据进行封装,它可自动将一行数据映射到指定类的实例中,首先将这个类实例化,然后通过名称匹配的方式,映射到属性中去。

findALL() 使用了一个新的方式来封装结果集的返回,创建一个内部类 UserRowMapper。 UserRowMapper 继承了 RowMapper,RowMapper 可以将数据中的每一行数据封装成用户定义的类,实现 RowMapper 接口覆盖 mapRow 方法,在 mapRow 方法封装对数据的返回处理。通过上面代码可以看出 UserRowMapper 循环遍历了查询返回的结果集,遍历的同时按照属性进行赋值。这样在查询使用时只需要传入 new UserRowMapper() 即可自动解析返回数据。

class UserRowMapper implements RowMapper<User> {
    @Override
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        User user = new User();
        user.setId(rs.getLong("id"));
        user.setName(rs.getString("name"));
        user.setPassword(rs.getString("password"));
        user.setAge(rs.getInt("age"));
    }
}
  1. 测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTests {
    @Autowired
    private UserRepository userRepository;
}

//测试插入数据,直接调用 userRepository 对应的 save 方法
@Test
public void testSave() {
    User user =new User("neo","123456",30);
    userRepository.save(user);
}

//按照上面方式分别测试其他方法...

三、多数据源的使用

在项目中使用多个数据源是很常见的情况,Spring Boot 中多数据源的使用需要自行封装。我们在上面示例项目的基础上进行改造。

  1. 配置文件

spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
  1. 初始化 JDBC

@Configuration
public class DataSourceConfig {
    @Primary
    @Bean(name = "primaryDataSource")
    @Qualifier("primaryDataSource")
    @ConfigurationProperties(prefix="spring.datasource.primary")
    public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryDataSource")
    @Qualifier("secondaryDataSource")
    @ConfigurationProperties(prefix="spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name="primaryJdbcTemplate")
    public JdbcTemplate primaryJdbcTemplate (
        @Qualifier("primaryDataSource")  DataSource dataSource ) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name="secondaryJdbcTemplate")
    public JdbcTemplate  secondaryJdbcTemplate(
            @Qualifier("secondaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

这段代码表示在启动的时候根据特定的前缀加载不同的数据源,根据构建好的数据源再创建不同的 JDBC。

  1. UserRepository 改造

@Repository
public class UserRepositoryImpl implements UserRepository {
    @Autowired
    private JdbcTemplate primaryJdbcTemplate;

    @Override
    public int save(User user,JdbcTemplate jdbcTemplate) {
        if(jdbcTemplate == null){
            jdbcTemplate= primaryJdbcTemplate;
        }
        return jdbcTemplate.update("INSERT INTO users(name, password, age) values(?, ?, ?)",
              user.getName(), user.getPassword(), user.getAge());
    }

  //其他方法省略,详细内容可以查看源码
}
  1. 多数据源测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTests {
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private JdbcTemplate primaryJdbcTemplate;
    @Autowired
    private JdbcTemplate secondaryJdbcTemplate;

    @Test
    public void testSave() {
        User user =new User("smile","123456",30);
        userRepository.save(user,primaryJdbcTemplate);
        userRepository.save(user,secondaryJdbcTemplate);
    }
}

执行 testSave() 成功后,登录 test1 和 test 2 数据库查看 user 表,都存在一条 name 为 smile 的用户信息,说明多数据源插入数据成功,其他方法的测试大体相同。这样在项目中,我们想使用哪个数据源操作数据库时,只需要传入数据源对应的 JdbcTemplate 实例即可。

关于SpringBoot中怎么利用JDBC对数据库进行操作就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

推荐阅读:
  1. 怎么在SpringBoot中利用MybatisSQL对@Intercepts进行过滤
  2. 利用springboot怎么对属性进行定义

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jdbc spring boot

上一篇:jQuery无冲突模式的示例分析

下一篇:jquery层次选择器的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》