【Maven配置二】Maven Web項目配置MyBatis框架並讀取MySQL數據庫


上一期中我們用intellij idea完成了Maven項目的配置,內嵌jetty插件構建服務器,並安裝了jstl標籤庫。

我們知道可以使用jdbc對數據庫進行增刪改查,但是這樣代碼量很大,而且是硬編碼,不夠靈活多變,效率也不高。MyBatis爲我們提供了更好的解決方案,讓我們爲Maven配置MyBatis框架。


提供數據庫文件

我們來編寫一個簡單的數據表,表名爲users,表中有idnameage三個列(此處的可視化軟件是DataGrip):
在這裏插入圖片描述

配置xml文件

配置pom.xml

老規矩,要在Maven項目中使用jar,我們需要在pom.xml中引入依賴,我們爲項目提供MyBatis框架和MySQL的連接:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.4.5</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.17</version>
</dependency>

配置mybatis-config.xml

接下來,在main/resources目錄內(如果沒有就創建一個)創建mybatis-config.xml.

前面的配置與jdbc很像,就是關於驅動、URL、用戶名和密碼的設置,而最後的<mappers>標籤,則用於指定一個映射文件,我們可以把MySQL的代碼寫在mapper中,這樣代碼就可以反覆調用,極大縮小工作量。

此處mapper路徑直接指向UserMapper.xml,即對應的mapper文件就在mybatis-config.xml的同級目錄中。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/hello_mysql?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="123"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="UserMapper.xml"/>
  </mappers>
</configuration>

配置mapper

根據mybatis-config<mapper>標籤的配置,筆者同樣在main/resources創建UserMapper.xml文件。

我在mapper中提供了兩個方法,可以看到,方法寫在<select>標籤中:

  • selectUserById查詢ID並返回對應的User
  • selectAllUser返回一個包含所有的User的列表。

介紹一下mapper中的參數:

  • namespace:命名空間,用於區分不同的mapper
  • id:相當於爲<select>中方法提供別名,方便調用
  • parameterType:爲<select>方法內的變量提供類型,MyBatis#{...}代替?,這裏的Integer即指方法內的#{uid}是整數型
  • resultType:指定返回的類,需提供對應實體類的路徑 (即便返回的是列表這裏也提供列表的成員類型)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="UserMapper">
  <select id="selectUserById" parameterType="Integer" resultType="model.User">
        select * from users where id=#{uid}
    </select>
  <select id="selectAllUser" resultType="model.User">
    select * from users
  </select>
</mapper>

提供實體類

可以注意到,mapper中提供的返回類型是model.User,這顯然是一個路徑,於是我們就需要在這個路徑下提供一個實體類:

main/java/model內創建一個User類,指定數據庫中對應的成員變量,並提供構造方法和getset方法:

package model;

public class User {
  public User(int id, String name, int age) {
    this.id = id;
    this.name = name;
    this.age = age;
  }

  public int getId() {
    return id;
  }

  public String getName() {
    return name;
  }

  public int getAge() {
    return age;
  }

  private int id;
  private String name;
  private int age;
}

這樣,之前mapper文件中的resultType就可以找到對應的實體類了。


實現讀取方法

我們有很多的讀取方法,筆者在這裏簡單實現了一個Servlet來直接讀取,在實際項目中,我們還是應該按照規範,通過Service層調用DAO層,再對數據庫進行操作。

這是MyBatis的工作方法,先通過配置文件創建一個工廠,再用工廠得到結果:

mybatis-config配置
mapper映像
SqlSessionFactoryBulider
SqlSessionFactory
SqlSession
返回結果/結果集

我們來實現一下:

package service;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserTest extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    try {
      //讀取config配置文件
      InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
      SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
      //創建一個SqlSessionFactory
      SqlSessionFactory factory = builder.build(stream);
      //得到一個SqlSession
      SqlSession session = factory.openSession();
      
      //通過SqlSession中的selectList方法返回一個User列表
      List<User> userList = session.selectList("selectAllUser");
      //請求轉發,用於在主頁顯示數據表
      req.setAttribute("userList", userList);
      req.getRequestDispatcher(req.getContextPath() + "index.jsp").forward(req, resp);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    this.doGet(req, resp);
  }
}

顯示結果

此處不多介紹,因爲與本文關係不大,簡單的說就是提供了一個超鏈接跳轉到servlet,再通過servlet爲請求添加一個屬性存放用戶列表,最後使用jstlforEach標籤顯示出來:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page isELIgnored="false" %>
<html>
<head>
  <title>Hello Maven + SSM</title>
  <link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<h2>Hello World!</h2>
<a href=${pageContext.request.contextPath}"/sql">view by mybatis</a>
<c:if test="${!empty userList}">
  <table>
    <tr>
      <th>ID</th>
      <th>Name</th>
      <th>Age</th>
    </tr>
    <c:forEach items="${userList}" var="user">
      <tr>
        <td>${user.id}</td>
        <td>${user.name}</td>
        <td>${user.age}</td>
      </tr>
    </c:forEach>
  </table>
</c:if>
</body>
</html>

最後,我們就可以在主頁得到結果啦:
在這裏插入圖片描述
附上目錄表:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章