(三、)Spring框架—事务&JDBC模板
Spring的基于ApsectJ的注解的AOP开发
- 创建项目,引入jar包
- 引入配置文件
- 编写目标类并配置
<!-- 配置目标类 -->
<bean id="OrderDao" class="com.itheima.spring.demo1.OrderDao" >
</bean>
- 编写切面类并配置
<!-- 将切面类交给Spring管理 -->
<bean id="myAspect" class="com.itheima.spring.demo1.MyAspectAnno">
</bean>
- 使用注解的AOP对象目标类进行增强
- 在配置文件中打开注解的AOP开发
<!-- 在配置文件中开启注解的AOP的开发 -->
<aop:aspectj-autoproxy/>
- 在切面类上使用注解
/*
* 切面类:注解的切面类
* ***/
@Aspect
public class MyAspectAnno {
@Before(value="execution(* com.itheima.spring.demo1.OrderDao.save(..) )")
public void before() {
System.out.println("前置增强-----");
}
}
- 编写测试类
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDemo1 {
@Resource(name="orderDao")
public OrderDao orderDao;
@Test
public void demo1() {
orderDao.save();
orderDao.update();
orderDao.find();
orderDao.delete();
}
Spring的注解的AOP的通知类型:
注解 | 通知类型 |
---|---|
@Before | 前置通知 |
@AfterReturning | 后置通知 |
@Around | 环绕通知 |
@AfterThrowing | 异常抛出通知 |
@After | 最终通知 |
Spring的AOP的注解切入点的配置
Spring的JDBC的模板
Spring是EE开发的一站式的框架,有EE开发的每层的解决方案。Spring对持久层也提供了解决方案:ORM模块和JDBC的模板。
Spring提供了很多的模板用于简化开发:
JDBC模板使用的入门
1.创建项目,引入jar包
- 引入基本开发包:
- 数据库驱动
- Spring的JDBC模板的jar包
- 创建数据库和表
- 使用JDBC的模板:保存数据
/*
* JDBC模版的使用
* ****/
public class JdbcDemo1 {
@Test
//jdbc模版的使用类似于DButils
public void demo1() {
//创建连接池
DriverManagerDataSource dataSource =new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///spring4_day03");
dataSource.setUsername("root");
dataSource.setPassword("");
//创建JDBC模版
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql ="insert into account values (null,?,?)";
jdbcTemplate.update(sql, "立冬",10000d);
}
}
4.将连接池和模板交给Spring管理
5.使用Jdbc的模板
引入spring_aop的jar包
使用开源的数据库连接池:
C3P0的使用:
引入c3p0连接池jar包
配置c3p0连接池
抽取配置到属性文件
在Spring的配置文件中引入属性文件:
使用JDBC的模板完成CRUD的操作
1.保存操作
2.修改操作
3.删除操作
4.查询操作
- 查询某个属性
- 查询返回对象或集合
- 数据封装
public class Account {
private Integer id;
private String name;
private Double money;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
@Override
public String toString() {
return "Account [id=" + id + ", name=" + name + ", money=" + money + "]";
}
}
import com.itheima.jdbc.domain.Account;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class JdbcDemo2 {
@Resource(name="jdbcTemplate")
private JdbcTemplate jdbcTemplate;
@Test
// 保存操作
public void demo1(){
jdbcTemplate.update("insert into account values (null,?,?)", "何菊花",10000d);
}
@Test
// 修改操作
public void demo2(){
jdbcTemplate.update("update account set name = ? ,money = ? where id = ?", "何巨涛",2000d,6);
}
@Test
// 删除操作
public void demo3(){
jdbcTemplate.update("delete from account where id = ?", 6);
}
@Test
// 查询操作:
public void demo4(){
String name = jdbcTemplate.queryForObject("select name from account where id = ?", String.class, 5);
System.out.println(name);
}
@Test
// 统计查询
public void demo5(){
Long count = jdbcTemplate.queryForObject("select count(*) from account", Long.class);
System.out.println(count);
}
@Test
// 封装到一个对象中
public void demo6(){
Account account = jdbcTemplate.queryForObject("select * from account where id = ?", new MyRowMapper(), 5);
System.out.println(account);
}
@Test
// 查询多条记录
public void demo7(){
List<Account> list = jdbcTemplate.query("select * from account", new MyRowMapper());
for (Account account : list) {
System.out.println(account);
}
}
class MyRowMapper implements RowMapper<Account>{
@Override
public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
Account account = new Account();
account.setId(rs.getInt("id"));
account.setName(rs.getString("name"));
account.setMoney(rs.getDouble("money"));
return account;
}
}
}