美文网首页
菜鸟搭建web服务笔记3

菜鸟搭建web服务笔记3

作者: DizzyDwarf | 来源:发表于2019-04-06 23:32 被阅读0次

    回顾

    上一篇笔者用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
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.0</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.13</version>
    </dependency>
    
    • resources目录下新建MyBatis配置文件mybatis-config.xml,具体参考官方文档,同时修改数据库配置
    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/yourdbname"/>
    

    注意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即可

    <property name="url" value="jdbc:mysql://localhost:3306/yourdbname?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<Part> parts = req.getParts();
        for (Part part : parts) {
            InputStream in = part.getInputStream();
            // your code here
        }
    }
    
    • 运行时会提示由于没有提供multi-part配置,无法处理parts。根据servlet规约,有两种方式可以解决这个问题。一是给servlet增加@MultipartConfig注解,由于这里用的是现成的DispatcherServlet,因此这个方法并不可行;二是在部署描述符中为servlet配置<multipart-config></multipart-config>

    总结

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

    相关文章

      网友评论

          本文标题:菜鸟搭建web服务笔记3

          本文链接:https://www.haomeiwen.com/subject/hzzdiqtx.html