Spring JDBC教程:从入门到实践

一、引言

在Java开发中,Spring框架为开发者提供了丰富的功能集,其中Spring JDBC是简化数据库访问的重要组件。通过Spring JDBC,我们可以轻松地对JDBC进行封装和抽象,减少手动编写JDBC代码的繁琐性。本文将介绍如何使用Spring JDBC,并通过示例展示其在实际项目中的应用。

二、环境准备

确保你的开发环境已经安装了以下组件:

  1. Java JDK:用于Java程序的开发和运行。
  2. Maven或Gradle:用于项目的依赖管理。
  3. 数据库:例如MySQL、Oracle等,用于存储数据。
  4. 对应的数据库驱动:用于Java程序与数据库的连接。

三、Spring JDBC入门

1.添加依赖

在你的pom.xml文件中添加Spring Boot Starter Data JDBC的依赖:


	    <!-- JDBC 依赖,用于使用JdbcTemplate -->  
        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-data-jdbc</artifactId>  
        </dependency>  
  
        <!-- MySQL驱动依赖 -->  
        <dependency>  
            <groupId>mysql</groupId>  
            <artifactId>mysql-connector-java</artifactId>  
            <scope>runtime</scope>  
        </dependency>  

2.配置数据源

在Spring Boot项目中,我们可以使用application.yml配置文件来配置数据源。例如:

spring:  
  datasource:  
    url: jdbc:mysql://localhost:3306/your_database  
    username: your_username  
    password: your_password  
    driver-class-name: com.mysql.cj.jdbc.Driver

Spring Boot会自动根据这些配置创建数据源实例。

3.自定义JdbcTemplate

在Spring Boot中,JdbcTemplate通常通过自动配置创建,但你也可以自定义它以满足特定的需求。创建一个配置类来自定义JdbcTemplate:

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.jdbc.core.JdbcTemplate;  
import javax.sql.DataSource;  
  
@Configuration  
public class JdbcConfig {  
  
    @Autowired  
    private DataSource dataSource;  
  
    @Bean  
    public JdbcTemplate jdbcTemplate() {  
        return new JdbcTemplate(dataSource);  
    }  
}

四、Spring JDBC实践

1. 首先,我们定义一个简单的用户实体类User:

public class User {  
    private Long id;  
    private String name;  
    private Integer age;  
  
    // 省略构造器、getter和setter方法  
}

2. 创建DAO层

创建一个UserDao接口,并使用@Repository注解标记它:

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.jdbc.core.BeanPropertyRowMapper;  
import org.springframework.jdbc.core.JdbcTemplate;  
import org.springframework.stereotype.Repository;  
  
@Repository  
public class UserDao {  
  
    @Autowired  
    private JdbcTemplate jdbcTemplate;  
  
    public User getUserById(Long id) {  
        String sql = "SELECT * FROM users WHERE id = ?";  
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));  
    }  
  
    public void insertUser(User user) {  
        String sql = "INSERT INTO users (name, age) VALUES (?, ?)";  
        jdbcTemplate.update(sql, user.getName(), user.getAge());  
    }  
  
    // 其他CRUD方法...  
}

3. 创建Service层

创建UserService类来调用DAO层的方法:

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Service;  
  
@Service  
public class UserService {  
  
    @Autowired  
    private UserDao userDao;  
  
    public User getUserById(Long id) {  
        return userDao.getUserById(id);  
    }  
  
    public void insertUser(User user) {  
        userDao.insertUser(user);  
    }  
  
    // 其他业务逻辑...  
}

4. 创建Controller层

最后,我们创建一个UserController来处理HTTP请求:

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.*;  
  
@RestController  
@RequestMapping("/users")  
public class UserController {  
  
    @Autowired  
    private UserService userService;  
  
    @GetMapping("/{id}")
	public User getUserById(@PathVariable Long id) {
		return userService.getUserById(id);
	}
	
	@PostMapping  
	public void insertUser(@RequestBody User user) {  
    	userService.insertUser(user);  
	}  

	// 其他HTTP方法处理...
}

五、分页与动态查询示例

1. 定义分页和查询条件对象

public class Pageable {  
    private int pageNo; // 页码  
    private int pageSize; // 每页大小  
    // 省略构造方法、getter和setter  
}  
  
public class UserQuery {  
    private String name; // 用户名  
    private Integer age; // 年龄  
    // 根据需要添加更多查询条件字段  
    // 省略构造方法、getter和setter  
}

2. DAO层实现

@Repository  
public class UserDao {  
  
