idea-ssm项目实战(二)

前面我们已经在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.创建各个配置文件以及包名

  1. mybatis.xml
  2. applicationContext.xml
  3. springmvc.xml
  4. db.properties
  5. log4j.properties

创建类文件包名

  1. com.adu.crud.controller
  2. com.adu.crud.dao
  3. com.adu.crud.entity
  4. com.adu.crud.service
  5. com.adu.crud.utils

还有一个测试的包,这个就随便取了。下面就开始整合了。详情见问题源码

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

原文发布于微信公众号 - Java研发军团(ityuancheng)

原文发表时间:2018-08-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券