MyBatis

Mybatis 的使用(整合Spring、SpringBoot)

Google+ Pinterest LinkedIn Tumblr

昨天在學習專案工程時發現專案對mybatis用的還是挺多的,之前也是有用過,覺得還是自己做下筆記記錄一下。 Mybatis 是一個數據訪問層框架,和大多數同類框架一樣,Mybatis節省了開發人員使用jdbc底層運算元據庫很大一部分程式碼,使用mybatis,開發人員只需要將sql寫在配置檔案中,並宣告該sql返回值和java型別的對映即可。當然mybatis還支援針對介面程式設計,如果你把mybatis和spring兩者做一個整合,你將發現你無須為介面宣告實現類就可以運算元據庫,而你需要做的,只是在xml檔案中做相關宣告告訴mybatis即可,mybatis底層會幫我們處理和資料庫的連結等操作。

下面我不會講解mybatis的相關理論知識,因為官網其實說的很明白了,而我需要做的,只是從3個應用方式層面展開講解,這3個層面分別是 程式設計方式使用mybatis , 基於註解使用mybatis , spring整合mybatis ,所有工程均採用maven進行構建。

爲了方便演示,在此我貼出相關資料庫指令碼和一些公共的元件如( mapper 介面):

create database test;
CREATE TABLE `test`.`student` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `NAME` VARCHAR(45) NULL,
  `AGE` INT NULL,
  `ADDRESS` VARCHAR(45) NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC));

StudentMapper.java介面

package com.wokao666.mappers;

import java.util.List;
import java.util.Map;

import com.wokao666.entity.Student;

/**
 * 
 * The class StudentMapper.
 *
 * Description:學生mapper
 *
 * @author: huangjiawei
 * @since: 2018年6月7日
 * @version: $Revision$ $Date$ $LastChangedBy$
 *
 */
public interface StudentMapper {

    public Student getById(Map<String, Object> param);

    public List<Student> listStudents();
}

實體類Student.java

package com.wokao666.entity;

/**
 * 
 * The class Student.
 *
 * Description:學生實體類
 *
 * @author: huangjiawei
 * @since: 2018年6月7日
 * @version: $Revision$ $Date$ $LastChangedBy$
 *
 */
public class Student {

    private int id;
    
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    private String name;
    private String address;
    private int age;
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getAddress() {
        return address;
    }
    
    public void setAddress(String address) {
        this.address = address;
    }
    
    public int getAge() {
        return age;
    }
    
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", address=" + address + ", age=" + age + "]";
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    
    public Student(int id, String name, String address, int age) {
        super();
        this.id = id;
        this.name = name;
        this.address = address;
        this.age = age;
    }
    
    public Student() {
    }
}

StudentMapper.xml

<?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,爲了更好的進行區別,我們通常會將該值設定為包名的全限定路徑 -->
<mapper namespace="com.wokao666.mappers.StudentMapper">
    
    <!-- 表示你的sql查詢結果和java型別的一個對映,java型別通常是java bean -->
    <resultMap type="com.wokao666.entity.Student" id="studentMap">
        <result property="id" column="ID"/>
        <result property="name" column="NAME" />
        <result property="age" column="AGE" />
        <result property="address" column="ADDRESS" />
    </resultMap>
    
    <!-- select語句 ,根據條件進行查詢,指定引數型別為map型別-->
    <select id="getById" resultMap="studentMap" parameterType="java.util.Map">
        select * from Student where id = #{id};
    </select>	
    
    <select id="listStudents" resultMap="studentMap">
        select * from Student;
    </select>
</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>
    <!-- 屬性配置,類似於全域性變數   -->
    <properties>
        <property name="driver" value="com.mysql.jdbc.Driver" />
        <property name="url"
            value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC" />
        <property name="username" value="root" />
        <property name="password" value="root" />
    </properties>
    <!-- 在此,你可以定義多個環境,表示開發、測試、預生產、生產 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <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>
    </environments>
    <!-- mapper檔案路徑配置,預設會載入類路徑下的資源,更多配置可以參見官方文件 -->
    <mappers>
        <mapper resource="StudentMapper.xml" />
    </mappers>
</configuration>

一、使用mybatis程式設計方式運算元據庫

在mybatis中,程式的構建式通過一個叫 SqlSessionFactory 開始的, SqlSessionFactory 可以通過 SqlSessionFactoryBuilder 進行構建, SqlSessionFactoryBuilder 支援從一個配置檔案流中進行構建。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>mybatisTest</groupId>
    <artifactId>mybatisTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>mybatisTest</name>
    
    <properties>
        <java.version>1.8</java.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
    </dependencies>
</project>

Test.java

package com.wokao666.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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 com.wokao666.entity.Student;
import com.wokao666.mappers.StudentMapper;

