Spring JDBC与事务管理(二)

简介: Spring JDBC与事务管理

4. jdbcTemplate的数据查询的方法


本小节,讲解一下jdbcTemplate的数据查询方法。为了学习便利,在当前工程中增加Junit单元测试框架,以及spring-test的依赖。如下:


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.13</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>


然后在Test目录下的Java目录下创建jdbcTemplateTestor测试用例类,然后进行配置:


import com.haiexijun.dao.EmployeeDao;
import com.haiexijun.entity.Employee;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class jdbcTemplateTestor {
    @Resource
    private EmployeeDao employeeDao;
}


查询多条记录, 在EmployeeDao里面添加如下方法:


//查询多条记录
    public List<Employee> findByDname(String dname){
        String sql="select * from employee where dname=?";
        //query方法用于查询多条数据
        List<Employee> employees= jdbcTemplate.query(sql,new Object[]{dname},new BeanPropertyRowMapper<Employee>(Employee.class));
        return employees;
    }


然后到jdbcTemplateTestor里面创建一个新的测试用例:


@Test
    public void testFindByDname(){
        List<Employee> employees=employeeDao.findByDname("研发部");
        System.out.println(employees);
    }


运行后,打印出张三和李四。

关于查询方法,我们还有一个特例,我们之前查询的都是所有的字段(*),并将这些字段名按照实体类的属性的对照关系依依进行转换,但是在实际运行过程中,有很多字段是没有与之对应的实体属性的。下面来模拟一下:

在EmployeeDao里面创建如下的方法:


    //将查询结果封装的Map为List
    public List<Map<String,Object>> findMapByDname(String dname){
        String sql="select eno as empno ,salary as s from employee where dname=?";
        //把查询结果保存为list集合,每一个元素都是map,每一个Map对应一条记录
        List<Map<String,Object>> list= jdbcTemplate.queryForList(sql,new Object[]{dname});
        return list;
    }


添加一个测试用例:


    @Test
    public void testFindMapByDname(){
        List<Map<String,Object>> maps=employeeDao.findMapByDname("研发部");
        System.out.println(maps);
    }


运行结果:


32c49c59b557469b9cc442a751a91867.png


5. jdbcTemplate的数据写入的方法


这一节同样是以代码案例的方式来演示增删改查的操作。

新增数据:

下面先来演示增加数据的操作,在EmployeeDao下添加如下的方法:

数据的写入用 jdbcTemplate的update方法。


    //数据的新增插入操作
    public void insert(Employee employee){
        String sql="insert into employee(eno,ename,salary,dname,hiredate)values(?,?,?,?,?)";
        jdbcTemplate.update(sql,new Object[]{employee.getEno(),employee.getEname(),employee.getSalary(),employee.getDname(),employee.getHiredate()});
    }


下面,编写测试用例来测试一下:


    @Test
    public void testInsert(){
        Employee employee=new Employee();
        employee.setEno(8888);
        employee.setEname("赵六");
        employee.setSalary(6666f);
        employee.setDname("研发部");
        employee.setHiredate(new Date());
        employeeDao.insert(employee);
    }


运行后,数据成功插入:


7570ec0ce0da42e990f61e0e8e632345.png


数据更新:

在EmployeeDao下添加如下代码用于数据更新:


    //用于数据更新
    public void update(Employee employee){
        String sql="update employee set ename=?,salary=?,dname=?,hiredate=? where eno=?";
        jdbcTemplate.update(sql,new Object[]{employee.getEname(),employee.getSalary(),employee.getDname(),employee.getHiredate(),employee.getEno()});
    }


编写测试方法:


    @Test
    public void testUpdate(){
        Employee employee=new Employee();
        employee.setEno(8888);
        employee.setEname("赵六");
        employee.setSalary(8888f);
        employee.setDname("研发部");
        employee.setHiredate(new Date());
        employeeDao.update(employee);
    }


测试结果如下:


818289577a794df89ce8e3bc59874419.png


下面演示一下删除操作:

