菜鳥搭建web服務(wù)筆記3

回顧

上一篇筆者用Spring MVC框架改造了web服務(wù),在這一篇中將通過集成MyBatis框架使用MySQL存儲數(shù)據(jù),同時利用servlet原生的方法實現(xiàn)處理圖片上傳的功能。

環(huán)境

  • Spring MVC:5.1.5
  • MyBatis:3.5.0
  • MySQL:8.0.13
  • Tomcat:9.0.16
  • Maven:3.6.0
  • Git:2.20
  • 操作系統(tǒng):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,具體參考官方文檔,同時修改數(shù)據(jù)庫配置
<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,后者已經(jīng)過時了。

  • 創(chuàng)建映射文件UserMapper.xml,同樣參考上面這個網(wǎng)址
  • 自行創(chuàng)建數(shù)據(jù)庫和表結(jié)構(gòu)
  • 考慮到MyBatis中兩個最重要的類SqlSessionFactorySqlSession有不同的scope,設(shè)計上將SqlSessionFactory對象存在靜態(tài)變量中,在程序初始化階段創(chuàng)建;而SqlSession對象因為是method或者session scope,這里筆者將它與一個request請求綁定,在每次處理一個新的請求時調(diào)用openSession方法獲得。

運行測試

  • 第一次運行時提示時區(qū)不正確
com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '?D1ú±ê×?ê±??' 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中增加參數(shù)serverTimezone=UTC即可

<property name="url" value="jdbc:mysql://localhost:3306/yourdbname?serverTimezone=UTC"/>
  • 通過MyBatis插入的數(shù)據(jù)并未真正插入到mysql中
    筆者在openSession時忘了將autoCommit設(shè)置為true,同時代碼中也沒有手動調(diào)用commit方法,因此數(shù)據(jù)并未真正插入。解決方法為調(diào)用openSession(true)即可。

servlet原生方式處理文件

  • 大致思路是調(diào)用HttpServletRequestgetParts方法獲得Part對象的集合。每個Part對象對應(yīng)一個上傳的文件,通過調(diào)用它的getInputStream方法可以獲得輸入流,然后按照正常的字節(jié)流方法處理即可。
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。根據(jù)servlet規(guī)約,有兩種方式可以解決這個問題。一是給servlet增加@MultipartConfig注解,由于這里用的是現(xiàn)成的DispatcherServlet,因此這個方法并不可行;二是在部署描述符中為servlet配置<multipart-config></multipart-config>

總結(jié)

  • Spring項目手動集成MyBatis主要通過SqlSessionFactorySqlSession實現(xiàn)
  • 瀏覽器上傳的文件可以通過HttpServletRequestgetParts方法獲得
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容