Spring(三)——Java代码配置 AOP、JdbcTemplate 简单配置(java代码和xml配置)、加载properties 配置文件、事物隔离级别、Spring 事务(编程式、声明式)
一、Java 代码配置 AOP
1、依赖导入
先导入需要的依赖:
2、代码实现
首先还是接口:
然后是实现类:
接着就是切面代码:
然后是测试代码:
运行结果就不贴图了。
3、优化切点定义
可以看到那五个通知定义切点那里,每一个都要写路径,很麻烦,而 xml 配置那里可以有 ref 引用。Java 代码配置当然也有类似的引用方式:
然后后面的通知都引用这个路径:
运行结果没毛病。
后面一些框架中的特点都是通过 AOP 来实现的,后面遇到的时候再提。
二、JdbcTemplate 简单配置(Java代码)
这个玩意可以简略载入数据库的操作,只需要最核心的部分,比如 url、账号和密码。
1、依赖导入
提个醒:mysql 高驱动版本可以兼容低驱动版本。
2、简单的增加操作
这里举例简单的增加操作,删除跟修改差不多:
首先是 JavaConfig 配置:
然后 UserDao 的代码:
然后是测试的代码:
结果:
成功运行。
3、查询(最原始的写法)
这里最原始的写法跟 jsp 那里差不多,也是把 ResultSet 给了我们,然后自己取需要的数值:
然后测试代码:
然后运行结果:
4、单个查询(BeanPropertyRowMapper方法)
然后就是里面封装好的方法
测试代码:
然后结果:
用这个方法时要注意实体类的有参构造跟无参构造都要弄出来。
5、多个查询(BeanPropertyRowMapper)
查询一堆数据,用 List 装着:
测试代码:
结果:
三、JdbcTemplate 简单配置(xml 配置)
首先先给 jdbcTemplate 弄个 set 方法:
然后是 xml 配置:
接着测试代码和结果:
四、加载 properties 配置文件(Spring 的属性注入)
1、xml 配置文件加载
以前学习 java 时经常有用到配置文件,到了 Spring 这依然有方法使用这配置文件。
先来看配置文件:
然后是 xml 配置文件:
其他的跟上面的一样,运行结果能够成功。
2、Java 代码加载
同样的,也有需求是通过 Java 代码去加载这个配置文件。
这样的话要改动 JavaConfig 里面的代码:
接着再次运行,还是可以成功!
这样一来,只要改动配置文件的信息就可以改动加载的信息。
值得注意的是,这两个方法不一定要完全隔离开来使用,可以交叉使用,比如 java 代码用一部分,另外一部分交给 xml 配置文件去完成也是可以的。
五、事物隔离级别
1、事务隔离级别介绍
2、脏读、不可重复度和幻读的介绍
先介绍一下这三个是什么玩意。
一般来说,手动开启事务以后,中间干了再多的操作,最后没有提交数据,数据是不会发生改变的。
a、脏读
一个事务读到另外一个事务还没有提交的数据,称之为脏读。
再详细解释下:A事务干了很多操作,但是还没有提交,这个时候B事务读到了这个A事务发生变化的数据,这个就称为脏读。
b、不可重复读
不可重复读是指一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
这个通过下面例子来解释:
这个重点在于,B窗口是开启了事务以后再查询,且查询了两次,第一次查询的时候A窗口没有操作;第二次查询的时候A窗口已经执行完转账操作;但是B窗口在没有提交以前,两次查询的数据不一致。期望的效果是:B窗口提交以前,两次的查询结果应该是一致的才对。这个案例出现的问题就称为不可重复读。
c、幻读(另外一个说法是虚读)
幻读和不可重复读非常像,看名字就是产生幻觉了。
看例子:
说白了就是因为脏读才看到的数据,但是没法进行某些操作。这个问题就是幻读。
3、不同隔离级别对应的不同的问题
不同的隔离级别能够解决的问题也不同:
mysql 默认级别是安全等级第二级别的 REPEATABLE READ。
性能关系如图:
最高级别固然最安全,但是性能也最低,效率最慢,里面的事务是一个一个排着队来解决的。
4、后语
要注意的是:隔离级别低的访问其他隔离级别高的才会出现问题,如果是隔离级别高的访问隔离级别低的不会出现问题。
六、Spring 事务
1、什么是事务
注意:mysql 自己的数据库引擎是 myisam ,innodb 是相当于第三方的引擎。
2、事务的特性(ACID)
Spring 支持两种方式的事务管理:编程式事务管理和声明式事务管理。用的多的是声明式事务管理
3、编程式事务管理
编程式事务管理有两种方法:一种是 TransactionTemplete 实现,另外一种是 TransactionManager 。
这里举的例子还是经典转账案例:
准备工作:
依赖导入:
配置文件:
xml配置文件:
数据库数据:
dao层:
service层:
a、TransactionTemplete
然后先是 xml 配置:
接着 service 层:
然后运行结果有异常能正常回滚,无异常能正常交易!
b、Transaction Manager
只需要改动部分代码即可:
service 层:
然后注册:
然后写事务代码:
然后运行,都没有问题。
c、小结
编程式事务有个很明显的缺点就是动了原业务的代码,需要把代码放到事务代码里面去才能执行(侵入式)。
4、声明式事务(用的多)
a、xml 配置声明式事务
首先,先导入依赖:
然后就是 dao 层:
一个加钱的一个减钱的。
然后是 service 层:
然后数据库配置文件:
接着就是 xml 配置文件的配置了(注意看注释):
xml 配置声明式事务三大步骤:
1.配置数据源 DataSource
2.配置事务管理器
3.配置事务拦截规则
4.配置 AOP
最后就是测试代码:
最终结果没有问题。
b、Java 代码和 xml 文件混合配置声明式事务
先说结论:Java代码配置的事务主要是注解,但注解其实也算是一种代码侵入了。
代码基本不用怎么改,不过这里还是截图下:
dao 层代码和测试代码不变。
xml 文件配置:
最后就是 service 层代码:
最终运行没有问题。
c、纯 Java 代码配置声明式事务
dao 层和 service 层代码不变。
既然是 Java 代码配置就少不了 Javaconfig 这个文件了。这个 Java 代码配置跟 xml 文件配置是一一对应的: