【Java教程】Day22-14 Spring框架:访问数据库—— JDBC

在本篇教程中,我们将继续探讨如何使用Spring框架简化JDBC操作,通过Spring的JdbcTemplate来访问关系型数据库。通过使用Spring的工具,我们不仅能减少冗余的代码,还能使数据库操作更加安全高效。

1. JDBC访问数据库的基本步骤

在Java中,使用JDBC接口访问数据库时,通常需要以下几个步骤:

  1. 创建数据源(DataSource):这是数据库连接池的核心,负责管理数据库连接。

  2. 获取数据库连接(Connection):从数据源中获取数据库连接。

  3. 执行SQL语句:使用PreparedStatement执行SQL语句。

    • 如果是查询操作,通过ResultSet读取数据。

    • 如果是修改操作,获取执行结果,通常是影响的行数。

  4. 释放资源:使用try...finally结构,确保正确释放数据库连接、PreparedStatementResultSet等资源。

  5. 事务管理:对于需要事务控制的操作,要注意事务的提交与回滚。

 

这些步骤在原生JDBC中需要手动管理,但是在Spring中,Spring提供了JdbcTemplate来简化这些操作。

2. 使用Spring简化JDBC操作

在Spring中,您可以通过依赖注入的方式创建并管理DataSourceJdbcTemplate实例,极大简化了JDBC的使用。

2.1 引入必要的Maven依赖

首先,我们需要创建一个Maven工程,并引入以下依赖:

xml<dependencies>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-context</artifactId>        <version>6.0.0</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-jdbc</artifactId>        <version>6.0.0</version>    </dependency>    <dependency>        <groupId>jakarta.annotation</groupId>        <artifactId>jakarta.annotation-api</artifactId>        <version>2.1.1</version>    </dependency>    <dependency>        <groupId>com.zaxxer</groupId>        <artifactId>HikariCP</artifactId>        <version>5.0.1</version>    </dependency>    <dependency>        <groupId>org.hsqldb</groupId>        <artifactId>hsqldb</artifactId>        <version>2.7.1</version>    </dependency></dependencies>

 

2.2 创建配置类

通过Spring的配置类,我们可以配置数据源DataSourceJdbcTemplate


 
java@Configuration@ComponentScan@PropertySource("jdbc.properties")public class AppConfig {    @Value("${jdbc.url}")    String jdbcUrl;    @Value("${jdbc.username}")    String jdbcUsername;    @Value("${jdbc.password}")    String jdbcPassword;    @Bean    public DataSource createDataSource() {        HikariConfig config = new HikariConfig();        config.setJdbcUrl(jdbcUrl);        config.setUsername(jdbcUsername);        config.setPassword(jdbcPassword);        config.addDataSourceProperty("autoCommit", "true");        config.addDataSourceProperty("connectionTimeout", "5");        config.addDataSourceProperty("idleTimeout", "60");        return new HikariDataSource(config);    }    @Bean    public JdbcTemplate createJdbcTemplate(@Autowired DataSource dataSource) {        return new JdbcTemplate(dataSource);    }}

 

在上面的代码中:

  • 通过@PropertySource注解加载数据库配置文件jdbc.properties

  • 使用@Value注解注入数据库连接的相关配置。

  • 配置DataSource(这里使用HikariCP作为数据库连接池)。

  • 创建JdbcTemplate实例并注入DataSource

2.3 配置数据库文件

我们还需要一个配置文件jdbc.properties来指定数据库的连接信息:


 

 

propertiesjdbc.url=jdbc:hsqldb:file:testdbjdbc.username=sajdbc.password=

 

2.4 数据库初始化

我们可以在Spring容器启动时,自动创建数据库表。下面是一个初始化数据库表的示例:


 

 

java@Componentpublic class DatabaseInitializer {    @Autowired    JdbcTemplate jdbcTemplate;    @PostConstruct    public void init() {        jdbcTemplate.update("CREATE TABLE IF NOT EXISTS users (" //                + "id BIGINT IDENTITY NOT NULL PRIMARY KEY, " //                + "email VARCHAR(100) NOT NULL, " //                + "password VARCHAR(100) NOT NULL, " //                + "name VARCHAR(100) NOT NULL, " //                + "UNIQUE (email))");    } }

 

 

2.5 访问数据库

通过注入JdbcTemplate,我们可以轻松进行数据库操作,例如查询和更新。

示例1:查询用户


 

 

java@Componentpublic class UserService {    @Autowired    JdbcTemplate jdbcTemplate;    public User getUserById(long id) {        return jdbcTemplate.execute((Connection conn) -> {            try (var ps = conn.prepareStatement("SELECT * FROM users WHERE id = ?")) {                ps.setObject(1, id);                try (var rs = ps.executeQuery()) {                    if (rs.next()) {                        return new User(rs.getLong("id"), rs.getString("email"), rs.getString("password"), rs.getString("name"));                    }                    throw new RuntimeException("User not found");                }            }        });    }}

 

示例2:查询用户(使用RowMapper


 

 

javapublic User getUserByEmail(String email) {    return jdbcTemplate.queryForObject("SELECT * FROM users WHERE email = ?",        (ResultSet rs, int rowNum) -> new User(            rs.getLong("id"),            rs.getString("email"),            rs.getString("password"),            rs.getString("name")        ),        email);}

 

2.6 更新数据

对于插入、更新和删除操作,Spring的JdbcTemplate也提供了便捷的封装方法。


 
javapublic void updateUser(User user) {    if (1 != jdbcTemplate.update("UPDATE users SET name = ? WHERE id = ?", user.getName(), user.getId())) {        throw new RuntimeException("User not found");    }}

 

2.7 插入数据并获取自增值


 

 

javapublic User register(String email, String password, String name) {    KeyHolder holder = new GeneratedKeyHolder();    jdbcTemplate.update(        (conn) -> {            var ps = conn.prepareStatement("INSERT INTO users(email, password, name) VALUES(?, ?, ?)",                    Statement.RETURN_GENERATED_KEYS);            ps.setObject(1, email);            ps.setObject(2, password);            ps.setObject(3, name);            return ps;        },        holder    );    return new User(holder.getKey().longValue(), email, password, name);}

 

3. 总结

在本节教程中,我们通过Spring的JdbcTemplate来简化JDBC操作,避免了手动管理数据库连接、PreparedStatementResultSet等繁琐的代码。使用JdbcTemplate的主要优点是:

  • 提供了一些高级方法来简化查询和更新操作。

  • 使用RowMapper实现JDBC结果集到Java对象的转换。

  • 可以自动处理连接池和事务。

 

无论是简单查询,还是复杂的数据库操作,JdbcTemplate都提供了优雅的解决方案。在实际项目中,我们可以根据业务需求选择合适的查询方法,并使用Spring提供的JdbcTemplate来简化JDBC操作。

练习

通过实际操作JdbcTemplate,加深对数据库操作的理解,并尝试修改和扩展示例代码,以实现更多的数据库操作功能。

希望本篇教程对你有所帮助,欢迎继续关注后续的Spring框架系列教程。

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值