学习Spring框架,通过事务管理的方式搭建一个小的项目,该项目可以查询对数据库中的图书库存数量进行修改。


首先,使用MVC分层的设计模式思想搭建项目目录结构。

此部分代码源码之中都有相关注释,所以尽情附上源码。

首先Dao层的源码:

package com.jredu.book.Dao;

public interface BookDao {

    /**
* 通过编号查询书的价格
* @param isbn
* @return
*/
int findBookPriceByIsbn(String isbn); /**
* 通过用户名查询余额
* @param username
* @return
*/
int findBalanceByUsername(String username); /**
* 更新书的库存
* @param isbn
*/
void updateBookStock(String isbn,int stock); /**
* 通过编号查询库存数量
* @param isbn
* @return
*/
int findStockByIsbn(String isbn); /**
* 更新用户余额信息
* @param username
* @param price
*/
void updateAccountBalance(String username,int price);
}

dao.impl相关的源码:

package com.jredu.book.Dao.Impl;

import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service; import com.jredu.book.Dao.BookDao;
import com.jredu.book.entity.Account;
import com.jredu.book.entity.Book; @Repository
public class BookDaoImpl extends JdbcDaoSupport implements BookDao{ @Autowired
public void setDS(DataSource dataSource){
setDataSource(dataSource);
} @Override
public int findStockByIsbn(String isbn) {
// TODO Auto-generated method stub
String sql = "select * from book_stock where isbn=?";
Map<String, Object> bookStock= getJdbcTemplate().queryForMap(sql,isbn);
int stock = Integer.parseInt(bookStock.get("stock").toString());
return stock;
} @Override
public int findBookPriceByIsbn(String isbn) {
// TODO Auto-generated method stub
String sql="select * from book where isbn=?";
Book book = getJdbcTemplate().queryForObject(sql, new Book(), isbn);
return book.getPrice();
} @Override
public int findBalanceByUsername(String username) {
// TODO Auto-generated method stub
String sql = "select * from account where username=?";
Account account = getJdbcTemplate().queryForObject(sql, new Account(),username);
return account.getBalance();
} @Override
public void updateBookStock(String isbn,int stock) {
// TODO Auto-generated method stub
String sql="update book_stock set stock=? where isbn=?";
getJdbcTemplate().update(sql,stock,isbn); } @Override
public void updateAccountBalance(String username, int price) {
// TODO Auto-generated method stub
String sql="update account set balance=? where username=?";
getJdbcTemplate().update(sql,price,username);
} }

entity实体类的相关源码:

package com.jredu.book.entity;

import java.sql.ResultSet;
import java.sql.SQLException; import org.springframework.jdbc.core.RowMapper; public class Account implements RowMapper<Account>{ private String username;
private int balance;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
@Override
public Account mapRow(ResultSet rs, int arg1) throws SQLException {
// TODO Auto-generated method stub
Account account = new Account();
account.setUsername(rs.getString("username"));
account.setBalance(rs.getInt("balance"));
return account;
} }
package com.jredu.book.entity;

import java.sql.ResultSet;
import java.sql.SQLException; import org.springframework.jdbc.core.RowMapper; public class Book implements RowMapper<Book>{ private String isbn;
private String bookName;
private int price;
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public Book mapRow(ResultSet rs, int arg1) throws SQLException {
// TODO Auto-generated method stub
Book book = new Book();
book.setIsbn(rs.getString("isbn"));
book.setBookName(rs.getString("book_name"));
book.setPrice(rs.getInt("price"));
return book;
} }

service目录下的相关源码:

package com.jredu.book.service;

public interface BookService {

    void purchase(String isbn,String username);
}
package com.jredu.book.service;

public interface MoneyService {

    void purchase(String isbn,String username);
}

service接口即service.impl目录下的相关源码:

package com.jredu.book.service.Impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository; import com.jredu.book.Dao.BookDao;
import com.jredu.book.service.BookService;
@Repository
public class BookServiceImpl implements BookService{ @Autowired
private BookDao dao; @Override
public void purchase(String isbn, String username) {
// TODO Auto-generated method stub
int stock = dao.findStockByIsbn(isbn);
//库存要大于1本
if(stock>0){
int price = dao.findBookPriceByIsbn(isbn);
int balance = dao.findBalanceByUsername(username);
//余额是否大于书的价格
if(balance>=price){
//执行更新余额信息
dao.updateAccountBalance(username, balance-price);
//更新库存信息
dao.updateBookStock(isbn, stock-1);
}
}
} }

编写一个测试类,book.test目录下测试类源码:

package com.jredu.book.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.jredu.book.service.BookService;
import com.jredu.book.service.MoneyService; public class BookTest { public static void main(String[] args) {
ApplicationContext app= new ClassPathXmlApplicationContext("applicationContext-book.xml");
BookService service = app.getBean(BookService.class);
service.purchase("abc","wang");
System.out.println("业务完成"); }
}

最重要的部分是配置application-book.xml的相关配置信息,相关注释代码之中含有,附上源码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 自动扫描 -->
<context:component-scan base-package="com.jredu.book"></context:component-scan>
<!-- 配置C3P0数据源 -->
<!-- 导入资源文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean
id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:user="${jdbc.user}"
p:password="${jdbc.pwd}"
p:driverClass="${jdbc.driverClassName}"
p:jdbcUrl="${jdbc.url}"
p:initialPoolSize="${jdbc.initPoolSize}"
p:maxPoolSize="${jdbc.maxPoolSize}"
/>
<!-- 配置事务管理器 -->
<bean
id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"
/>
<!-- 事务的通知 -->
<tx:advice
id="booktxAdvice" transaction-manager="transactionManager"
>
<tx:attributes>
<tx:method name="purchase*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice> <aop:config>
<aop:pointcut expression="execution (* com.jredu.book.service.*.*(..))" id="pointcut"/>
<aop:advisor advice-ref="booktxAdvice" pointcut-ref="pointcut"/>
</aop:config> <!-- 配置JDBC Template -->
<bean
id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dataSource"
/> </beans>

