回顾
上一篇笔者用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中两个最重要的类
SqlSessionFactory
和SqlSession
有不同的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原生方式处理文件
- 大致思路是调用
HttpServletRequest
的getParts
方法获得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主要通过
SqlSessionFactory
和SqlSession
实现 - 浏览器上传的文件可以通过
HttpServletRequest
的getParts
方法获得
网友评论