1. 程式人生 > >從零開始搭建Mybatis框架

從零開始搭建Mybatis框架

Mybatis是一個基於java的持久型框架,有了Mybatis,終於可以不用寫jdbc程式碼這種東西了,寫個搭建Mybatis框架過程,就當做個筆記吧。

(一)新建一個web專案,起好專案名之後一路next,finish。下面是專案建好後的工程目錄(圖中用的Eclipse工具,專案名FirstMybatis)

(二)加入Mybatis框架需要的jar包,我這裡添加了4個,分別是:

jstl-1.2.jar   //jstl標準標籤庫,後面使用jsp頁面來顯示資料

log4j-1.2.17.jar  //日誌包

mybatis-3.2.0.jar  //Mybatis的jar包,必須加入上面log4j-1.2.17.jar這個jar包,否則會報錯,Mybatis更高的版本可能不用

mysql-connector-5.1.8.jar  //mysql驅動包,要連線mysql資料庫必須加入

把上面的jar包放WebContent/WEB-INF/lib下新增依賴

為了便於管理,我在src下新建了5個包,包名可以自己定義

這裡的Controller包用來存放控制器類,Service包用來處理業務,Pojo包存放實體類,Mapper包作為資料訪問層,Utils包作為工具包

在src目錄下再新建一個mybatis-config.xml檔案,用來配置Mybatis的各種配置

下面貼圖

(三)下面就是mybatis的各種配置了

開啟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即環境 -->
	<!-- 為了方便資料庫配置,使用多種配置environment時,可以通過environments中的default
	來宣告預設使用哪種配置 -->
  <environments default="mysql">
  
    <environment id="mysql">
      <transactionManager type="JDBC"/>
      <!-- pooled即池,配置連線池 -->
      <dataSource type="POOLED">
      	<!-- 配置驅動 -->
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <!-- 配置連線地址 -->
        <property name="url" value="jdbc:mysql://localhost:3306/test"/>
        <!-- 配置資料庫使用者名稱 -->
        <property name="username" value="root"/>
        <!-- 配置資料庫密碼 -->
        <property name="password" value="123456"/>
      </dataSource>
    </environment>
    
  </environments>
  
  <!-- 關聯配置對映檔案 -->
  <mappers>
  	<!-- 包掃描關聯對映檔案 -->
  	<package name="Mapper"/>
  </mappers>
  
</configuration>

配置檔案中的連線地址、使用者名稱、密碼改成自己的

其中的<mappers></mappers>標籤用來關聯對映檔案,因為要在Mapper包下建立對映檔案來進行資料操作,所以要關聯的對映檔案就直接寫上這個包名就可以了,它會自動掃描這個包下所有的用到Mybatis的檔案。

配置檔案已經完成了,對於上面的配置,還可以用另一種方式配置

如果覺得麻煩的話可以忽略下面內容,直接跳到(四)

在src目錄下建個字尾為properties的檔案,比如我新建一個db.properties

db.properties檔案中寫你的配置引數

比如我的資料庫配置引數

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/hibernatedb
username=root
password=123456

然後在mybatis-config.xml檔案的<configuration>標籤中加入這句程式碼

<!-- 載入全域性配置檔案 -->
	<properties resource="db.properties"></properties>

申明db.properties檔案作為全域性配置

配置完成後我們就可以用${driver}(表示db.properties中driver對應的值)來配置資料庫了

例如可以將上面的資料庫配置寫成下面這樣

<environments default="mysql">
  
    <environment id="mysql">
      <transactionManager type="JDBC"/>
      <!-- pooled即池,配置連線池 -->
      <dataSource type="POOLED">
      	<!-- 配置驅動 -->
        <property name="driver" value="${driver}"/>
        <!-- 配置連線地址 -->
        <property name="url" value="${url}"/>
        <!-- 配置資料庫使用者名稱 -->
        <property name="username" value="${username}"/>
        <!-- 配置資料庫密碼 -->
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
 </environment>

