Spring框架针对dao层的jdbcTemplate操作crud之query查询数据操作 —— 查询表,返回结果为对象的list集合

本文介绍了如何使用Spring框架的JdbcTemplate进行数据库查询操作,特别是展示如何执行query方法,结合自定义RowMapper实现将查询结果转换为User对象的List集合。通过在JdbcTemplateDemo类中定义queryAllObject()方法,配合MyRowMapper类处理ResultSet,最终在Servlet类中调用此功能,展示查询结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用JdbcTemplate的方法完成, 查询数据库表,把用户表sw_user所有数据以List<User>集合返回

在JdbcTemplateDemo类中增加查询返回所有对象集合的方法queryAllObject()

数据源DriverManagerDataSource不变

jdbcTemplate的方法有所改变,使用query(sql, new MyRowMapper());

其中第二个参数是一个接口RowMapper<User>的实现类,可以使用匿名内部类,我使用的是单独的类MyRowMapper的对象

它要实现重载的方法mapRow(ResultSet rs, int num)只做两件事

一用ResultSet得到所需User对象数据

二用User进行封装得到对象并返回


 

浏览器得到查询效果图:

JdbcTemplateDemo类:

package com.swift;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.stereotype.Component;

@Component(value="jdbcTemplateDemo")
public class JdbcTemplateDemo {
    
    public List<User> queryAllObject(){
        DriverManagerDataSource dataSource=new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        dataSource.setUrl("jdbc:mysql://localhost:3306/sw_database");
        
        JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
        String sql="select * from sw_user";
        List<User> list=jdbcTemplate.query(sql, new MyRowMapper());
        return list;
        
    }
    
    public User queryOneObject() {
        
        DriverManagerDataSource dataSource=new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/sw_database");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        
        JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
        String sql="select * from sw_user where username=? and password=?";
        User user=jdbcTemplate.queryForObject(sql, new MyRowMapper(), "zhangsan","123456");
        return user;
        
    }
    
    public boolean delete(String username) {
    DriverManagerDataSource dataSource=new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/sw_database");
    dataSource.setUsername("root");
    dataSource.setPassword("root");
    
    JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
    int count=jdbcTemplate.update("delete from sw_user where username=?", username);
    if(count!=0) {
        return true;
    }
    return false;
    }
}

//没有用匿名内部类,注意MyRowMapper后没有<User>

class MyRowMapper implements RowMapper<User> {

    @Override
    public User mapRow(ResultSet rs, int num) throws SQLException {
        
        String username=rs.getString("username");
        String password=rs.getString("password");
        User user=new User(username,password);
        return user;
    }
    
}

Servlet类调用该JdbcTemplateDemo类

package com.swift;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

@WebServlet("/demo")
public class ServletDemo extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    public ServletDemo() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("Served at: ").append(request.getContextPath());
        
        //使用JdbcTemplat的queryForObject方法
        ApplicationContext context=new ClassPathXmlApplicationContext("aop.xml");
        JdbcTemplateDemo jdbcTemplateDemo=(JdbcTemplateDemo) context.getBean("jdbcTemplateDemo");
        List<User> list=jdbcTemplateDemo.queryAllObject();
        for(User user:list) {
            response.getWriter().append(user.toString());
            response.getWriter().println();
        }
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

所用到的xml配置文件在前面随笔中及相关包

 

