Spring JDBC使用步骤和事务管理

 更新时间:2023年12月11日 10:35:54   作者:小矮多  
Spring JDBC是Spring框架用来处理关系型数据库的模块,对JDBC的API进行了封装,这篇文章主要介绍了Spring JDBC使用步骤和事务管理,需要的朋友可以参考下

Spring JDBC是Spring框架用来处理关系型数据库的模块,对JDBC的API进行了封装。

Spring JDBC的核心类为JdbcTemplate,提供数据CRUD方法

Spring JDBC使用步骤

1.Maven工程引入依赖spring-jdbc

<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-jdbc</artifactId>
     <version>5.2.6.RELEASE</version>
</dependency>
<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>8.0.27</version>
</dependency>

2.xml中配置DataSource数据源

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
    <property name="username" value="root"></property>
    <property name="password" value="root"></property>
</bean>

3.xml中定义JdbcTemplate Bean,让IoC容器初始化时自动实例化

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
</bean>

4.在需要增删改查的Dao中,持有JdbcTemplate属性,并设置getter和setter方法,然后在对应的业务处理方法中,调用JdbcTemplate的指定方法。

public class EmployeeDao {
    private JdbcTemplate jdbcTemplate;
	//数据查询方法
    public Employee findById(Integer eno){
        String sql="select * from employee where eno = ?";
        Employee employee = jdbcTemplate.queryForObject(sql,new Object[]{eno},new BeanPropertyRowMapper<>(Employee.class));
        return employee;
    }
    public JdbcTemplate getJdbcTemplate() {
        return jdbcTemplate;
    }
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
}

5.在xml中为Dao类注入JdbcTemplate对象

<bean id="employeeDao" class="spring.jdbc.dao.EmployeeDao">
    <property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>

JdbcTemplate数据查询方法:

例:

public List<Employee> findByDname(String dname){
    String sql = "select * from employee where dname = ?";
    List<Employee> list = jdbcTemplate.query(sql,new Object[]{dname},new BeanPropertyRowMapper<>(Employee.class));
    return list;
}
public List<Map<String, Object>> findMapByDname(String dname){
    String sql = "select eno as  empno,salary as s from employee where dname = ?";
    List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql, new Object[]{dname});
    return maps;
}

JdbcTemplate数据写入方法:

例:

public void insert(Employee employee){
        String sql = "insert into employee(eno,ename,salary,dname) values(?,?,?,?)";
        //利用update方法实现数据写入操作
        jdbcTemplate.update(sql,new Object[]{
                employee.getEno(),employee.getEname(),employee.getSalary(), employee.getDname()
        });
    }
    public int update(Employee employee){
        String sql = "update employee set ename=?,salary=?,dname=? where eno=?";
        //利用update方法实现数据更新操作
        int count = jdbcTemplate.update(sql,new Object[]{
                employee.getEname(),employee.getSalary(), employee.getDname(),employee.getEno()
        });
        return count;
    }
    public int delete(Integer eno){
        String sql = "delete from employee where eno = ?";
        //利用update方法实现数据删除操作
        return jdbcTemplate.update(sql,new Object[]{eno});
    }

Spring事务管理

事务是一种可靠、一致的方式,是访问操作数据库的程序单元,事务要么把事情做完,要么不做,不会做一半停止。
事务依赖数据库实现,MySQL通过事务区作为数据缓冲地带。

编程式事务

通过代码手动提交回滚事务的事务控制方式。

SpringJDBC通过TransactionManager事务管理器实现事务控制。

TransactionManager事务管理器提供commit、rollback方法进行事务提交和回滚。

编程式事务使用步骤:

1.配置事务管理器

<!--    事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

2.在需要开启事务的业务类中,持有事务管理器属性,并设置getter和setter方法

private DataSourceTransactionManager transactionManager;
	public DataSourceTransactionManager getTransactionManager() {
        return transactionManager;
    }
    public void setTransactionManager(DataSourceTransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }

3.配置事务管理器对象注入

<bean id="employeeService" class="spring.jdbc.service.EmployeeService">
        <property name="employeeDao" ref="employeeDao"></property>
        <property name="transactionManager" ref="transactionManager"></property>
</bean>

定义事务默认的标准配置,开启事务,进行事务管理

声明式事务

在不修改代码的情况下通过配置的形式实现事务控制,本质就是AOP环绕通知。

声明式事务的触发时机:

  • 当目标方法执行成功时,自动提交事务
  • 当目标方法抛出运行时异常时,自动事务回滚

声明式事务配置过程:

