首页
友链
Search
1
01-快捷命令
132 阅读
2
寒假计划
128 阅读
3
浏览器规范(ES module)和 node.js 规范(Common JS)
120 阅读
4
03-概念解析
119 阅读
5
学期计划(大三下学期)
102 阅读
计划
算法
面试题
运维
Ansible
Linux
数据库
neo4j
共用
web 前端
CSS
JavaScript
Vue
Node.js
英语单词
工程化
JAVA
mysql
收获
面试
mybatis
Spring
基础
spring-mvc
问题
项目
宠物乐园
速查
问题集
git
学习
sql
二阶段
登录
Search
标签搜索
spring
mysql
vue
ansible
CSS
面试
计划
收获
JAVA面试题
spring-mvc
Starrylsi
累计撰写
106
篇文章
累计收到
37
条评论
首页
栏目
计划
算法
面试题
运维
Ansible
Linux
数据库
neo4j
共用
web 前端
CSS
JavaScript
Vue
Node.js
英语单词
工程化
JAVA
mysql
收获
面试
mybatis
Spring
基础
spring-mvc
问题
项目
宠物乐园
速查
问题集
git
学习
sql
二阶段
页面
友链
搜索到
17
篇与
的结果
2024-09-13
17-Spring-事务的相关...
目标: 了解事务的一些相关内容**1. noRollbackFor和noRollbackForClassName测试不回滚的异常/** * noRollbackFor=ArithmeticException.class 表示当接收到数学异常之后。不回滚<br/> * noRollbackFor=ArithmeticException.class<br/> * noRollbackForClassName="java.lang.ArithmeticException" 表示当接收到指定字符串表示的全类名的异常的时候,不回滚事务 * noRollbackFor 和 noRollbackForClassName * 可以指定某些异常不回滚 * * spring 默认只回滚运行时异常 不回滚检查时异常 */ @Transactional() public void updateTwoTable() { userDao.updateUser(); int i = 12 / 0; bookDao.updateBook(); } 2. 自定义设置回滚异常/** * spring默认回去的是运行时异常RuntimeException和RuntimeException的子异常<br/> * rollbackFor=FileNotFoundException.class 表示FileNotFoundException也会回滚 * rollbackForClassName="java.io.FileNotFoundException" 表示当出现配置字符串所向定的全类名的异常的时候。也会回滚事务 * @throws FileNotFoundException * */ @Transactional() public void updateTwoTable() throws FileNotFoundException { userDao.updateUser(); int i = 0; if (i == 0) {//java.io.FileNotFoundException throw new FileNotFoundException("sadf"); } bookDao.updateBook(); } 3. 事务的只读属性/** * readOnly 如果值为true。表示只支持查询操作。不支持写操作 * <br/>如果设置为false,支持全部 */ @Transactional(readOnly=true) public void updateTwoTable() throws FileNotFoundException { userDao.updateUser(); bookDao.updateBook(); } 4. 事务超时属性timeout(秒为单位)/** * timeout=3表示操作不能超过3秒 */ @Transactional(timeout=3) public void updateTwoTable() throws FileNotFoundException { userDao.updateUser(); try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } bookDao.updateBook(); } 5. 事务的传播特性propagation关键: Required 用于组合事务 requires_new 用于拆分事务,掌握: 理解他们的区别什么是事务的传播行为: 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。 事务的传播行为可以由传播属性指定。Spring定义了7种类传播行为。6. xml配置式事务声明注: 去掉所有@Transaction<!-- 配置DataSourceTransactionManager事务管理器===事务的切面类 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 事物特性 --> <tx:advice id="tx_advice" transaction-manager="transactionManager"> <!-- 配置事务特性 --> <tx:attributes> <tx:method name="multiUpdate" propagation="REQUIRED"/> <tx:method name="updateBook" propagation="REQUIRES_NEW" /> <tx:method name="updateUser" propagation="REQUIRED"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice> <!-- 配置aop代理 --> <aop:config> <aop:advisor advice-ref="tx_advice" pointcut="execution(* com.zhuama.service.*Service.*(..))" /> </aop:config> 7. 8. 9. 总结/** * noRollbackFor 和 noRollbackForClassName * 可以指定某些异常不回滚 * * spring 默认只回滚运行时异常 不回滚检查时异常 * rollbackFor 和 rollbackForClassName * * readOnly 属性 添加后该方法只允许使用查询功能 不允许增删改操作 * * timeout 属性 事务的超时属性 * timeout = 秒数 可以使一个事务如果超过一定时间 提示超时 自动回滚 * * * propagation 属性 事务的传播特性 * 常用的两种 : REQUIRED 标记为当前值的事务 如果执行过程中发现已经有事务了 则使用当前存在的事务 如果没有 则新开启事务 * REQUIRES_NEW 标记为当前值的事务 如果执行过程中发现已有事务了 则暂停(挂起)当前事务 开启一个独立的新事物 * * Required 用于组合事务 requires_new 用于拆分事务 * * */
2024年09月13日
20 阅读
0 评论
0 点赞
2024-09-13
16-Spring-声明式事务
**遇到问题: jar包未构建,数据库驱动与版本不同,数据库默认引擎不是InooDB导致没有事务收获: 编码要规范, 可以配合商家,骑手,客户三个之间的关系理解事物需要了解Mybatis中DAO接口的工作原理概念事务分为声明式和编程式两种:声明式事务:声明式事务是指通过注解的形式对事务的各种特性进行控制和管理。编码式(编程式)事务:指的是通过编码的方式实现事务的声明。1. 声明式事务环境搭建1.1 准备测试数据库##创建tx数据库 drop database if exists `tx`; CREATE database `tx`; ##切换tx数据库 USE `tx`; ##删除用户表 DROP TABLE IF EXISTS `user`; ##创建用户表 CREATE TABLE `user` ( `id` int primary key auto_increment, `username` varchar(50) NOT NULL, `money` int(11) DEFAULT NULL ); ##插入数据 insert into `user`(`username`,`money`) values ('张三',1000),('李四',1000); ##删除图书表 drop table if exists `book`; ##创建图书表 create table `book`( `id` int primary key auto_increment, `name` varchar(500) not null, `stock` int ); ##插入数据 insert into book(`name`,`stock`) values('java编程思想',100),('C++编程思想',100); ##查看数据 select * from book; select * from user;1.2 创建一个java工程,导入jar包// 先导入AOP包,因为Spring的底层事务使用到了aop功能 com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar spring-aop-4.0.0.RELEASE.jar spring-aspects-4.0.0.RELEASE.jar // 导入spring核心包,mybatis包,日志包等; com.springsource.net.sf.cglib-2.2.0.jar commons-logging-1.1.3.jar druid-1.1.10.jar log4j-1.2.17.jar mybatis-3.4.1.jar mybatis-spring-1.3.0.jar mysql-connector-java-8.0.28.jar spring-beans-4.0.0.RELEASE.jar spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jar spring-jdbc-4.0.0.RELEASE.jar spring-orm-4.0.0.RELEASE.jar spring-test-4.0.0.RELEASE.jar spring-tx-4.0.0.RELEASE.jar1.3 Book,User,Servicetop.starrylsi.pojo注意: 需要符合javaBean规范public class Book { private Integer id; private String name; private int stock; public class User { private Integer id; private String username; private int money; DAO(数据访问对象层)关键: 只关注于下sql语句@Repository public class BookDao { @Autowired private JdbcTemplate jdbcTemplate; public int updateBook() { String sql = "update book set name = '**我被修改了!**' where id = 1"; return jdbcTemplate.update(sql); } } @Repository public class UserDao { @Autowired private JdbcTemplate jdbcTemplate; public int updateUser() { String sql = "update user set username = '**我被修改了**' where id = 1"; return jdbcTemplate.update(sql); } }Service(业务逻辑层)关键: 引入DAO层,对数据进一步处理@Service public class TransactionService { @Autowired private UserDao userDao; @Autowired private BookDao bookDao; public void updateTwoTable() { userDao.updateUser(); bookDao.updateBook(); } }1.4 创建并配置四个配置文件config/ db.properties mybatis-config.xml spring.xml log4j.propertiesdb.propertisdb.driverClassName=com.mysql.cj.jdbc.Driver db.url=jdbc:mysql://localhost:3306/tx?rewriteBatchedStatements=true db.username=root db.password=123456 initialSize=10 minIdle=5 maxActive=20 maxWait=5000mybatis-config<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <!-- 按照驼峰命名匹配 --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 配置延迟加载 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 将积极加载配置成消极加载 --> <setting name="aggressiveLazyLoading" value="false"/> </settings> <typeAliases> <package name="top.starrylsi.pojo"/> </typeAliases> </configuration>log4j.propertis# Global logging configuration log4j.rootLogger=DEBUG, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%nspring.xml<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd 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-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> <!-- 扫描注解 排除spring-mvc的注解 --> <context:component-scan base-package="top.starrylsi"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <!-- 加载jdbc配置文件 --> <context:property-placeholder location="classpath:jdbc.properties" /> <!-- 创建数据库连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${db.driverClassName}" /> <property name="url" value="${db.url}" /> <property name="username" value="${db.username}" /> <property name="password" value="${db.password}" /> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 配置mybatis --> <bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis-config.xml" /> <property name="mapperLocations" value="classpath:top/starrylsi/dao/*.xml" /> </bean> <!-- 配置mybatis中使用的dao接口 --> <mybatis-spring:scan base-package="top.starrylsi.dao" /> <!-- 配置spring事务 --> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
2024年09月13日
14 阅读
0 评论
0 点赞
2024-09-12
15-Spring-AOP-切入点表达式
/** * 切入点表达式 : * 在四个通知注解中添加的字符串 * 固定语法 : "execution(权限修饰符 返回值类型 全包名.类名.方法名(形参类型1,形参类型2,...))" * * 1.由于spring只支持拦截public方法 权限修饰符=public 可略 * * 2.返回值类型只有两种写法 1.精确指定返回值类型 2.* *代表所有数据类型 * * 3.包名允许编写完整包名 也可以编写com.*.包名 * * 4.包中的类名可以指定类名 也可以使用 * 代表当前包下的所有类 * * 5.方法名可以指定方法名 也可以使用 * 代表当前类下的所有方法名 也可以使用 方法名的前缀+*配合指定所有同类型方法 * 例如 : addStudent addTeacher addBook add* * 6.形参可以指定形参 也可以使用 ..代表所有的形参 * * 通常情况下 使用偏精确的匹配比较多 * * 一般要匹配service层的内容 * * 模糊匹配 : * execution(* *(..)) 匹配任意返回值 任意包 任意类名 任意方法 任意形参 * execution(* *.*(..)) 匹配任意类名.方法名 任意形参 * * 注:一般不使用 匹配的内容过多 * * 切入点表达式中允许使用 && 或者 || 运算符 * && 表示需要同时满足两个切入点表达式 * || 表示满足一个表达式则直接匹配 * * */图解AOP专业术语
2024年09月12日
16 阅读
0 评论
0 点赞
2024-09-12
14-Spring-AOP-使用Spring实现AOP简单切面编程
需要导入工程的jar包Spring的核心包 spring-beans-4.0.0.RELEASE.jar spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jar Spring的测试包 spring-test-4.0.0.RELEASE.jar Spring日记相关包 commons-logging-1.1.3.jar log4j-1.2.17.jar Spring的AOP切面相关的包 spring-aop-4.0.0.RELEASE.jar spring-aspects-4.0.0.RELEASE.jar com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
2024年09月12日
13 阅读
0 评论
0 点赞
2024-09-12
13-Spring-AOP-计数功能加日记功能-cglib动态代理
优点:在没有接口的情况下,同样可以实现代理的效果。缺点:同样需要自己编码实现代理全部过程。但是为了更好的整合Spring框架使用。所以我们需要学习一下Spring 的AOP 功能。也就是学习Spring提供的AOP功能。{dotted startColor="#ff6c6c" endColor="#1989fa"/}package top.starrylsi.cglib; import net.sf.cglib.proxy.Enhancer; public class cglibProxyFactory { public static Object getProxy(Object target) { //1. 创建cglib执行器 Enhancer enhancer = new Enhancer(); //2. 指定被代理类是代理类的父类(子类可以继承父类的方法) enhancer.setSuperclass(target.getClass()); //3. 指定处理方式 enhancer.setCallback(new CglibInterceptor()); //4. 生成代理对象 return enhancer; } }package top.starrylsi.cglib; import static org.hamcrest.CoreMatchers.nullValue; import java.lang.reflect.Method; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import top.starrylsi.utils.LogUtils; public class CglibInterceptor implements MethodInterceptor { @Override public Object intercept(Object target, Method method, Object[] params, MethodProxy methodProxy) throws Throwable { //1.获取方法名 String methodName = method.getName(); //2.执行前置日志 LogUtils.logBefore(methodName, params); //3.声明结果 Object result = null; try { //4.执行方法并获取返回值 result = methodProxy.invokeSuper(target, params); } catch (Exception e) { //5.异常日志 LogUtils.logThrowing(methodName, e); }finally { //6.后置日志 LogUtils.logAfter(methodName); } //7.返回执行结果 if(result !=null) { LogUtils.logAfterReturing(methodName, result); } return null; } } 实现日记功能总结介绍aop的实现方式aop有两种实现方式 JDK动态代理和cglib代理jdk-->proxy类, InvocationHandler,需要接口cglib-->enhancer类,MethodInterceptor,需要类
2024年09月12日
12 阅读
0 评论
0 点赞
1
2
...
4