Spring与Junit的整合(Spring中的AOP、Spring整合JDBC、Spring整合Dao、UserDaoImpl,JdbcTemplate,DataSource之间的依赖关系)

Spring与Junit的整合

  1. pom文件中导入junit

  2. 写代码

        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
        </dependency>
    
    //创建Spring容器
    @RunWith(SpringJUnit4ClassRunner.class)
    //指定配置文件
    @ContextConfiguration("classpath:applicationContext.xml")
    public class Test3 {
    
        @Autowired
        private UserController uc;
    
        @Test
        public void test(){
           uc.login();
        }
    }
    

Spring中的AOP

概念

  • Spring可以为容器中的对象生成动态代理对象。

原理

  • 动态代理
    • JDK原生的
    • 被代理对象必须有接口,才能产生代理对象。如果类没有接口,使用cglib代理。代理原理:被代理对象与代理对象实现同一个接口。
  • cglib代理
    • 导入第三方jar
    • 被代理对象的类不能是final类。代理原理是对被代理对象进行继承。

AOP名词

AOP开发

  1. 准备目标对象

    public class UserServiceImpl implements UserService{
        @Override
        public void addUser() {
            System.out.println("新增用户");
        }
    
        @Override
        public void deleteUserById() {
            System.out.println("删除用户");
        }
    
        @Override
        public void updateUserById() {
            System.out.println("修改用户");
        }
    
        @Override
        public void queryUserById() {
            System.out.println("查询用户");
        }
    }
    
  2. 准备通知

    package com.yunhe.advice;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    
    //通知类
    public class MyAdvice {
        /*
        前置通知
            目标方法执行之前调用
    
        后置通知(目标方法如果发生异常,不调用)
            在目标方法执行之后调用
    
        环绕通知
            在目标方法之前和之后调用
    
        异常拦截通知
            如果目标方法发生异常,调用
    
         后置通知(无论目标方法是否发生异常,都会调用)
             在目标方法执行之后,调用
         */
    
        public void before(){
            System.out.println("我是前置通知");
        }
    
        public void afterReturning(){
            System.out.println("我是后置通知:如果出现异常,不执行");
        }
    
        public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
    
            System.out.println("我是环绕通知的 前部分");
    
            //放行方法
            Object object  = joinPoint.proceed();//调用目标方法
    
    
            System.out.println("我是环绕通知的 后部分");
    
    
            return object;
        }
    
        public void afterException(){
            System.out.println("我是异常通知");
        }
    
        public void after(){
            System.out.println("我是后置通知(不管异常是否发生,都会执行。。)");
        }
    }
    
    
  3. XML配置

     <!--1. 准备目标对象-->
        <bean id="userService" class="com.yunhe.service.UserServiceImpl"></bean>
    
        <!--2. 准备通知对象-->
        <bean id="myAdvice" class="com.yunhe.advice.MyAdvice"></bean>
        
        <!--aop配置-->
        <aop:config>
            <!--
            public void com.yunhe.service.UserServiceImpl.addUser()
                    * com.yunhe.service..*ServiceImpl.*(..)
            -->
            <!--配置切入点-->
            <aop:pointcut id="pc" expression="execution(* com.yunhe.service..*ServiceImpl.*(..))"/>
            <!--配置切面 ref:指定通知类-->
            <aop:aspect ref="myAdvice">
                <aop:before method="before" pointcut-ref="pc"></aop:before>
                <aop:after method="after" pointcut-ref="pc"></aop:after>
                <aop:around method="around" pointcut-ref="pc"></aop:around>
                <aop:after-returning method="afterReturning" pointcut-ref="pc"></aop:after-returning>
                <aop:after-throwing method="afterException" pointcut-ref="pc"></aop:after-throwing>
            </aop:aspect>
    
        </aop:config>
    
  4. 注解配置

    package com.yunhe.advice;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    
    //通知类
    @Aspect //表示当前类是一个通知类
    public class MyAdvice {
        /*
        前置通知
            目标方法执行之前调用
    
        后置通知(目标方法如果发生异常,不调用)
            在目标方法执行之后调用
    
        环绕通知
            在目标方法之前和之后调用
    
        异常拦截通知
            如果目标方法发生异常,调用
    
         后置通知(无论目标方法是否发生异常,都会调用)
             在目标方法执行之后,调用
         */
    
    
        @Pointcut("execution(* com.yunhe.service..*ServiceImpl.*(..))")
        public void pc(){
        }
        @Before("pc()")
        public void before(){
            System.out.println("我是前置通知");
        }
        @AfterReturning("pc()")
        public void afterReturning(){
            System.out.println("我是后置通知:如果出现异常,不执行");
        }
        @Around("pc()")
        public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
    
            System.out.println("我是环绕通知的 前部分");
            //放行方法
            Object object  = joinPoint.proceed();//调用目标方法
            System.out.println("我是环绕通知的 后部分");
            return object;
        }
        @AfterThrowing("pc()")
        public void afterException(){
            System.out.println("我是异常通知");
        }
        @After("pc()")
        public void after(){
            System.out.println("我是后置通知(不管异常是否发生,都会执行。。)");
        }
    }
    
        <!--开启 aop 注解扫描-->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    

