之前的日志并没有写到数据库的访问,所谓的测试其实也只是测试了controller的功能,而今天我就要开始测试数据库操作啦。
15、打开DispatcherServlet的配置文件写配置信息。配置数据源。
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/kfjs"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
16、打开DispatcherServlet的配置文件写配置信息。配置sqlsessionfactory
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations" value="classpath:cn/dw/hz/dao/xml/*.xml"></property>
</bean>
17、打开DispatcherServlet的配置文件写配置信息,整合dao和Xml。为啥明明在xml里就已经声明了本xml对应哪个mapper,还要专门说明写明basepackage去指向保存地点?不明白。
<!-- 3、spring整合mybatis的核心配置,动态生成实现类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 有两种配置方法,带beanname就写value,不带的话表示对象则用ref -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
<!-- 根据xml里的namespace找到对应的dao -->
<property name="basePackage" value="cn.dw.hz.dao"></property>
</bean>
18、打开DispatcherServlet的配置文件写配置信息。点击namespace标签,选择加载mvc头文件,开启日期类转换注解mvc:annotation-driven开启字符格式转换。
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=utf-8</value>
<value>text/html;charset=utf-8</value>
<value>application/x-www-form-urlencoded</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
基本上这个时候整个项目已经可以正常运作了。但一个健全的项目,应该还具备以下的一些功能。
19、打开DispatcherServlet的配置文件写配置信息。配置事务管理器。注意点击namespace标签,选择加载tx头文件开启日期类转换注解。在impl类里的某个方法前加上@transaction注解表示某个方法启用事务管理,方法内的所有对dataSource的操作受事务管理。
<!-- 配置事务管理器的bean -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启事务的注解驱动,就是去识别@transaction注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
使用样例
@Transactional
@Override
public void addur(UserDto userDto) {
//获得前台输入的user数据,包括role清单
//新增一个user
userMapper.add(userDto);
//获得该user的role清单
List<Integer> roleList=userDto.getRoleList();
//int j=1/0;
//针对每一个role,拼装一个RoleUser对象并执行add
for(Integer i:roleList)
{
RoleUser roleuser=new RoleUser();
roleuser.setUserId(userDto.getId());
roleuser.setRoleId(i);
roleUserMapper.add(roleuser);
}
}
20、打开DispatcherServlet的配置文件写配置信息。配置aop,最常见的用途就是记录日志。
<!-- aop面向切面的配置 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
创建一个专门用于aop操作的aop类;加上@Component和@Aspect表示这是一个用来做切面处理的类
在类里写一个无参无返回无内容的空方法;
在该方法上加上注解,注明被切入的方法有哪些;注意每个类只能有一个切入方法
@Pointcut("execution(* cn.dw.hz.controller.*.*(..)) || execution(* cn.dw.hz.service.impl.*.*(..))")
public void log() {};
@Before("log()")
public void before(JoinPoint joinPoint)
{
System.out.println("切入开始!");
}
@AfterReturning("check()")
public void addurafterreturn(JoinPoint joinPoint)
{
System.out.println("重点工作切入返回!");
System.out.println("被切的目标对象:" + joinPoint.getTarget());
System.out.println("被切的方法声明:" + joinPoint.getSignature());
System.out.println("被切的方法的参数信息:" + Arrays.toString(joinPoint.getArgs()));
Object[] list=joinPoint.getArgs();
System.out.println("被切的方法的参数详细:" + ((UserDto)list[0]).getName());
}
//注意around需要触发执行
@Around("log()")
public Object arround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("======arround===========");
System.out.println("=========before==========");
Object obj = pjp.proceed();
System.out.println("=========after==========");
return obj;
}
21、controller的方法不一定是返回数据,也可能是跳转页面,这时候需要在DispatcherServlet的配置文件稍作配置。假如controller的方法无@ResponseBody注解,那就意味着需要经过ViewResolver处理。
<!-- mvc页面跳转的前后缀 /WEB-INF/jsp/user/list.jsp-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>