Spring 中的 JDBC

时间:2022-07-26
本文章向大家介绍Spring 中的 JDBC,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.1 简介

  JDBC(Java Data Base Connectivity)是一种用于执行 SQL 语句的 Java APl,可以为多种关系型数据库提供统一访问,它是由一组用 Java 语言编写的类和接口组成的。JDBC 提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。但是,在 Java 企业级应用中,使用底层的 JDBC API 来编写程序还是显得过于烦琐,如需要编写很多的样板代码来打开和关闭数据库连接,需要处理很多的异常等。   针对上述问题,Spring JDBC 框架对底层的 JDBC API 进行了封装,负责所有的底层细节,包括如何开始打开连接、准备和执行 SQL 语句、处理异常、处理事务、最后关闭连接等。所以使用 Spring JDBC 框架,开发人员需要做的仅是定义连接参数、指定要执行的 SQL 语句,从而可以从烦琐的 JDBC API 中解放出来,专注于自己的业务。Spring 还为我们提供了 JdbcTemplate 模板用于操作关系型数据库。

1.2 JdbcTemplate

1.2.1 自己创建 JdbcTemplate 对象

☞ 相关依赖

<!-- 数据库连接驱动 -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.32</version>
</dependency>
<!-- 数据库连接池,算便使用哪一个 -->
<dependency>
	<groupId>c3p0</groupId>
	<artifactId>c3p0</artifactId>
	<version>0.9.1.2</version>
</dependency>
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid</artifactId>
	<version>1.1.10</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>5.0.5.RELEASE</version>
</dependency>

☞ 使用 JdbcTemplate

@Test
public void test() throws Exception {
    // 创建数据源对象
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    dataSource.setDriverClass("com.mysql.jdbc.Driver");
    dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
    dataSource.setUser("root");
    dataSource.setPassword("root");

    JdbcTemplate jdbcTemplate = new JdbcTemplate();
    // 设置数据源对象
    jdbcTemplate.setDataSource(dataSource);
    // 执行操作
    int row = jdbcTemplate.update("insert into account values(?,?)", "tom", 5000);
    System.out.println(row);
}

1.2.2 Spring 创建 JdbcTemplate 对象

☞ 配置文件

<!--数据源对象-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
	<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
	<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"></property>
	<property name="user" value="root"></property>
	<property name="password" value="root"></property>
</bean>

<!--jdbc模板对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
	<property name="dataSource" ref="dataSource"/>
</bean>

☞ 抽取数据库信息

# 注意不要省略前缀直接写 username,可能会与系统名称冲突导致参数不正确
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
<!--加载 jdbc.properties -->
<context:property-placeholder location="classpath:jdbc.properties"/>

<!--数据源对象-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

☞ 使用 JdbcTemplate

@Autowired
private JdbcTemplate jdbcTemplate;

@Test
public void test() throws Exception {
    // 执行操作
    int row = jdbcTemplate.update("insert into account values(?,?)", "tom", 5000);
    System.out.println(row);
}

1.2.3 常用 API

update():执行 DML 语句。增、删、改语句 queryForMap():查询结果将结果集封装为 map 集合,将列名作为 key,将值作为 value 将这条记录封装为一个 map 集合。注意:这个方法查询的结果集长度只能是 1 queryForList():查询结果将结果集封装为 list 集合。注意:将每一条记录封装为一个 Map 集合,再将 Map 集合装载到 List 集合中 query():查询结果,将结果封装为 JavaBean 对象。参数:RowMapper,一般我们使用 BeanPropertyRowMapper 实现类。可以完成数据到 JavaBean 的自动封装 new BeanPropertyRowMapper<T>(T.class) queryForObject(sql,T.class):查询结果,将结果封装为对象。一般用于聚合函数的查询。 queryForObject(sql,BeanPropertyRowMapper<T>(T.class)):将一条记录封装为javabean

1.2.4 示例

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:application.xml")
public class JdbcTemplateCRUDTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;
    
	// 更新
    @Test
    public void testUpdate(){
        jdbcTemplate.update("update account set money = ? where name = ?", 10000, "tom");
    }
    
	// 删除
    @Test
    public void testDelete(){
        jdbcTemplate.update("delete from account where name = ?","tom");
    }
    
	// 聚合查询
    @Test
    public void testQueryCount(){
        Long count = jdbcTemplate.queryForObject("select count(*) from account", Long.class);
        System.out.println(count);
    }
    
	// 封装为对象
    @Test
    public void testQueryOne(){
        Account account = jdbcTemplate.queryForObject("select * from account where name = ?", 
        									new BeanPropertyRowMapper<Account>(Account.class), "tom");
        System.out.println(account);
    }
    
	// 封装为集合
    @Test
    public void testQueryAll(){
        List<Account> accountList = jdbcTemplate.query("select * from account", 
        									new BeanPropertyRowMapper<Account>(Account.class));
        System.out.println(accountList);
    }

}