/**
 * 
 * The class Test.
 *
 * Description:程式設計方式使用mybatis
 *
 * @author: huangjiawei
 * @since: 2018年6月8日
 * @version: $Revision$ $Date$ $LastChangedBy$
 *
 */
public class Test {

public static void main(String[] args) throws IOException {
    //	讀取我們的配置檔案
    InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(input);
    
    // 開啟一個會話session
    SqlSession session = factory.openSession();
    
    // 構建查詢引數
    Map<String, Object> paramMap = new HashMap<String, Object>();
    paramMap.put("id", 2);
    
    //	測試使用id獲取一條記錄
    Student stu = session.selectOne("getById", paramMap);
    System.err.println(stu.toString());
    
    // 測試使用名稱空間查詢一條記錄(介面)
    StudentMapper mapper = session.getMapper(StudentMapper.class);
    System.err.println(mapper.getById(paramMap));
    
    // 測試獲取一個列表
    List<Student> stuList = session.selectList("listStudents");
    System.err.println(Arrays.toString(stuList.toArray()));
    }
}

程式輸出

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
Fri Jun 08 14:50:11 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Student [id=2, name=Mike, address=浙江省, age=24]
Student [id=2, name=Mike, address=浙江省, age=24]
[Student [id=1, name=HUANGJIAWEI, address=廣東省, age=23], Student [id=2, name=Mike, address=浙江省, age=24]]

二、基於註解的mybatis

這篇部落格只是演示了對於簡單sql的使用,像那些複雜的sql(如關聯查詢join)等,官網有做相關講解,後續小編也可能會進行總結。因為我們都知道,mybatis推薦我們將sql語句寫到各種 mapper.xml 中,當我們的業務非常龐大時,系統中無疑就會有很多我們新建的各種xml檔案,當然我們更希望xml檔案越少越好,因此,mybatis支援開發者使用基於介面和註解的方式使用mybatis,對於一些簡單的sql而言,我們沒有必要將它寫在xml檔案中,相反我們更加推薦將簡單的sql寫在註解中,而複雜的sql交給xml檔案管理。

下面我將演示兩種基於註解使用mybatis的方式,一種是改寫第一種基於程式設計的方式,第二種將使用spring-boot來整合mybatis,當然,第二種方式會更加地實用,更加貼近我們的真實開發,或者說跟多開發者本來就是這麼用的,哈哈!

1、基於程式設計方式的註解使用

StudentMapper.java介面 中增加一個新方法,如下:

package com.wokao666.mappers;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Select;

import com.wokao666.entity.Student;

/**
 * 
 * The class StudentMapper.
 *
 * Description:學生mapper
 *
 * @author: huangjiawei
 * @since: 2018年6月7日
 * @version: $Revision$ $Date$ $LastChangedBy$
 *
 */
public interface StudentMapper {
    
    // 此處將sql寫在介面的註解上,簡單粗暴
    @Select("select * from Student where id=1")
    public Student get();
    
    public Student getById(Map<String, Object> param);
    
    public List<Student> listStudents();

}

然後在第一小結的 Test.java 最後加上這一行程式碼即可。

System.err.println(mapper.get());

2、基於spring-boot使用mybatis

程式碼下載地址: github.com/SmallerCode…

工程結構圖如下:

Mybatis 的使用(整合Spring、SpringBoot)

該工程分為三層,即 controllerservicedao 層,即傳統的 mvc 模型。

匯入工程之後啟動 MybatisDemoApplication.java 類,然後瀏覽器輸入 http://localhost:7000/get.json?id=1 即可!

三、整合Spring

任何時候,當我們在應用程式碼層面對資料庫進行操作時,我們首先要做的,那麼就是配置一個合適的資料來源,資料來源可以很簡單的配置jdbc的url、driver、username、password等引數,當然更高階的做法是我們可以採用像 c3p0druid 這樣的資料庫連線池來管理我們的資料來源,在此處,小編採用阿里巴巴提供的連線池 druid

Spring整合mybatis最關鍵的就是加入一個依賴包,即:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.1</version>
</dependency>

官網專案地址: www.mybatis.org/spring/zh/i…

上面第一、第三小節例項程式碼下載地址: github.com/SmallerCode…

如果本例項程式碼對你有所幫助,給小弟一個start喲~~~

最後總結下,mybatis就是一個數據訪問框架,大體上其特性就是儘可能減少寫底層jdbc連結的程式碼,同時,對於資料庫實體和java物件之間的對映,mybatis也幫我們完成了。當然,如果你想深入學習mybatis,我建議你去mybatis官網系統學習,mybatis功能很強大的,如果你的sql中需要進行條件判斷,mybatis執行你在mapper檔案的sql中使用諸如 <if> 標籤進行判斷,加油,騷年、朋友們,歡迎多交流!

Write A Comment