菜鸟搭建web服务笔记3

回顾

上一篇笔者用Spring MVC框架改造了web服务,在这一篇中将通过集成MyBatis框架使用MySQL存储数据,同时利用servlet原生的方法实现处理图片上传的功能。

环境

  • Spring MVC:5.1.5
  • MyBatis:3.5.0
  • MySQL:8.0.13
  • Tomcat:9.0.16
  • Maven:3.6.0
  • Git:2.20
  • 操作系统:windows10

集成MyBatis

  • pom.xml添加依赖的jar包,包括mybatis和mysql-connector-java

    org.mybatis
    mybatis
    3.5.0


    mysql
    mysql-connector-java
    8.0.13

  • resources目录下新建MyBatis配置文件mybatis-config.xml,具体参考官方文档,同时修改数据库配置


注意driver用的是com.mysql.cj.jdbc.Driver,而不是com.mysql.jdbc.Driver,后者已经过时了。

  • 创建映射文件UserMapper.xml,同样参考上面这个网址
  • 自行创建数据库和表结构
  • 考虑到MyBatis中两个最重要的类SqlSessionFactorySqlSession有不同的scope,设计上将SqlSessionFactory对象存在静态变量中,在程序初始化阶段创建;而SqlSession对象因为是method或者session scope,这里笔者将它与一个request请求绑定,在每次处理一个新的请求时调用openSession方法获得。

运行测试

  • 第一次运行时提示时区不正确
com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

在配置的url中增加参数serverTimezone=UTC即可


  • 通过MyBatis插入的数据并未真正插入到mysql中
    笔者在openSession时忘了将autoCommit设置为true,同时代码中也没有手动调用commit方法,因此数据并未真正插入。解决方法为调用openSession(true)即可。

servlet原生方式处理文件

  • 大致思路是调用HttpServletRequestgetParts方法获得Part对象的集合。每个Part对象对应一个上传的文件,通过调用它的getInputStream方法可以获得输入流,然后按照正常的字节流方法处理即可。
public void upload(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
    req.setCharacterEncoding("utf-8");
    Collection parts = req.getParts();
    for (Part part : parts) {
        InputStream in = part.getInputStream();
        // your code here
    }
}
  • 运行时会提示由于没有提供multi-part配置,无法处理parts。根据servlet规约,有两种方式可以解决这个问题。一是给servlet增加@MultipartConfig注解,由于这里用的是现成的DispatcherServlet,因此这个方法并不可行;二是在部署描述符中为servlet配置

总结

  • Spring项目手动集成MyBatis主要通过SqlSessionFactorySqlSession实现
  • 浏览器上传的文件可以通过HttpServletRequestgetParts方法获得

你可能感兴趣的:(菜鸟搭建web服务笔记3)