    @Autowired  
    private JdbcTemplate jdbcTemplate;  
  
    public List<User> findUsersByCondition(UserQuery query, Pageable pageable) {  
        String sql = buildQuerySql(query);  
        RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);  
  
        // 分页查询  
        int offset = (pageable.getPageNo() - 1) * pageable.getPageSize();  
        return jdbcTemplate.query(sql + " LIMIT ? OFFSET ?", new Object[]{pageable.getPageSize(), offset}, rowMapper);  
    }  
  
    private String buildQuerySql(UserQuery query) {  
        StringBuilder sql = new StringBuilder("SELECT * FROM users WHERE 1=1");  
        List<Object> args = new ArrayList<>();  
  
        if (query.getName() != null && !query.getName().isEmpty()) {  
            sql.append(" AND name = ?");  
            args.add(query.getName());  
        }  
        if (query.getAge() != null) {  
            sql.append(" AND age = ?");  
            args.add(query.getAge());  
        }  
  
        // 如果需要,可以构建更复杂的查询条件  
  
        return sql.toString();  
    }  
  
    // 其他方法...  
}

3. UserService层调用

@Service  
public class UserService {  
  
    @Autowired  
    private UserDao userDao;  
  
    public Page<User> getUserPageByCondition(UserQuery query, Pageable pageable) {  
        List<User> users = userDao.findUsersByCondition(query, pageable);  
        int totalCount = userDao.getTotalCountByCondition(query); // 假设此方法返回符合条件的总记录数  
  
        return new Page<>(users, pageable.getPageNo(), pageable.getPageSize(), totalCount);  
    }  
  
    // UserDao中可能需要添加getTotalCountByCondition方法来实现查询总数的功能  
  
    // 其他方法...  
}

4. Page类

public class Page<T> {  
    private List<T> content; // 分页数据  
    private int pageNo; // 页码  
    private int pageSize; // 每页大小  
    private int totalCount; // 总记录数  
  
    // 构造方法、getter和setter省略  
}

六、spring jdbc 与 spring jpa 的区别与联系

前面文章我们介绍了Spring JDBC 的用法,与Spring JPA在功能和使用上有一些明显的区别,但它们同样都是Spring框架中用于简化数据库操作的组件。以下是它们之间的主要区别与联系:

1. 区别:

  1. 概念与定位:
  • Spring JDBC:是Spring框架中提供的一个模块,用于简化JDBC的使用。它封装了底层的JDBC
    API,使得开发者可以更方便地操作数据库。
  • Spring JPA:是基于JPA(Java Persistence API)的规范实现的。JPA是Java
    EE的标准规范之一,用于对象关系映射(ORM)。Spring
    JPA在Spring框架中提供了对JPA的支持,使得开发者可以使用JPA的注解和API来操作数据库。
  1. 操作方式:
  • Spring JDBC:主要依赖于SQL语句来操作数据库,开发者需要编写SQL语句,并通过Spring
    JDBC提供的模板类(如JdbcTemplate)来执行这些语句。

  • Spring JPA:则更注重于面向对象的方式操作数据库,通过实体类与数据库表之间的映射关系,以及JPA提供的各种注解和API,可以实现对数据库的操作,而无需编写SQL语句。

  • 灵活性:

Spring JDBC:由于其依赖于SQL语句,因此在处理复杂的查询和操作时具有更高的灵活性。开发者可以根据需要编写任意复杂的SQL语句。
Spring JPA:虽然也提供了丰富的查询和操作方法,但由于其基于ORM的映射关系,可能在处理某些复杂的查询和操作时相对受限。

2. 联系:

  1. 目标一致:无论是Spring JDBC还是Spring JPA,它们的目标都是为了简化数据库操作,提高开发效率。
  2. 集成于Spring框架:两者都是Spring框架的一部分,可以与Spring的其他模块(如Spring MVC、Spring
    Security等)无缝集成,共同构建完整的Web应用程序。
  3. 依赖注入:在Spring中,无论是使用Spring JDBC还是Spring
    JPA,都可以利用依赖注入的特性,将数据库连接、事务管理等资源注入到需要的地方,实现松耦合和可维护的代码结构。

综上所述,Spring JDBC和Spring JPA各有其特点和适用场景。在选择使用哪个时,需要根据项目的具体需求和团队的技术栈来决定。
对于简单的CRUD操作,Spring JPA可能更合适;
而对于需要编写复杂SQL语句的场景,Spring JDBC可能更为灵活。

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值