這樣,在資料庫配置引數有所變動時,也可以直接在db.properties中修改

(四)然後再來寫個工具類,用來獲取SqlSession的連線工廠

在Utils包下新建一個SqlSessionFactoryUtils.class,名字自定義

程式碼如下

public class SqlSessionFactoryUtils {
	//定義一個變數儲存mybatis框架的連線工廠
	private static SqlSessionFactory sqlSessionFactory;
	
	//初始化連線工廠
	//靜態程式碼塊,與類一起載入,訪問類的時候與類一起載入
	//讀取配置檔案來做Mybatis連線工廠
	static {
		try {
			String resource = "mybatis-config.xml";
			//讀取配置檔案,自動到src類路徑下尋找配置檔案
			InputStream inputStream = Resources.getResourceAsStream(resource);
			//將inputStream轉換成Mybatis的連線工廠
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//定義一個獲取連線的方法
	public static SqlSession getSqlSession()
	{
		return sqlSessionFactory.openSession();
	}
	
	//釋放連線,關閉資源
	public static void close(SqlSession sqlSession)
	{
		if(sqlSession!=null)sqlSession.close();
	}
	
}

(五)...一大堆配置完成了,後面是具體的使用

首先在Pojo中新建一個User類,儲存使用者資訊,這裡示範的資料庫名為test,有一張user表,id,name,address三個欄位

User類用來存放從user表中取出來的資料,欄位必須對應

public class User {
	int id;
	String name;
	String password;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

在Mapper包下面新建一個介面類UserMapper.java(必須在Mapper包下,之前配置檔案中配置掃描此包,不寫在這裡是找不到這個檔案的)

在介面類中寫一個用來查詢資料的方法

為這個方法加上註解(@Select註解:執行查詢操作,寫入查詢的sql語句)

public interface UserMapper {
	@Select("select * from user")
	public List<User> findAll();
}

(六)在Service包下新建一個UserService.java作為使用者的業務處理類

public class UserService {
	public List<User> findAll()
	{
		//從sqlSession工具類中獲取SqlSession
		SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSession();
		//從sqlSession中獲取對映檔案
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		//呼叫userMapper中的findAll方法,執行查詢語句,並返回一個List<User>資料
		return userMapper.findAll();
	}
}

終於到最後一部分了...

接下來要新建一個控制器,再呼叫UserService業務類中的finAll方法,拿到資料,再綁到jsp頁面中顯示

先到Controller包下建一個servlet控制器,比如我這裡叫UserController.java

在Get方法中呼叫UserService中的findAll方法,獲得返回的資料,跳轉到jsp頁面展示資料

@WebServlet("/UserController")
public class UserController extends HttpServlet {
	private static final long serialVersionUID = 1L;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UserController() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		UserService userService = new UserService();
		//獲取返回的資料
		request.setAttribute("users", userService.findAll());
		//跳轉頁面顯示
		request.getRequestDispatcher("/WEB-INF/jsp/user.jsp").forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

在WEB-INF目錄下新建個jsp資料夾,在其中建立個user.jsp檔案

把請求的資料繫結到jsp頁面上

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 這裡要用到jstl標籤庫中的標籤,必須加上下面這行程式碼 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<table>
<!-- 使用forEach標籤迴圈繫結資料 -->
<c:forEach items="${users}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.address}</td>
</tr>
</c:forEach>
</table>
</body>
</html>

(七)最後,啟動伺服器,在瀏覽器中輸入http://localhost:8080/FirstMyBatis/UserController(寫你自己的專案名和地址)

資料表中新增幾條資料用於測試,頁面正常顯示,搭建成功

對於UserMapper類中的增刪改查,與註解@Select同理,改成@Insert、@Update、@Delete即可。

UserMapper類中的資料操作除了可以用註解方式實現外,還可以通過xml檔案來實現,有空再補充上去。。。

最後,貼一張完整的專案路徑圖