1.需要添加AOP依赖

<dependency>
     <groupId>org.aspectj</groupId>
     <artifactId>aspectjweaver</artifactId>
     <version>1.9.5</version>
</dependency>

2,添加tx和aop命名空间

3.配置TransactionManager事务管理器

<!--    事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

4.配置事务通知与事务属性

<!--事务通知配置,决定哪些方法使用事务,哪些方法不使用事务-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
			<!--propagation事务传播行为-->
			<!--当目标方法名为batchImport时,启用声明式事务,运行成功提交事务,运行时异常回滚-->
			<!--目标方法允许使用通配符*-->
            <tx:method name="batchImport" propagation="REQUIRED"/>
            <!--设置所有findXXX方法不启用事务-->
            <tx:method name="find*" propagation="NOT_SUPPORTED" read-only="true"/>
            <tx:method name="get*" propagation="NOT_SUPPORTED" read-only="true"/>
            <!--设置其他方法不启用事务-->
            <tx:method name="*" propagation="NOT_SUPPORTED" read-only="true"/>
        </tx:attributes>
    </tx:advice>

5.为事务通知绑定PointCut切点

<!--定义声明式事务的作用范围-->
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* spring.jdbc..*Service.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
    </aop:config>

事务传播行为propagation

多个拥有事务的方法在嵌套调用时的事务控制方式。

注解配置声明式事务

xml配置

<context:component-scan base-package="spring.jdbc"/>
    <!--数据源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--启用注解形式声明式事务-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

2.分层添加组件注解,实例化对象

@Repository
public class EmployeeDao {
    @Resource
    private JdbcTemplate jdbcTemplate;
    ...
@Service
public class EmployeeService {
    @Resource
    private EmployeeDao employeeDao;
    ...

3.需要开启事务的类添加@Transactional注解,可以设置事务传播行为,如@Transactional(propagation = Propagation.REQUIRED

或者为方法单独设置事务管理方式,程序执行时优先应用方法上的配置

到此这篇关于Spring JDBC使用步骤和事务管理的文章就介绍到这了,更多相关Spring事务管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java通过JNI 调用动态链接库DLL操作

    Java通过JNI 调用动态链接库DLL操作

    这篇文章主要介绍了Java通过JNI 调用动态链接库DLL操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Spring中基于XML的AOP配置详解

    Spring中基于XML的AOP配置详解

    这篇文章主要介绍了Spring中基于XML的AOP配置,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • IDEA连接MySQL提示serverTimezone的问题及解决方法

    IDEA连接MySQL提示serverTimezone的问题及解决方法

    很多朋友私聊小编,使用IDEA软件连接MySQL数据库时总是提示Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.的错误,小编就不一一回复大家了,下面小编把我的解决方法分享到脚本之家平台,需要的朋友参考下吧
    2021-05-05
  • WebFlux 服务编排使用优势详解

    WebFlux 服务编排使用优势详解

    这篇文章主要为大家介绍了WebFlux 服务编排使用优势示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • springboot注解之@Conditional使用解析

    springboot注解之@Conditional使用解析

    这篇文章主要介绍了springboot注解之@Conditional使用解析,conditional 这个英文单词翻译过来是有条件的,所以 @Conditional 注解是作为条件存在的,如果满足配置的条件则执行,如果没有满足的话就不执行,需要的朋友可以参考下
    2023-11-11
  • Java中的逻辑控制语句详解

    Java中的逻辑控制语句详解

    下面小编就为大家带来一篇Java逻辑控制的基础文章。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-08-08
  • Java中从键盘输入多个整数的方法

    Java中从键盘输入多个整数的方法

    今天小编就为大家分享一篇Java中从键盘输入多个整数的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • springBoot 与neo4j的简单整合示例

    springBoot 与neo4j的简单整合示例

    这篇文章主要介绍了springBoot 与neo4j的简单整合示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Mybatis利用分页插件PageHelper快速实现分页查询

    Mybatis利用分页插件PageHelper快速实现分页查询

    如果你也在用MyBatis,建议尝试该分页插件,这一定是最方便使用的分页插件,这篇文章主要给大家介绍了关于Mybatis利用分页插件PageHelper快速实现分页查询的相关资料,PageHelper是一个Mybatis的分页插件,负责将已经写好的sql语句,进行分页加工,需要的朋友可以参考下
    2021-08-08
  • Java简单实现动态代理模式过程解析

    Java简单实现动态代理模式过程解析

    这篇文章主要介绍了Java动态代理模式简单案例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07

最新评论