<think>好的,我现在要解释一下JdbcTemplate和实体的关系。首先,我需要明确这两个概念各自的定义和作用,然后再探讨它们之间的关联。 用户的问题是“介绍一下JdbcTemplate和实体的关系”,所以我的回答需要涵盖两者的基本概念,以及它们如何在应用程序中协同工作。可能需要从Spring框架JdbcTemplate开始,说明它是什么,有什么作用。然后转到实体,解释其在数据模型中的角色。接着,分析它们之间如何交互,比如JdbcTemplate如何操作实体对象,或者实体如何被JdbcTemplate使用来映射数据库数据。 首先,JdbcTemplateSpring框架提供的一个工具类,用于简化JDBC操作。它处理了连接管理、异常处理等繁琐的部分,让开发者可以更专注于SQL语句和结果处理。用户可能已经知道JDBC的复杂性,所以需要强调JdbcTemplate如何简化这些步骤。 然后,实体通常指代应用程序中的领域模型,也就是那些代表业务数据的Java类,比如User、Product等。这些实体类通常与数据库中的表结构对应,每个实例对应表中的一行数据。实体属于数据访问DAO)之上的领域模型,可能属于MVC模式中的模型部分。 接下来,两者的关系可能体现在:JdbcTemplate在数据访问DAO)中被用来执行SQL,而处理的结果(比如ResultSet)会被转换成实体对象。例如,当从数据库查询数据时,JdbcTemplate的RowMapper或ResultSetExtractor可以将查询结果映射到实体对象中,这样DAO的方法返回的就是实体对象,供业务使用。 需要具体说明JdbcTemplate如何与实体交互。例如,在DAO实现中,使用JdbcTemplatequery方法,并传入一个RowMapper,该RowMapper负责将每一行的结果集转换为一个实体对象。这样,实体就被JdbcTemplate用来承载数据,而JdbcTemplate负责数据的持久化和检索。 可能还需要提到,虽然JdbcTemplate处理了底的数据库操作,但实体作为数据的载体,在应用程序的各之间传递。这种分离符合分架构的设计原则,使得各职责清晰,实体专注于数据结构,而数据访问专注于数据的存取。 另外,可能存在的误区是,有些人可能会混淆JdbcTemplate和ORM框架(如Hibernate)的角色。需要指出,JdbcTemplate并不是一个ORM工具,它仍然需要手动编写SQL和结果映射,而实体在这种情况下仍然是必要的,只是映射工作由开发者自己处理,而不是通过ORM的注解或配置自动完成。 在结构安排上,应该先分别介绍JdbcTemplate和实体,再讨论它们的关系,最后举例说明。这样用户能逐步理解两者的概念及其协作方式。 可能需要检查是否有遗漏的点,比如事务管理,但用户的问题可能更关注于两者直接的关系,而不是更广泛的主题。此外,要确保语言通俗易懂,避免过于技术化的术语,或者如果使用术语,需适当解释。 总结回答的结构可能是: 1. JdbcTemplate的定义和作用 2. 实体的定义和作用 3. 两者的关系:如何协作,数据如何流转 4. 示例代码说明 5. 总结 现在需要验证这些思路是否正确,以及是否有需要补充的地方。例如,是否需要提到Spring Data JDBC或其他相关技术?但用户的问题仅限于JdbcTemplate和实体,所以可能不需要扩展。此外,是否需要强调设计模式,如DAO模式,这里可能需要简要提及,因为DAO通常会使用JdbcTemplate,而实体作为数据传输对象。 可能还需要指出,实体类通常是普通的Java对象(POJOs),带有字段和getter/setter方法,而JdbcTemplate通过RowMapper将这些字段与数据库列对应起来。这展示了实体JdbcTemplate在数据映射中的协作。 现在,将这些思路组织成结构清晰的解释,分步骤说明,并确保符合用户的要求:结构清晰,逐步解决问题,回答真实可靠。</think>### JdbcTemplate与实体的关系分步说明 #### 1. **JdbcTemplate的定义与作用** - **是什么?** JdbcTemplateSpring框架提供的工具类,封装了JDBC的复杂操作(如连接管理、异常处理),开发者只需关注**SQL编写**和**结果处理**。 - **解决了什么问题?** 传统JDBC需要手动处理资源(Connection、Statement)和异常(如SQLException),代码冗余且易错。JdbcTemplate通过模板化设计,自动释放资源,并将异常转换为统一的`DataAccessException`。 #### 2. **实体的定义与作用** - **是什么?** 实体由Java类(POJO)构成,每个类对应数据库中的一张表,类的字段与表的列一一映射。例如: ```java public class User { private Long id; private String name; // getter/setter } ``` - **核心职责** 承载业务数据,在应用各(如DAO、Service)间传递。例如,DAO从数据库查询数据后,将结果封装为`User`对象返回给业务。 #### 3. **两者的协作关系** JdbcTemplate与实体的交互主要体现在**数据存取过程**中,具体步骤如下: **步骤1:DAO调用JdbcTemplate** - 在数据访问DAO)中,通过注入`JdbcTemplate`执行SQL。 示例:查询用户信息 ```java @Repository public class UserDao { @Autowired private JdbcTemplate jdbcTemplate; } ``` **步骤2:使用RowMapper映射结果到实体** - 通过`RowMapper`将查询结果(ResultSet)转换为实体对象。 示例:定义`User`的映射逻辑 ```java public 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")); return user; } } ``` **步骤3:执行查询返回实体对象** - 调用`query()`方法,传入SQL和`RowMapper`,直接获取实体列表。 示例:查询所有用户 ```java public List<User> findAllUsers() { String sql = "SELECT id, name FROM user"; return jdbcTemplate.query(sql, new UserRowMapper()); } ``` **步骤4:业务使用实体对象** - DAO返回的实体对象(如`List<User>`)会传递到业务,用于业务逻辑处理。 #### 4. **关键设计原则** - **职责分离** - JdbcTemplate:专注**数据存取**(SQL执行、资源管理)。 - 实体:专注**数据结构**(定义数据模型)。 - **解耦** 实体独立于具体数据库操作,即使替换JdbcTemplate为其他技术(如JPA),实体类无需修改。 #### 5. **对比ORM框架(如Hibernate)** - **JdbcTemplate**:需手动编写SQL和映射逻辑,灵活性高,适合复杂查询。 - **ORM框架**:自动生成SQL并通过注解映射字段,适合简单CRUD。 - **共同点**:均依赖实体作为数据载体。 ### 总结 JdbcTemplate在**数据访问DAO)**中操作数据库,通过`RowMapper`将结果映射到实体对象;实体则作为数据的载体,贯穿整个应用级。两者协作实现了**数据存取**与**业务模型**的解耦,是典型的分架构实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值