二、Spring整合JDBC

1.Spring整合Dao技术

spring提供一个直接操作数据库的对象,对象封装了JDBC技术

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

1. JDBCTemplate--->JDBC模板对象

2.开发步骤

①导入mysql数据库驱动jar,C3P0数据库连接池坐标

②创建数据库表和实体

③创建IUserDao和UserDaoImpl类创建JdbcTemplate对象

④配置applicationContext.xml

⑤进行测试工作

3.分析UserDaoImpl,JdbcTemplate,DataSource之间的依赖关系在这里插入图片描述

①导入mysql数据库驱动jar,C3P0数据库连接池坐标
    <!-- mysql -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.6</version>
    </dependency>
    <!-- C3P0数据库连接池 -->
    <dependency>
      <groupId>c3p0</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.1.2</version>
    </dependency>
②创建数据库表和实体
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `sex` char(1) DEFAULT NULL COMMENT '性别',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
public class User {
 private int  id;
 private String  username;
 private Date birthday;
 private String  sex;
 private String  address;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public User() {
    }
    public User(int id, String username, Date birthday, String sex, String address) {
        this.id = id;
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

③创建IUserDao和UserDaoImpl类创建JdbcTemplate对象
public interface IUserDao {
//    增删改查 统
    public void insertUserByUser(User user);
    public void deleteUserById(int id);
    public void updateUserByUser(User user);
    public List<User> queryAll();
    public int countUser();
}
//基于xml配置
public class UserDaoImpl implements IUserDao {
	private JdbcTemplate jdbcTemplate;
   public JdbcTemplate getJdbcTemplate() {
       return jdbcTemplate;
    }
   public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
      this.jdbcTemplate = jdbcTemplate;
   }
    @Override
    public void insertUserByUser(User user) {
       jdbcTemplate.update("insert into User values (?,?,?,?,?)",user.getId(),user.getUsername(),user.getBirthday(),user.getSex(),user.getAddress());
    }
    @Override
    public void deleteUserById(int id) {
        jdbcTemplate.update("delete  from user  where id=?",id);
    }
    @Override
    public void updateUserByUser(User user) {
        jdbcTemplate.update("update user  set username=?,address=? where id=?",user.getUsername(),user.getAddress(),user.getId());
    }
    @Override
    public List<User> queryAll() {
        List<Map<String, Object>> maps = jdbcTemplate.queryForList("select * from user");
        List<User> userList=new ArrayList<>();
        for (Map<String,Object> map:maps) {
            User user=new User();
            user.setUsername((String) map.get("username"));
            user.setBirthday((Date) map.get("birthday"));
            user.setSex((String) map.get("sex"));
            userList.add(user);
        }
        return userList;
    }
    @Override
    public int countUser() {
        Integer integer =  jdbcTemplate.queryForObject("select count(*) from user", Integer.class);
        return integer;
    }
}
④配置applicationContext.xml
  <!--创建DataSource-->
<bean id="dataScoure" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driver}"></property>
    <property name="jdbcUrl" value="${jdbc.url}"></property>
    <property name="user" value="${jdbc.username}"></property>
    <property name="password" value="${jdbc.password}"></property>
</bean>
<!--    &lt;!&ndash;创建模板对象&ndash;&gt;-->
  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
       <property name="dataSource" ref="dataScoure"></property>
    </bean>
