spring mvc整合mybatis(crud+分页插件)操作mysql

日期:2017-06-19       浏览:1036

一 功能列表

  1. 注解实现插入数据自动封装32位uuid
  2. 注解实现插入数据自动封装插入日期
  3. 注解实现更新数据自动更新更新日期
  4. 分页查询自动封装返回符合查询条件的总数
  5. 封装任意请求数据校验
  6. 封装返回数据格式及统一异常处理

二 web.xml配置

我们都知道java ee的项目启动的第一件事就是读取web.xml,spring mvc 的web.xml我在上一篇文章中也做了详细讲解,不懂的可以回头看看,讲解的这个项目源码我也会放到github上,也可以去那里看看,这里就不做介绍了。
web.xml 配置
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:/context.xml</param-value>
</context-param>

<!-- 监听器:启动服务器时,启动 spring -->
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- spring 核心控制器 -->
<servlet>
  <servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
<init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:external-servlet.xml</param-value>
</init-param>
</servlet>

<servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<!-- 编码过滤器 -->
<filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
  <param-name>encoding</param-name>
  <param-value>UTF-8</param-value>
</init-param>
<init-param>
  <param-name>forceEncoding</param-name>
  <param-value>true</param-value>
</init-param>
</filter>

<filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

三 spring(context.xml) 上下文配置

这个配置文件可以说是服务器容器第二个要读取的了,这里配置了spring启动时扫描的基础包路径、外部配置的属性文件的导入、需要连接的数据库的配置、mybatis 和 spring 的整合、开头我们说到的 mybatis 日期插件和分页插件也是在这里配置、还有就是mybatis扫描的实体包及其 mapper 文件位置了。
context.xml 配置
<!-- spring 扫描的基础包路径 -->
<context:component-scan base-package="com.qbian" />

<!-- jdbc properties -->
<bean id="propertyConfigurer"
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
      p:location="classpath:jdbc.properties" />

<!-- define the datasource (这里用的是c3p0的数据看连接池,性能不是很好,可以唤其它更好的连接池[jdbc pool等])-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
      destroy-method="close">
    <property name="driverClass" value="${jdbc.driverClassName}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />

</bean>

<!-- define the SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="typeAliasesPackage" value="com.qbian.**.dto" />
    <property name="plugins">
        <list>
            <!-- 配置自己实现的日期插件 -->
            <bean class="com.qbian.common.plugin.DatePlugin" />
            <!-- 分页插件 -->
            <bean class="com.qbian.common.plugin.PagePlugin"  />
        </list>
    </property>
</bean>

<!-- scan for mappers and let them be autowired -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.qbian.**.dao" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>

<!-- 将多个配置文件读取到容器中,交给Spring管理 -->
<bean id="configProperties" class="com.qbian.common.plugin.PropertiesConfigurer">
    <property name="locations">
        <list>
            <!--<value>classpath:redis.properties</value>-->
        </list>
    </property>
</bean>

四 spring 控制器配置

这里配置的是控制器所在的位置,及其支持的请求类型和编码。
external-servlet.xml 配置
<!-- 控制器扫描 -->
<context:component-scan base-package="com.qbian.common.controller" />

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html;charset=UTF-8</value>
                </list>
            </property>
            <property name="writeAcceptCharset" value="false" />
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
配置信息就是以上三个了,接下来我们来看看具体的代码。

五 代码讲解

1、java代码讲解,以下不做排序,只是按编辑器显示顺序排列讲解。(以下内容均在java.com.qbian包下)
 common |
    annotation |
        @interface Now : 插入|更新数据的日期注解。
        @interface UUID :插入数据的uuid注解。
    controller |
        ExternalController.class :核心控制器,拦截所有请求,异常处理,跨域设置等功能。
    dao |
        interface StudentDao :使用例子,crud 共通方法。
    dto |
        PageInfoDto.class :分页使用的基础dto对象。
        ResponseDto.class :响应数据的基本模型。
    entity |
        Student.class :使用例子,自定义注解的使用。
    enums |
        enum MessageEnum :统一的返回状态码及描述信息。
    exception |
        ExternalServiceException.class :自定义异常,业务相关都抛出该异常对象。
    factory |
        BeanFactoryUtil.class :根据bean name获取spring管理的bean实例。
    hadle |
        ExceptionHandle.class :spring自带的统一异常捕获处理。
    plugin |
        DatePlugin.class :自定义mybatis日期插件。
        PagePlugin.class :自定义mybatis分页插件。
        PropertiesConfigurer.class :将外部配置的属性文件读取到 spring 容器中统一管理。
    service |
        interface IbaseServie :基础的service接口。
        BaseService.class :基础的service抽象类。
        TokenService.class :鉴权token服务类。
    util |
        CheckUtil.class :请求信息校验相关工具类。
        DateUtil.class :日期相关工具类。
        ResponseUtil.class :响应信息工具类。
        SecondsFormatSerializer.class :java.util.Date类型转时间戳工具类。
        TimestampSecondsFormatSerializer.class :java.sql.Timestamp类型转时间戳工具类。
        StringUtil.class :字符串相关工具类。

