菜鸟搭建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
<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方法获得
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容