<!--c創建userDao-->                              
<bean id="iUserDao" class="com.yunhe.dao.UserDaoImpl">
    <property name="dataSource" ref="dataScoure"></property>
</bean>
⑤进行测试工作
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test2 {
    @Autowired
private IUserDao iUserDao;
    @Test
    public void insertUserByUser() {
        User user=new User();
        user.setId(6);
        user.setUsername("范冰冰");
        user.setSex("女");
        user.setBirthday(new Date());
        user.setAddress("北京市");
        iUserDao.insertUserByUser(user);
    }
@Test
    public  void  deleteUserById(){
    iUserDao.deleteUserById(22);
    }
@Test
    public void  updateUserByUser() {
        User user=new User();
        user.setId(26);
        user.setAddress("北京市");
        user.setUsername("韩雪");
        iUserDao.updateUserByUser(user);
    }
@Test
    public  void   queryAll() {
        List<User> userList = iUserDao.queryAll();
        System.out.println(userList);
    }
@Test
    public  void  countUser() {
    int i = iUserDao.countUser();
    System.out.println(i);
}
}

重点记忆部分

①导入mysql数据库驱动jar,C3P0数据库连接池坐标

②创建数据库表和实体

③创建JdbcTemplate对象

		JdbcTemplate jdbcTemplate = newJdbcTemplate();

	      	 jdbcTemplate.setDataSource(dataSource);

④执行数据库操作

更新操作:

jdbcTemplate.update (sql,params)

查询操作:

jdbcTemplate.query (sql,Mapper,params)

jdbcTemplate.queryForObject(sql,Mapper,params)

进阶用法

  1. UserDao继承JdbcDaoSupport

    依赖关系分析

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZuxTE98M-1611634475046)(img\image-20210108200823498.png)]

    //基于继承jdbcDaoSupport升级版本
    public class UserDaoImpl extends JdbcDaoSupport implements IUserDao {
        @Override
        public void insertUserByUser(User user) {
    //        jdbcTemplate.update("insert into User values (?,?,?,?,?)",user.getId(),user.getUsername(),user.getBirthday(),user.getSex(),user.getAddress());
           getJdbcTemplate().update("insert into User values (?,?,?,?,?)",user.getId(),user.getUsername(),user.getBirthday(),user.getSex(),user.getAddress());
        }
        @Override
        public void deleteUserById(int id) {
            getJdbcTemplate().update("delete  from user  where id=?",id);
        }
        @Override
        public void updateUserByUser(User user) {
            getJdbcTemplate().update("update user  set username=?,address=? where id=?",user.getUsername(),user.getAddress(),user.getId());
        }
        @Override
        public List<User> queryAll() {
            List<Map<String, Object>> maps = getJdbcTemplate().queryForList("select * from user");
            List<User> userList=new ArrayList<>();
            for (Map<String,Object> map:maps) {
                User user=new User();
                user.setUsername((String) map.get("username"));
                user.setBirthday((Date) map.get("birthday"));
                user.setSex((String) map.get("sex"));
                userList.add(user);
            }
            return userList;
        }
        @Override
        public int countUser() {
            Integer integer =  getJdbcTemplate().queryForObject("select count(*) from user", Integer.class);
            return integer;
        }
    }
    
  2. 修改配置文件

    <!--创建DataSource-->
    
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
            <property name="jdbcUrl" value="jdbc:mysql:///test"></property>
            <property name="user" value="root"></property>
            <property name="password" value="root"></property>
        </bean>
    <!--不用维护JdbcTemplate对象-->
    <!--创建UserDao-->
        <bean id="userDao" class="com.yunhe.dao.UserDaoImpl">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
    
  3. 抽取jdbc.properties引用属性集文件

    <!--db.properties-->
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/test
    jdbc.username=root
    jdbc.password=root
    
    1. <!--引入属性集文件-->
         <context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
      <!--配置文件修改为:-->
       <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
              <property name="driverClass" value="${jdbc.driver}"/>
              <property name="jdbcUrl" value="${jdbc.url}"/>
              <property name="user" value="${jdbc.username}"/>
              <property name="password" value="${jdbc.password}"/>
          </bean>
      <bean id="iUserDao" class="com.yunhe.dao.UserDaoImpl">
          <property name="dataSource" ref="dataScoure"></property>
      </bean>
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值