other |
    dao |
        interface StudentExtDao :使用例子,业务相关crud操作。
    dto |
        QueryStudentSexPageDto.class :根据学生性别分页查询返回对象dto。
        StudentPageDto.class :根据学生性别分页查询封装的对象。
    service |
        AddStudentService.class :插入学生数据接口。
        DeleteStudentService.class :删除学生数据接口。
        FindStudentService.class :查询学生数据接口。
        UpdateStudentService.class :更新学生数据接口。
        QueryStudentBySexService.class :根据学生性别分页查询接口。
        
2、mybatis的 mapper.xml讲解(以下内容均在resources/com/qbian文件夹下)
common |
    dao |
        StudentDao.xml :对应common.dao.StudentDao接口。
other |
    dao |
        StudentExtDao.xml :对应other.dao.StudentExtDao接口。

六 功能演示

6.1 token校验

这里的token我写死在代码里了,123456表示校验成功。我们先用插入数据接口测试一下,传个错误的token,如下图:
授权token校验
授权token校验

6.2 请求参数校验

我们来看看插入数据接口还需要校验哪些值。
// 校验请求参数
CheckUtil.checkEmpty(params, "token", "sex", "age");
// 校验 token
tokenService.checkUserLogin(params.getString("token"));

Student student = JSONObject.parseObject(params.toJSONString(), Student.class);

studentDao.insert(student);

return ResponseUtil.success();
然后我们少传age字段试一下:
请求字段校验
请求字段校验

6.3 插入数据

在插入数据之前我们先看看数据库里都有哪些数据:
初始化数据库中的值
初始化数据库中的值
从上图可以看出,数据库中没有任何数据。我们来执行下插入接口。
测试插入接口
测试插入接口
我们再来看下数据库:
调用插入接口后
调用插入接口后
数据库已经有数据了。

6.4 查询数据

根据上一条数据的ID查询
调用查询接口
调用查询接口
刚插入的数据我们也查询出来了。

6.5 更新数据

更新一下查询出来的数据:
调用更新接口
调用更新接口
然后我们再查询一次该条数据
更新后再次查询
更新后再次查询
可以看到性别和年龄都更新了,并且更新日期也是最新的了

6.6 分页查询

先来看一下代码:
// 校验请求参数
CheckUtil.checkEmpty(params, "token", "sex", "pageNo", "pageSize");
// 校验 token
 tokenService.checkUserLogin(params.getString("token"));

// 根据性别分页查询 Student,查询总数会自动封装到pageDto对象上
QueryStudentSexPageDto pageDto = JSONObject.parseObject(params.toJSONString(), QueryStudentSexPageDto.class);

List<Student> students = studentExtDao.queryBySexWithPage(pageDto);

StudentPageDto studentPageDto = new StudentPageDto();
// 查询总数会自动封装到pageDto对象上
studentPageDto.setTotalSize(pageDto.getTotalSize());
studentPageDto.setStudents(students);

 return ResponseUtil.success(studentPageDto);
分页查询之前我们想要导入多一点测试数据。
分页前测试数据
分页前测试数据
可以看到数据库目前有十条测试数据,男生有六条,年龄分别为19~24。好了,我们开始调用分页查询接口:
调用分页查询接口返回结果
调用分页查询接口返回结果
格式化一下返回数据:
分页查询返回结果整理
分页查询返回结果整理
这和我们直接查询数据库看到的一样。

6.7 删除数据

最后就是删除数据接口了,我们将第一条测试数据删除掉。
调用删除接口返回结果
调用删除接口返回结果
然后我们在查询一下是否真的删除了。
删除后查询
删除后查询
数据已经被删除了。
好了,这就是今天要说的spring mvc整合mybatis crud+分页操作mysql。
源码地址:https://github.com/Qbian61/spring-mvc-mybatis
扫码关注有惊喜

(转载本站文章请注明作者和出处 qbian)

暂无评论

Copyright 2016 qbian. All Rights Reserved.

文章目录