至此,使用事务方式搭建的一个小项目就已经完成,操作完成后,数据库中的图书库存数量会有所变化。

Spring框架——事务管理方式搭建一个小的项目的更多相关文章

  1. Intellij IDEA采用Maven+Spring MVC+Hibernate的架构搭建一个java web项目

    原文:Java web 项目搭建 Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring ...

  2. Spring框架事务支持模型的优势

    全局事务 全局事务支持对多个事务性资源的操作,通常是关系型数据库和消息队列.应用服务器通过JTA管理全局性事务,API非常烦琐.UserTransaction通常需要从JNDI获取,意味着需要与JND ...

  3. 二十 Spring的事务管理及其API&事务的传播行为,编程式&声明式(xml式&注解式,底层AOP),转账案例

    Spring提供两种事务方式:编程式和声明式(重点) 前者需要手写代码,后者通过配置实现. 事务的回顾: 事务:逻辑上的一组操作,组成这组事务的各个单元,要么全部成功,要么全部失败 事务的特性:ACI ...

  4. Mybatis事务(一)事务管理方式

    Mybatis管理事务是分为两种方式: (1)使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交 (2)使用MANAGED的事务管理机制,这种机制mybat ...

  5. 【Spring】Spring的事务管理 - 2、声明式事务管理(实现基于XML、Annotation的方式。)

    声明式事务管理 文章目录 声明式事务管理 基于XML方式的声明式事务 基于Annotation方式的声明式事务 简单记录 - 简单记录-Java EE企业级应用开发教程(Spring+Spring M ...

  6. spring事务管理方式,aop

    达内12 note unit 09 01 1.spring事务管理 2.spring提供了对事务管理支持 spring采用aop机制完成事务控制 可以实现在不修改原有组件代码情况下实现事务控制功能. ...

  7. Spring事务管理详解_基本原理_事务管理方式

    1. 事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交,那在没有Spring帮我们管理事 ...

  8. 事务有哪些特性?spring的事务管理有几种方式实现,如何实现?

    特性:1.原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做要么全不做 2.一致性:数据不会因为事务的执行而遭到破坏 3.隔离性:一个事物的执行,不受其他事务的干扰,即并发执行的事 ...

  9. Spring的事务管理

    事务 事务:是逻辑上一组操作,要么全都成功,要么全都失败. 事务特性(ACID) 原子性:事务不可分割 一致性:事务执行的前后,数据完整性保持一致 隔离性:一个事务执行的时候,不应该受到其他事务的打扰 ...

随机推荐

  1. sqlite嵌入式数据库简介及特性

    p.p1 { margin: 0; font: 12px "Helvetica Neue"; color: rgba(69, 69, 69, 1) } p.p2 { margin: ...

  2. MP(MyBatis-Plus)实现乐观锁更新功能

    实现步骤 step1:添加乐观锁拦截器 MP的其他拦截器功能可以参考官网 @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { ...

  3. JavaScript入门-学习笔记(二)

    关于js变量 变量,就是一个用来存储数据的容器 一般来说,我们的变量都是可以得先声明,再使用,就像是一个东西先必须存在,才能看得见摸得着.然而在js里(es5),可以先使用,后声明. a = 100; ...

  4. Docker-Docker部署SpringBoot项目

    1.手工方式 1.1.准备Springboot jar项目 将项目打包成jar 1.2.编写Dockerfile FROM java:8 VOLUME /tmp ADD elk-web-1.0-SNA ...

  5. WebRTC ICE 状态与提名处理

    大家都知道奥斯卡有提名,其实在 WebRTC 的 ICE 中也有提名,有常规的提名,也有激进的提名,而且提名的候选人不一定是最优秀的候选人喔,本文就带你一探其中玄妙.文章内容主要描述 RFC 5245 ...

  6. Java 使用拦截器无限转发/重定向无限循环/重定向次数过多报错(StackOverflowError) 解决方案

    说明:当使用拦截器出现"请求转发"无限循环或者"重定向"次数过多这种问题的时候,一般都是 拦截器 设置错了 情况一:请求转发时没有配置排除拦截路径,就是说你访问 ...

  7. Deep Learn I'm back.

    Intorduction: 时隔好几个月,我准备重新进入Deep Learning 的领域.昨天和老师聊了很多,之前觉得我做的工作就是排列组合,在水论文,灌水.但老师却说:这也是为将来的研究打基础. ...

  8. zabbix客户端安装配置

    1.下载,解压并安装zabbixtar zxvf zabbix-2.0.12.tar.gzcd zabbix-2.0.12./configure --prefix=/usr/local/zabbix ...

  9. 使用CDN访问免备案网站

    如何使用CDN绕过服务器域名备案 前言 不得不说,大陆需要备案,时间真的有点长,至少得5天~20天起步,对于我们这些火急火燎的站长还是比较难受的.这里教大家如何使用cdn绕过备案, 访问速度很快,亲测 ...

  10. 【小菜学网络】交换机与MAC地址学习

    上一小节介绍了 集线器 ,一种工作于物理层的简单网络设备.由于集线器采用广播的方式中继.转发物理信号,传输效率受到极大制约. 精准转发 为了解决集线器工作效率低下的尴尬,我们需要设计一种更高级的网络设 ...