Spring框架总结(三)
一、基于aspectj的注解Aop操作
1、创建对象
<!-- 配置对象 --> <bean id="book" class="cn.wyd.aop.Book"></bean> <bean id="myBook" class="cn.wyd.aop.MyBook"></bean>
2、在spring核心配置文件中,开启aop操作
<!-- 开启aop操作 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
3、在增强类上面使用注解完成aop操作
@Aspect public class MyBook { //在方法上面使用注解完成增强配置 @Before(value="execution(* cn.wyd.aop.Book.*(..))") private void before1() { System.out.println("before.........."); } }
二、Spring的jdbcTemplate操作
- 1、spring框架一站式框架
- (1)针对javaee三层,每一层都有解决技术
- (2)在dao层,使用 jdbcTemplate
- 2、spring对不同的持久化层技术都进行封装
- jdbcTemplate对jdbc进行封装
- jdbcTemplate对jdbc进行封装
- 3、jdbcTemplate使用和dbutils使用很相似,都数据库进行crud操作
增加
- 1、导入jdbcTemplate使用的jar包
- 2、创建对象,设置数据库信息
- 3、创建jdbcTemplate对象,设置数据源
- 4、调用jdbcTemplate对象里面的方法实现操作
//1、增加操作
@Test
public void add() {
//1、设置数据库信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3305/spring_day03");
dataSource.setUsername("root");
dataSource.setPassword("1211124");
//2、创建jdbcTemplate对象 设置数据源
JdbcTemplate jt = new JdbcTemplate(dataSource);
//3、调用jdbc里面的方法实现操作
//创建你sql语句
String sql = "insert into user value(NULL,?,?)";
int row = jt.update(sql, "Lucy","250");
System.out.println(row);
}
修改
//2、更新操作
@Test
public void update() {
//设置基本信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3305/spring_day03");
dataSource.setUsername("root");
dataSource.setPassword("1211124");
//创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//调用里面的方法
//sql语句
String sql = "update user set passWord=? where userName=?";
int rows = jdbcTemplate.update(sql, "1314","lucy");
System.out.println(rows);
}
删除
//3、删除操作
@Test
public void delete() {
//设置数据信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3305/spring_day03");
dataSource.setUsername("root");
dataSource.setPassword("1211124");
//创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//调用里面的方法 执行对应的sql语句、
String sql = "delete from user where userName=?";
int row = jdbcTemplate.update(sql,"lucy");
System.out.println(row);
}
查询
- 1、 使用jdbcTemplate实现查询操作
2、查询具体实现
2.1、查询返回某一个值(第一个参数是sql语句、第二个参数 返回类型的class
)
@Test public void selectCount() { //1、设置数据库信息 DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3305/spring_day03"); dataSource.setUsername("root"); dataSource.setPassword("1211124"); //2、创建jdbcTemplate对象 设置数据源 JdbcTemplate jt = new JdbcTemplate(dataSource); //3、调用jdbc里面的方法实现操作 //创建你sql语句 String sql = "select COUNT(*) from user"; int row = jt.queryForObject(sql,Integer.class); System.out.println(row); }
2.2、查询返回对象(第一个参数是sql语句、第二个参数是 RowMapper,是接口,类似于dbutils里面接口、第三个参数是 可变参数)
- 2.3查询返回list集合(sql语句、RowMapper接口,自己写类实现数据封装、可变参数)
三、Spring配置连接池和dao使用jdbcTemplate
spring配置c3p0连接池
- 第一步导入jar包
第二步 创建spring配置文件,配置连接池(把代码在配置文件中进行配置)
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 注入属性 --> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://localhost:3305/spring_day03"></property> <property name="user" value="root"></property> <property name="password" value="1211124"></property> </bean>
dao使用jdbcTemplate
创建service和dao,配置service和dao对象,在service注入dao对象
<bean id="userService" class="cn.wyd.c3p0.UserService"> <!-- 注入dao对象 --> <property name="userDao" ref="userDao"></property> </bean> <bean id="userDao" class="cn.wyd.c3p0.UserDao">
创建jdbcTemplate对象,把模板对象注入到dao里面
private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; }
<bean id="userDao" class="cn.wyd.c3p0.UserDao"> <property name="jdbcTemplate" ref="jdbcTemplate"></property> </bean> <!-- 添加JdbcTemplate对象 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
在jdbcTemplate对象里面注入dataSource
<!-- 添加JdbcTemplate对象 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!-- 注入dataSource --> <property name="dataSource" ref="dataSource"></property> </bean>
四、Spring的事务管理
Spring事务管理api
- 1、spring事务管理两种方式
- 第一种 编程式事务管理(不用)
- 第二种 声明式事务管理
- (1) 基于xml配置文件实现
- (2) 基于注解实现
- 2、spring事务管理的api介绍
- spring针对不同的dao层框架,提供接口不同的实现类
- 首先 配置事务管理器
- spring针对不同的dao层框架,提供接口不同的实现类
搭建转账环境(小王转账1000给小马; 小王少1000,小马多1000)
- 创建数据库表,添加数据
创建service和dao类,完成注入关系
<!-- 注入对象类型属性 --> <bean id="orderService" class="cn.wyd.service.OrderService"> <property name="orderDao" ref="orderDao"></property> </bean> <bean id="orderDao" class="cn.wyd.dao.OrderDao"> <property name="jdbcTemplate" ref="jdbcTemplate"></property> </bean> <!-- 配置JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean>
注意:service层又叫业务逻辑层 ;dao层,单纯对数据库操作层,在dao层不添加业务
//转账 //转出 public void lessSalary() { String sql = "update salary set salary=salary-? where name=?"; jdbcTemplate.update(sql, "1000","小明"); } //转入 public void moreSalary() { String sql = "update salary set salary=salary+? where name=?"; jdbcTemplate.update(sql, "1000","小张"); }
调用dao的方法
//开启转账业务 public void transationSalary() { //转出 orderDao.lessSalary(); int i = 10/0; //转入 orderDao.moreSalary(); }
- 产生问题:
- 如果小王少了1000之后,出现异常,小马不会多1000,钱丢失了
- 解决:
- 添加事务解决,出现异常进行回滚操作
声明式事务管理(xml配置)
配置文件方式使用aop思想配置
配置事务管理器
<!-- 1、配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入dataSource --> <property name="dataSource" ref="dataSource"></property> </bean>
配置事务增强
<!-- 2、配置事务增强 --> <tx:advice id="txadvice" transaction-manager="transactionManager"> <!-- 事务操作 --> <tx:attributes> <!-- 设置进行事务操作的方法设置匹配规则 transation*:transation表示开头的所有方法--> <tx:method name="transation*"/> </tx:attributes> </tx:advice>
配置切面
<!-- 配置切面 --> <aop:config> <!-- 切入点 --> <aop:pointcut expression="execution(* cn.wyd.service.OrderService.*(..))" id="pointcut1"/> <!-- 配置切面 --> <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/> </aop:config>
声明式事务管理(注解)
第一步 配置事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入dataSource --> <property name="dataSource" ref="dataSource"></property> </bean>
第二步 配置事务注解
<!-- 2、开启事务注解 --> <tx:annotation-driven transaction-manager="transactionManager"/>
- 第三步 在要使用事务的方法所在类上面添加注解
//开启转账业务 @Transactional public void transationSalary() { //转出 orderDao.lessSalary(); int i = 10/0; //转入 orderDao.moreSalary(); }