06.09 Mybatis 的使用(集成Spring、SpringBoot)

Mybatis 的使用(集成Spring、SpringBoot)

昨天在學習項目工程時發現項目對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> param);
public List<student> listStudents();
}
/<student>/<string>

實體類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


br> PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper>


<resultmap>
<result>
<result>
<result>
<result>
/<resultmap>


<select>
select * from Student where id = #{id};
/<select>\t

<select>
select * from Student;
/<select>
/<mapper>

mybatis-config.xml


br> PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

<properties>
<property>
<property> value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC" />
<property>
<property>

/<property>/<properties>

<environments>
<environment>
<transactionmanager>
<datasource>
<property>
<property>
<property>
<property>
/<datasource>
/<environment>
/<environments>

<mappers>
<mapper>
/<mappers>
/<configuration>

一、使用mybatis編程方式操作數據庫

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

pom.xml


<project> 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>

<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 {
//\t讀取我們的配置文件

InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(input);

// 打開一個會話session
SqlSession session = factory.openSession();

// 構建查詢參數
Map<string> paramMap = new HashMap<string>();
paramMap.put("id", 2);

//\t測試使用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()));
}
}
/<student>/<string>/<string>

程序輸出

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> param);

public List<student> listStudents();
}
/<student>/<string>

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

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

2、基於spring-boot使用mybatis

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

工程結構圖如下:

Mybatis 的使用(集成Spring、SpringBoot)

該工程分為三層,即controller、service和dao層,即傳統的mvc模型。

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

三、集成Spring

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

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

<dependency>
<groupid>org.mybatis/<groupid>
<artifactid>mybatis-spring/<artifactid>
<version>1.3.1/<version>
/<dependency>

最後總結下,mybatis就是一個數據訪問框架,大體上其特性就是儘可能減少寫底層jdbc鏈接的代碼,同時,對於數據庫實體和java對象之間的映射,mybatis也幫我們完成了。當然,如果你想深入學習mybatis,我建議你去mybatis官網系統學習,mybatis功能很強大的,如果你的sql中需要進行條件判斷,mybatis運行你在mapper文件的sql中使用諸如

標籤進行判斷,如果對java微服務、分佈式、高併發、高可用、大型互聯網架構技術、面試經驗交流。感興趣可以關注我的頭條號,我會在微頭條不定期的發放免費的資料鏈接,這些資料都是從各個技術網站蒐集、整理出來的,如果你有好的學習資料可以私聊發我,我會註明出處之後分享給大家。歡迎分享,歡迎評論,歡迎轉發


分享到:


相關文章: