补充上一篇未发的东西
1. 开始注解模式
2. 注解切面
再通知上面加上一个注解@Aspect
@Aspect
public class MyAdvice
再通知的方法上面加上切点
五种
@Before(表达式)@AfterReturning @Around
@After @AfterThrowing
@Before("MyAdvice.pc()")
publicvoid before(){
System.out.println("在目标对象方法前调用");
}
书写表达式有两种
1. 直接写
@ Before ("execution(*cn.hd.springProxyAnnotation.impl.*ServiceImpl.*(..))")
public voidbefore(){
System.out.println("在目标对象方法前调用");
}
2. 配置一个切点 调用该类的方法获得切点
@Pointcut("execution(* cn.hd.springProxyAnnotation.impl.*ServiceImpl.*(..))")
publicvoid pc(){
}
@Before("MyAdvice.pc()")
publicvoid before(){
System.out.println("在目标对象方法前调用");
Spring是一个容器
Spring有一个JAR包提供了一个叫做JDBCTemplate模板所以他能对数据库操作。
Spring还提供了很多模板 针对hebernate,Mybatis模板。JDBCemplate跟Dbutols中的QueryRunner极度相似
整合JDBC
1. 导包
2. c3p0,JDBC驱动包 Spring-jdbc spring-tx
3 使用一个JdbcTemplate模板对数据库进行操作,需要数据库连接
给他连接两种方式 1.Connection 2.dataSource
public void fun() throwsPropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/springjdbc");
dataSource.setUser("root");
dataSource.setPassword("123");
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
String sql="INSERT INTOt_user(uname,ubalance) VALUES ('白学光',12138)";
jdbcTemplate.update(sql);
Spring管理对象的方式
UserDao接口 UserDaoImpl实现类 applicationContext.xml
使用spring管理对象开发,一定要搞清楚对象之间的依赖关系。
将对应的bean类配置到配置文件当中 将属性的注入写好
JdbcTemplateApi
增删改:调用Jdbctemplate update方法 如果有参数直接按顺序写在方法后面即可
jdbcTemplate.update(sql, user.getUname(),user.getUbalance());
查询:调用jdbctemplate query方法 参数同上。结果集的处理,要传一个RewMapper内名内部类
List
() {
@Nullable
@Override
public User mapRow(ResultSet resultSet, int i) throws SQLException {
User user = new User();
user.setUname(resultSet.getString("uname"));
user.setUbalance(resultSet.getInt("ubalance"));
user.setUid(resultSet.getInt("uid"));
return user;
}
});
return list;
spring提供了一个父类JdbcDaoSupport这个父类中,提供了jdbcTemplate模板
在实现dao类时可以直接使用。并且在配置bean时,依赖关系改变,dao类时直接依赖于
dataSource。
db,properties 书写配置文件要注意 健名要加前缀,避免和关键字重复
如何读取配置文件在applicationContext.xml中加上一条配置
location是配置文件的地址
获得配置文件的地址
PlatformTransactionManager 帮助我们管理任意平台的事务
Jdbc DataSourceTransactionManger
hibernate hibernateTransactionManager
… …TransactionManager
事务:四大特性(在前几篇文章已经发过在这里不多做解释)
(1) 一致性 (2)原子性(3)持久性 (4)隔离性
事务安全:
事务线程安全:脏读 不可重复读 幻读 读未提交
隔离级别: 1 2 4(读已提交) 8
所有事务的操作有三步:
开启事务
提交事务
回滚事务
Spring管理事务 利用的是spring aop思维 将事务的操作织入到目标对象中
Spring管理 事务的属性
隔离级别 是否只读 事务的传播行为(7种)
Spring管理事务的方式:
(1) 代码式
1. 配置事务管理对象
2. 配置事务管理的模板
3. 在service中注入模板对象 然后调用模板对象的execute
@Resource(name = "transactionTemplate")
privateTransactionTemplate tt;
@Override
publicvoid transform(Integer form, Integer to, Integer money) {
tt.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatustransactionStatus) {
userDao.increase(to,money);
userDao.decrease(form,money);
}
});
(2) xml配置
1. 事务管理的对象
2. 事务的通知
标签名 tx:advice id给当前的事务起个标记 tran…配置刚刚的事务管理对象
配置参数:method name 可以是具体某个方法(方法名)比较麻烦
可以使用通配符的方法去配置
add* delate* update*get*
find* persist* remove*modify*
要求的你service的命名必须规范
Isolation 隔离级别使用默认即可 4级别 Default
Propagation事务的传播行为 required
read-only是否只读 如果查找 true 否则为false
3. 将通知织入到目标对象 注意配置切面不再使用aop:aspect而是advisor
(3) 注解配置
1. 事务管理对象
2. 注解
3. 在想要设置事务的地方加上注解
@Transactional(isolation =Isolation.DEFAULT,propagation = Propagation.REQUIRED,readOnly = false)
这个注解有两个位置
1.在类上面 该类中所有的方法都会使用以上参数的事务
2.方法名上面 该方法使用参数中的事务如果两个都设置以方法名上面的事务为准