Java Spring开发记(二):JDBC与数据库的访问

Spring Framework

一种开发Java应用的框架

JDBC与数据库的访问

Spring提供了一个JdbcTemplate模式,可以让我们更方便地操作JDBC而无需手动处理繁琐的异常。通常情况下,我们会手动实例化一个JdbcTemplate类。首先,需要在AppConfig中创建必要的Bean并将JdbcTemplate实例化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Configuration
@ComponentScan
@PropertySource("jdbc.properties")
public class AppConfig {
@Value("${jdbc.url}")
String jdbcUrl;
@Value("${jdbc.username}")
String jdbcUsername;
@Value("${jdbc.password}")
String jdbcPassword;

@Bean
DataSource createDataSource() {
HikariConfig cfg = new HikariConfig();
cfg.setJdbcUrl(jdbcUrl);
cfg.setUsername(jdbcUsername);
cfg.setPassword(jdbcPassword);
cfg.addDataSourceProperty("autoCommit", "true");
cfg.setDriverClassName("com.mysql.cj.jdbc.Driver");
return new HikariDataSource(cfg);
}

@Bean
@Autowired
JdbcTemplate createJdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}

对应的jdbc.properties文件:

1
2
3
4
# jdbc configuration:
jdbc.url=jdbc:mysql://localhost/db
jdbc.username=root
jdbc.password=root

对于未初始化的数据库,可以在程序开始执行时进行初始化,仍然定义一个Bean类,在需要执行初始化任务的函数前标上@PostConstruct注解。

JdbcTemplate提供了若干种查询数据库的方法,以便不同层次的使用。

首先是execute()方法,它有两种调用方式。第一种是传入Connection,第二种是传入PreparedStatement。它们均需要传入匿名函数作为处理过程,允许返回任意Objact类型。

其次是queryForObject()方法。该方法仅需要传入一个执行语句、一个ResultSet的引用和执行语句对应的参数,返回的内容会以ResultSet的格式呈现。该方法只能返回一个对象,其格式可以是任意的,不必为JavaBean。

比如我们定义了一个User类,即可通过此方法从用户的ID提取出用户信息。

1
2
3
4
5
6
7
8
9
10
public User getUserByID(long id) {
return jdbcTemplate.queryForObject("select * from users where id=?",
(ResultSet rs,int rowNum)-> {
return new User(
rs.getLong("id"),
rs.getString("name")),
rs.getString("password");
},
id);
}

如果需要以List形式返回多条记录,可以使用query()方法,用法和queryForObject()方法大致相同。

1
2
3
4
5
public List<User> getUsers(int page) {
int offset=100*(page-1);
return jdbcTemplate.query("select * from users limit ? offset ?",
new BeanPropertyRowMapper<>(User.class),limit,offset);
}

如果执行新增/修改/删除等操作,则需使用update()方法,调用方式与query()方法一致,返回值为1代表成功完成。

使用事务

有时候在执行一系列语句时,需要保证各条语句均成功执行,否则就执行回滚。为了保持数据的一致性,SQL引入了“事务”的概念。

Spring框架提供了方便的事务处理功能,仅需要通过几个注解即可实现数据操作一致性的约束。

在配置类AppConfig前,添加一个@EnableTransactionManagement注解,以启用声明式事务。

同时,在需要执行SQL语句的函数前,添加@Transactional注解,以启用该函数内对数据库操作的事务一致性。

默认情况下,一个函数中对数据库进行的全部操作均属于同一个事务,且当遇到抛出异常的时候,Spring会自动回滚当前函数及其调用链中全部函数对数据库进行的操作,前提是这些函数均标有@Transactional注解。

使用DAO层

DAO(Data Access Object),即数据访问层。当进行一个复杂的数据层面的操作的时候,直接将数据库查询和修改的操作嵌入服务层会使整个程序的逻辑变得复杂而难以维护。

Spring提供了一个JdbcDaoSupport抽象类,用于简化实现DAO的方法。此抽象类中实际上只实现了一个JdbcTemplate,以方便对连接进行配置。

然而,该抽象类中并没有@Autowired标记,因此需要通过实现一个函数进行注入。通常,可以拓展实现一个AbstractDao抽象类以进行配置注入,后续其它的DAO直接拓展这个类并调用getJdbcTemplate()函数即可。

1
2
3
4
5
6
7
8
9
public abstract class AbstractDao extends JdbcDaoSupport {
@Autowired
private JdbcTemplate jdbcTemplate;

@PostConstruct
public void init() {
super.setJdbcTemplate(jdbcTemplate);
}
}

Java Spring开发记(二):JDBC与数据库的访问
本文链接:http://blog.ac1liu.com/p/55bb6ff9.html
发布时间
2026年1月23日
许可协议
转载说明
请注明出处!
发表评论