在EmployeeDao中添加如下方法:


    //数据删除
    public void delete(Integer eno){
        String sql="delete from employee where eno = ?";
        jdbcTemplate.update(sql,new Object[]{eno});
    }


这里就不作测试了。

但是一涉及到写操作就要想到事务。下面就来学习。

相关文章
|
6月前
|
Java 关系型数据库 MySQL
深入解析 @Transactional——Spring 事务管理的核心
本文深入解析了 Spring Boot 中 `@Transactional` 的工作机制、常见陷阱及最佳实践。作为事务管理的核心注解,`@Transactional` 确保数据库操作的原子性,避免数据不一致问题。文章通过示例讲解了其基本用法、默认回滚规则(仅未捕获的运行时异常触发回滚)、因 `try-catch` 或方法访问修饰符不当导致失效的情况,以及数据库引擎对事务的支持要求。最后总结了使用 `@Transactional` 的五大最佳实践,帮助开发者规避常见问题,提升项目稳定性与可靠性。
888 12
|
Java 关系型数据库 数据库
Spring Boot多数据源及事务管理:概念与实战
【4月更文挑战第29天】在复杂的企业级应用中,经常需要访问和管理多个数据源。Spring Boot通过灵活的配置和强大的框架支持,可以轻松实现多数据源的整合及事务管理。本篇博客将探讨如何在Spring Boot中配置多数据源,并详细介绍事务管理的策略和实践。
1236 3
|
11月前
|
XML Java 数据库连接
Spring高手之路25——深入解析事务管理的切面本质
本篇文章将带你深入解析Spring事务管理的切面本质,通过AOP手动实现 @Transactional 基本功能,并探讨PlatformTransactionManager的设计和事务拦截器TransactionInterceptor的工作原理,结合时序图详细展示事务管理流程,最后引导分析 @Transactional 的代理机制源码,帮助你全面掌握Spring事务管理。
173 2
Spring高手之路25——深入解析事务管理的切面本质
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
348 9
|
Java 数据库连接 数据库
Spring基础3——AOP,事务管理
AOP简介、入门案例、工作流程、切入点表达式、环绕通知、通知获取参数或返回值或异常、事务管理
Spring基础3——AOP,事务管理
|
XML Java 数据库
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
这篇文章是Spring5框架的实战教程,详细介绍了事务的概念、ACID特性、事务操作的场景,并通过实际的银行转账示例,演示了Spring框架中声明式事务管理的实现,包括使用注解和XML配置两种方式,以及如何配置事务参数来控制事务的行为。
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
|
Java Spring 开发者
掌握Spring事务管理,打造无缝数据交互——实用技巧大公开!
【8月更文挑战第31天】在企业应用开发中,确保数据一致性和完整性至关重要。Spring框架提供了强大的事务管理机制,包括`@Transactional`注解和编程式事务管理,简化了事务处理。本文深入探讨Spring事务管理的基础知识与高级技巧,涵盖隔离级别、传播行为、超时时间等设置,并介绍如何使用`TransactionTemplate`和`PlatformTransactionManager`进行编程式事务管理。通过合理设计事务范围和选择合适的隔离级别,可以显著提高应用的稳定性和性能。掌握这些技巧,有助于开发者更好地应对复杂业务需求,提升应用质量和可靠性。
164 0
|
Java 数据库连接 API
Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法
Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法
1285 1
|
Java 开发者 Spring
深入解析 @Transactional:Spring 事务管理的艺术及实战应对策略
深入解析 @Transactional:Spring 事务管理的艺术及实战应对策略
176 2
|
设计模式 Java 数据库连接
【Spring源码】JDBC数据源访问实现
我们再来看看阅读线索三,这方面我们从设计模式进行入手。阅读线索三:从这个模块可以学到什么我们看下以下代码,PreparedStatement实例的是由PreparedStatementCreator实现的。再来看看PreparedStatementCreator接口,一共有三个子类实现。也就是说PreparedStatement的三种不同实现被封装到三个子类中,而具体需要哪种实现,只需要传入不同。
150 1
【Spring源码】JDBC数据源访问实现