上一期中我們用
intellij idea
完成了Maven
項目的配置,內嵌jetty
插件構建服務器,並安裝了jstl
標籤庫。
我們知道可以使用jdbc
對數據庫進行增刪改查,但是這樣代碼量很大,而且是硬編碼,不夠靈活多變,效率也不高。MyBatis
爲我們提供了更好的解決方案,讓我們爲Maven
配置MyBatis
框架。
提供數據庫文件
我們來編寫一個簡單的數據表,表名爲users
,表中有id
、name
、age
三個列(此處的可視化軟件是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&characterEncoding=UTF-8&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
的工作方法,先通過配置文件創建一個工廠,再用工廠得到結果:
我們來實現一下:
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
爲請求添加一個屬性存放用戶列表,最後使用jstl
的forEach
標籤顯示出來:
<%@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>
最後,我們就可以在主頁得到結果啦:
附上目錄表: