前面我们已经在idea上手工搭建好了maven项目,这一章节开始整合ssm框架以及mybatis分页插件和mvc框架的单元测试。现在首先要下载相关的依赖jar,大家一般都是使用阿里云下载,现在就来配置一下。
1.maven配置阿里云
一般maven大家都会使用阿里云下载jar到本地,现在来说说配置阿里云下载。阿里云下载需要在maven中配置,这个配置也非常简单,首先找到maven的sttings.xml文件,在mirrors标签下输入以下代码即可:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
以上使用的maven是3.5.2版本,下载地址:
链接:https://pan.baidu.com/s/1tZoe3oRFW_ZFm5K8EBnPWA 密码:mu2m
2.导入相关的依赖jar包
1.spring mvc 2.spring jdbc 3.spring aspects 4.mybatis 5.mybatis整合包 6.mysql驱动包 7.mybatis分页插件 8.数据库连接池,druid或者其它连接池 9.jstl,servlet-api,junit,jackson
以上的相关jar直接可以到http://mvnrepository.com/地址去直接搜索,如图:
将上面的每个核心jar都找到依赖代码复制到pom.xml文件中之后,Idea会自动下载相关的依赖jar包。
下面来看看pom.xml文件代码:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!--mybatis-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<!--分页-->
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.0</version>
</dependency>
3.创建各个配置文件以及包名
创建类文件包名
还有一个测试的包,这个就随便取了。下面就开始整合了。详情见问题源码
4.spring整合mybatis
mybatis.xml代码很简单,配置了一个别名和一个分页插件的拦截器
<!--取别名-->
<typeAliases>
<package name="com.adu.crud.entity"/>
</typeAliases>
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--调整分页合理化-->
<property name="reasonable" value="true"/>
</plugin>
</plugins>
现在来看spring的配置文件applicationContext.xml,最基本的配置如下:
1.数据源
2.整合mybatis
3.注解扫描
4.事务管理器
5.读取外部的链接字符串配置文件
applicationContext.xml代码如下:
<!--读取配置文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!--扫描service包-->
<context:component-scan base-package="com.adu.crud.service"/>
<!--设置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--整合mybatis-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis/mybatis.xml"/>
</bean>
<!--设置一个批量的操作-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
<constructor-arg name="executorType" value="BATCH"/>
</bean>
<!--配置扫描器-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.adu.crud.dao"/>
</bean>
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 传播行为 -->
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
<tx:method name="query*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 切面 -->
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* com.adu.crud.service.*.*(..))" />
</aop:config>
5.测试程序
1.现在为了测试我们首先需要创建一个数据库和表(员工表和部门表两个有主外键关系),创建2个实体类,类的属性与数据库的字段类似。详情见问题源码
2.创建一个EmployeeMapper.xml文件,记住没有在mybatis.xml中引入该文件时,需要将EmployeeMapper.xml创造dao包下和对应的接口放在一起并且名称也要一致。为了简单就写了一个查询方法。这里会用的一对一查询。
<resultMap id="employeeAll" type="Employee">
<id column="emp_id" property="empId"/>
<result column="emp_name" property="empName"/>
<result column="gender" property="gender"/>
<result column="gender" property="gender"/>
<result column="dept_id" property="deptId"/>
<result column="email" property="email"/>
<association property="department" javaType="Department">
<id column="dept_id" property="deptId"/>
<result column="dept_name" property="deptName"/>
</association>
</resultMap>
<select id="findALL" parameterType="EmployeeVo" resultMap="employeeAll">
SELECT a.*,b.dept_name FROM t_emp a
LEFT JOIN t_dept b ON a.dept_id=b.dept_id
</select>
3.在entity包下创建2个员工和部门的实体类,属性需要和数据库中字段类似
4.在dao包下创建一个EmployeeMapper接口,写上一个findALL查询所有的方法。
5.在service包中创建对应的业务类,以及在controller包中创建一个对应控制器(对应的访问路径为/employee/find)。
@RequestMapping("/find")
public String findALL(@RequestParam(value = "pageIndex",defaultValue = "1")
Integer pageIndex, Model model) throws Exception {
PageHelper.startPage(pageIndex, pageSize);
List<EmployeePoJo> employees = employeeService.findALL(null);
//用PageInfo对结果进行包装,每次连续显示为5页
PageInfo<EmployeePoJo> page = new PageInfo<>(employees,5);
model.addAttribute("pageInfo",page);
return "emplist";
}
好了准备工作做好了现在开始编写测试代码了。
由于需要测试mvc所以需要使用到MockMvc、WebApplicationContext类,以及测试的相关注解@RunWith,@WebApplicationContext,@ContextConfiguration
测试程序代码:
//使用spring的测试
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
//加载spring容器
@ContextConfiguration(locations = {
"classpath:spring/applicationContext.xml",
"classpath:spring/springmvc.xml"})
public class MvcTest {
/**
* 传入SpringMVC的ioc
*/
@Autowired
WebApplicationContext context;
private MockMvc mockMvc;
@Before
public void init() {
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@Test
public void testMvc() throws Exception {
//模拟请求拿到返回值
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/employee/find").
param("pageIndex", "1")).andReturn();
//得到request中的pageInfo值
PageInfo pageInfo = (PageInfo) mvcResult.getRequest().getAttribute("pageInfo");
System.out.println("当前页码:"+pageInfo.getPageNum());
System.out.println("总页码:"+pageInfo.getPages());
System.out.println("总记录数"+pageInfo.getTotal());
System.out.println("当前页码显示页码号");
int[] number = pageInfo.getNavigatepageNums();
for (int num : number) {
System.out.print(num+",");
}
System.out.println("数据源:"+pageInfo.getList());
}
}
测试结果:
源代码地址公众号输入"ssm实战二"
是不是很简单,以上有什么错误希望大家指出,好了今天先写到这里,后期会持续更新这个实战的。
END