网站推广一般怎么做,免费网站空间申请哪个好,株洲网站建设的公司,购物商城建设网站声明式事务
从之前的事务控制的代码中可以看出#xff0c;是有规律可循#xff0c;代码的结构基本是确定的#xff0c;所以框架就可以将固定模式的代码抽取出来#xff0c;进行相关的封装。
封装起来后#xff0c;我们只需要在配置文件中进行简单的配置即可完成操作。
…声明式事务
从之前的事务控制的代码中可以看出是有规律可循代码的结构基本是确定的所以框架就可以将固定模式的代码抽取出来进行相关的封装。
封装起来后我们只需要在配置文件中进行简单的配置即可完成操作。
好处1提高开发效率好处2消除了冗余的代码好处3框架会综合考虑相关领域中在实际开发环境下有可能遇到的各种问题进行了健壮性、性 能等各个方面的优化
所以我们可以总结下面两个概念
编程式自己写代码实现功能声明式通过配置让框架实现功能
基于注解的声明式事务
添加驱动依赖 dependencies!-- 基于Maven依赖传递性导入spring-context依赖即可导入当前所需所有jar包 --dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.3.1/version/dependency!-- Spring 持久化层支持jar包 --!-- Spring 在执行持久化层操作、与持久化层技术进行整合过程中需要使用orm、jdbc、tx三个jar包 --!-- 导入 orm 包就可以通过 Maven 的依赖传递性把其他两个也导入 --dependencygroupIdorg.springframework/groupIdartifactIdspring-orm/artifactIdversion5.3.1/version/dependency!-- Spring 测试相关 --dependencygroupIdorg.springframework/groupIdartifactIdspring-test/artifactIdversion5.3.1/version/dependency!-- junit测试 --dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependency!-- MySQL驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.31/version/dependency!-- 数据源 --dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.0.31/version/dependency!-- 添加lombok驱动--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.16/version/dependency/dependencies创建jdbc.properties
jdbc.drivercom.mysql.cj.jdbc.Driver
jdbc.urljdbc:mysql://localhost:3306/ssm?serverTimeUTC
jdbc.usernameroot
jdbc.passwordroot配置文件
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd!-- 引入jdbc.properties--context:property-placeholder locationclasspath:jdbc.properties/context:property-placeholder!--配置德鲁伊--bean iddataSource classcom.alibaba.druid.pool.DruidDataSourceproperty namedriverClassName value${jdbc.driver}/propertyproperty nameurl value${jdbc.url}/propertyproperty nameusername value${jdbc.username}/propertyproperty namepassword value${jdbc.password}/property/beanbean classorg.springframework.jdbc.core.JdbcTemplateproperty namedataSource refdataSource/property/bean
/beans创建数据库表
--Table structure for t_book
-- ----------------------------
DROP TABLE IF EXISTS t_book;
CREATE TABLE t_book (book_id int NOT NULL AUTO_INCREMENT COMMENT 主键,book_name varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT 图书名称,price int NULL DEFAULT NULL COMMENT 价格,stock int UNSIGNED NULL DEFAULT NULL COMMENT 库存无符号,PRIMARY KEY (book_id) USING BTREE
) ENGINE InnoDB AUTO_INCREMENT 3 CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci ROW_FORMAT Dynamic;-- ----------------------------
-- Records of t_book
-- ----------------------------
INSERT INTO t_book VALUES (1, 斗破苍\r\n穹, 80, 98);
INSERT INTO t_book VALUES (2, 斗罗大陆, 50, 99);SET FOREIGN_KEY_CHECKS 1;
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS t_user;
CREATE TABLE t_user (user_id int NOT NULL AUTO_INCREMENT COMMENT 主键,username varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT 用户名,balance int UNSIGNED NULL DEFAULT NULL COMMENT 余额无符号,PRIMARY KEY (user_id) USING BTREE
) ENGINE InnoDB AUTO_INCREMENT 2 CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci ROW_FORMAT Dynamic;-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO t_user VALUES (1, admin, 20);
INSERT INTO t_user VALUES (2, 二哈, 9950);SET FOREIGN_KEY_CHECKS 1;创建测试代码
BookController
package com.hyh.spring.controller;import com.hyh.spring.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;/*** version 1.0* BelongsProject:IntelliJ IDEA* BelongsPackage:com.hyh.spring.controller* Author:hyhWTX* ClassName:BookController* CreateTime:2022年-12月-31日 21:49* Description: TODO (一句话描述以下该类的功能)*/
Controller
public class BookController {Autowiredprivate BookService bookService;public void buyBook(Integer userId,Integer bookId ){bookService.buyBook(userId,bookId);}
}
BookDao
package com.hyh.spring.dao;/*** version 1.0* BelongsProject:IntelliJ IDEA* BelongsPackage:com.hyh.spring.dao* Author:hyhWTX* ClassName:BookDao* CreateTime:2022年-12月-31日 21:50* Description: TODO (一句话描述以下该类的功能)*/
public interface BookDao {/*** Description:根据图书ID查询图书价格* param bookId* return Integer*/Integer getPriceByBookId(Integer bookId);/*** Description:更新图书的库存* param bookId*/void updateStock(Integer bookId);/*** Description:更新用户的余额* param userId* param price*/void updateBalance(Integer userId, Integer price);
}
BookDaoImpl
package com.hyh.spring.dao.impl;import com.hyh.spring.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;/*** version 1.0* BelongsProject:IntelliJ IDEA* BelongsPackage:com.hyh.spring.dao.impl* Author:hyhWTX* ClassName:BookDaoImpl* CreateTime:2022年-12月-31日 21:50* Description: TODO (一句话描述以下该类的功能)*/
Repository
public class BookDaoImpl implements BookDao {Autowiredprivate JdbcTemplate jdbcTemplate;Overridepublic Integer getPriceByBookId(Integer bookId) {String sql select price from t_book where book_id ?;return jdbcTemplate.queryForObject(sql,Integer.class,bookId);}Overridepublic void updateStock(Integer bookId) {String sql update t_book set stock stock-1 where book_id ?;jdbcTemplate.update(sql,bookId);}Overridepublic void updateBalance(Integer userId, Integer price) {String sql update t_user set balance balance -? where user_id ?;jdbcTemplate.update(sql,price,userId);}
}
User
package com.hyh.spring.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** version 1.0* BelongsProject:IntelliJ IDEA* BelongsPackage:com.hyh.spring.model* Author:hyhWTX* ClassName:User* CreateTime:2022年-12月-31日 18:21* Description: TODO (一句话描述以下该类的功能)*/
//Data:注解是lombok中的注解用于针对属性自动生成set和get方法、无参数的构造方法、toString、equals、hashcode
Data
//生成带有所有参数的构造方法
AllArgsConstructor
//生成无参数的构造方法
NoArgsConstructor
public class User {//用户idprivate Integer id;//用户姓名private String username;//用户密码private String password;//用户年龄private Integer age;//用户性别private String gender;//用户emailprivate String email;
}BookService
package com.hyh.spring.service;/*** version 1.0* BelongsProject:IntelliJ IDEA* BelongsPackage:com.hyh.spring.service* Author:hyhWTX* ClassName:BookService* CreateTime:2022年-12月-31日 21:49* Description: TODO (一句话描述以下该类的功能)*/
public interface BookService {/*** Description: 买书* param userId* param bookId*/void buyBook(Integer userId, Integer bookId);
}
BookSerViceImpl
package com.hyh.spring.service.impl;import com.hyh.spring.dao.BookDao;
import com.hyh.spring.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.concurrent.TimeUnit;/*** version 1.0* BelongsProject:IntelliJ IDEA* BelongsPackage:com.hyh.spring.service.impl* Author:hyhWTX* ClassName:BookSerViceImpl* CreateTime:2022年-12月-31日 21:49* Description: TODO (一句话描述以下该类的功能)*/
Service
Transactionalpublic class BookSerViceImpl implements BookService {Autowiredprivate BookDao bookDao;Overridepublic void buyBook(Integer userId, Integer bookId) {//查询图书的价格Integer price bookDao.getPriceByBookId(bookId);//更新图书的库存假设每次只买一本书bookDao.updateStock(bookId);//更新用户的余额bookDao.updateBalance(userId,price);}
}