• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

Spring学习笔记-第五天:基于注解的AOP开发/JdbcTemplate的概念/Jdbc的开发步骤/Jdbc的常用操作

开发技术 开发技术 2周前 (05-01) 4次浏览

基于注解的AOP开发

快速入门

基于注解的aop开发步骤:

  1. 创建目标接口和目标类
  2. 创建切面类
  3. 将目标类和切面类的对象创建对象权交给Spring-用@Component创建
  4. 在切面类中使用注解配置织入关系
  5. 在配置文件中开启组件扫描 和AOP的自动代理
  6. 测试

实现

1、2步将之前的粘贴过去,完成
3. 将目标类和切面类的对象创建对象权交给Spring-用@Component创建

@Component("myAspect")

  1. 在切面类中使用注解配置织入关系

    1. 通过@Aspect标注当前MyAspect是一个切面
    2. 配置织入,通过注解配置,首先@Before,标注当前函数是什么增强,然后括号内标注切点表达式(省略了Value=)。如:

    @Before("execution(* com.itheima.anno.*.*(..))")

  2. 在配置文件中开启组件扫描 和AOP的自动代理

    1. 配置头文件两个位置,加入context
    2. 设置组件扫描
        <context:component-scan base-package="com.itheima.anno"></context:component-scan>
        <!--aop自动代理-->
        <aop:aspectj-autoproxy/>
    
  3. 测试

注解配置AOP详解

1.注解通知的类型

通知的配置语法:@通知注解(“切点表达式”)

  • 前置通知 @Before
  • 后置通知 @AfterReturning
  • 环绕通知 @Around
  • 异常抛出通知 @AfterThrowing
  • 最终通知 @After
2.切点表达式的抽取

此时也存在通用切点表达式的现象,要进行进一步解耦
同xml配置aop一样,可以进行切点表达式抽取,抽取方式是切面内定义方法,在该方法下使用@Pointcut注解定义切点表达式,然后在增强注解中引用

    @Pointcut("execution(* com.itheima.anno.*.*(..))")
    public void pointcut(){}
    //配置前置增强
    @Before("pointcut()")
    //第二种抽取方法
    @Around("MyAspect.pointcut()")
3.知识要点
  • 注解aop开发步骤
    1. 使用@Aspect标注切面类
    2. 使用@通知注解标注通知方法和切点表达式
    3. 在配置文件中配置aop自动代理和扫描
  • 通知注解类型
    • 前置通知 @Before
    • 后置通知 @AfterReturning
    • 环绕通知 @Around
    • 异常抛出通知 @AfterThrowing
    • 最终通知 @After

JdbcTemplate

JdbcTemplate基本使用

JdbcTemplate概述

它是Spring框架中提供的一个对象,是对Jdbc API的简单封装。Spring框架为我们提供了很多的操作模板类。如操作关系型数据的JdbcTemplate和HibernateTemplate,操作nosql数据库用RedisTemplate
操作消息队列的JmsTemplate

JdbcTemplate开发步骤
  1. 导入spring-jdbc和spring-tx(事务)坐标
  2. 创建数据库表和实体
  3. 创建JdbcTemp对象
  4. 执行数据库操作

  1. 首先在pom.xml中导入坐标

  2. 创建数据库表和对应实体,生成get&set

  3. 创建JdbcTemplate对象
    若执行增删改操作,调用update函数,若进行查询操作,调用quary函数
    同时也得进行数据库连接

    1. 创建数据源对象
    2. 设置JdbcTemplat对象e,并设置数据源对象
    3. 执行操作
            ComboPooledDataSource dataSource=new ComboPooledDataSource();
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setUser("root");
        dataSource.setPassword("123");
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        //设置数据源对象,知道数据库在哪
        jdbcTemplate.setDataSource(dataSource);
        //执行操作
        int row=jdbcTemplate.update("insert into account values (?,?)","Tom","5000");
        System.out.println(row);
    
Spring产生JdbcTemplate对象

我们可以将jdbcTemplate创建权交给Spring,将数据源DataSource的创建权也交给Spring,在Spring容器内部将DataSource注入到JdbcTemplate模板对象中

  1. 配置数据源对象,注入四个参数
  2. Spring产生模板对象,注入数据源对象
    配置过程:
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
        <property name="user" value="root"/>
        <property name="password" value="123"/>
    </bean>
<!--    配置Jdbc模板对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>

注入与测试过程:

@Test
    //测试Spring产生jdbc模板对象
    public void test2() throws Exception{
        ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
        JdbcTemplate jdbcTemplate = app.getBean(JdbcTemplate.class);
        int row=jdbcTemplate.update("insert into account values (?,?)","Zhang","1000");
        System.out.println(row);

    }

这两个过程也可以用注解进行简化

将整个过程进一步抽取

将数据源数据相关配置抽取到properties文件,见之前配置数据源的操作

JdbcTemplate的常用操作
  • 修改操作

  • 删除操作

  • 查询操作
    在进行查询时.query有多个函数,此时常用第一个,RowMapper是进行封装的一个接口,用的时候用该接口对应的实现类,完成数据实体的封装 ctrl+alt+B看它的实现
    查询多个对象时

    List<Account> accountList = jdbcTemplate.query("select * from account", new BeanPropertyRowMapper<Account>(Account.class));
    

    此时,.query第二个参数,是该接口的Bean实现,其中<>内选择其实现类,由于内部写了toString方法,所以可以直接打印。
    查询单个参数时,选择queryForObject中,有args参数的实现

    Account account = jdbcTemplate.queryForObject("select * from account where name=?", new BeanPropertyRowMapper<Account>(Account.class), "Zhang");
    

    当对返回属性有要求时,都需要实体属性的行映射

    查询一些数据如数目等时,选择 requireType的实现,因为此时不需要映射封装,只要把数据强制转换就行

    Long count = jdbcTemplate.queryForObject("select count(*) from account", Long.class);
        System.out.println(count);
    
JdbcTemplate知识要点

创建步骤

  1. 导入spring-jdbc和spring-tx(事务)坐标
  2. 创建数据库表和实体
  3. 创建JdbcTemp对象
  4. 执行数据库操作

喜欢 (0)