Spring与Junit的整合
-
pom文件中导入junit
-
写代码
<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开发
-
准备目标对象
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("查询用户"); } }
-
准备通知
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("我是后置通知(不管异常是否发生,都会执行。。)"); } }
-
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>
-
注解配置
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>
<!-- <!–创建模板对象–>-->
<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)
进阶用法
-
UserDao继承JdbcDaoSupport
依赖关系分析
//基于继承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; } }
-
修改配置文件
<!--创建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>
-
抽取jdbc.properties引用属性集文件
<!--db.properties--> jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test jdbc.username=root jdbc.password=root
-
<!--引入属性集文件--> <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>
-