SpringBoot學習筆記(三)整合MyBatis訪問數據庫

MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis可以通過簡單的 XML 或註解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄。

1 創建數據庫

create database db_mybatis;
use db_mybatis;
create table t_books(
       id int auto_increment primary key,
       name varchar(30) null,
       author varchar(20) null
)default charset=utf8;
insert into t_books(name,author) values('Java程序設計','張三丰');
insert into t_books(name,author) values('微信小程序開發','張無忌');
select * from t_books;

2 創建項目

首先創建一個SpringBoot工程,添加Web、MyBatis、MySQL依賴,方法如下。

創建項目時,在項目的Dependencies中勾選SQL下的MySQL Driver、MyBatis Framework,Web下的Spring Web即可。

創建完成後,項目的目錄結構如下圖所示:

項目的依賴代碼如下所示,即pom.xml中依賴部

<dependencies>
        <!--SpringWeb依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--MyBatis依賴-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>
        <!--MySQL驅動依賴-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

3 基本配置

3.1 配置數據庫連接信息

在src/main/resources下的application.properties文件中配置數據庫連接信息,這處與JdbcTemplate相同,代碼如下:

spring.datasource.url=jdbc:mysql://localhost:3306/db_mybatis?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3.2 配置mybatis

在src/main/resources下新建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 resource="application.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>

    <mappers>
        <!--
        配置Mapper.xl文件的路徑
        <mapper resource="com/sky/demo/dao/AccountMapper.xml" />
        -->
        <package name="com.example.mybatisdemo.dao"/>
    </mappers>
</configuration>

在該配置文件中有,兩個需要注意的,一個是數據庫的連接信息,是從外部配置文件中取得的,所以需要導入外部配置文件;另一個是配置Mapper映射文件的路徑,有兩種方式,一是爲每一個Mapper文件配置,另一是配置Mapper文件的包路徑。

4 訪問數據庫基本操作

4.1 創建SqlSessionFactory

每個基於MyBatis的應用都是以一個SqlSessionFactory的實例爲中心的。SqlSessionFactory的實體可以通過SqlSessionFactoryBuilder獲得。而SqlSessionFactoryBuilder則可以從XML配置文件或一個預先定製的Configuration的實例構建出SqlSessionFactory的實例。此處的XML文件即上面配置mybatis-config.xml文件。然後創建工具類,取得SqlSession對象。

在com.example.mybatisdemo包中創建util包,在包中創建DBUtil類,代碼如下:

package com.example.mybatisdemo.tool;

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 java.io.IOException;
import java.io.InputStream;

/**
 * ClassName:DBUtil
 * Description:從mybatis-config.xml中建出SqlSessionFactory的實例
 * date:2021/1/12 8:27
 *
 * @author Administrator
 * @since JDK 1.8
 */
public class DBUtil {
    private static SqlSessionFactory sqlSessionFactory;
    static{
        String resource="mybatis-config.xml";
        try {
            InputStream in= Resources.getResourceAsStream(resource);
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSession(){
        return sqlSessionFactory.openSession();
    }
}

4.2 創建POJO實體類

創建相應的POJO實體類與數據庫的數據表進行對應。例如在數據庫中有數據表t_books,則創建對應的類。

在com.example.mybatisdemo包下新建包entity,然後在該包下創建Book類,該類與t_books數據表對應,其中屬性的名稱爲了簡單,與數據表中的字段名一致。代碼如下,

package com.example.mybatisdemo.entity;

/**
 * ClassName:Book
 * Description:與數據表t_books對應
 * date:2021/1/12 8:35
 *
 * @author Administrator
 * @since JDK 1.8
 */
public class Book {
    private Integer id;
    private String name;
    private String author;
    //此處省略了setter和getter
}

4.3 採用接口的方式創建Mapper映射

在com.example.mybatisdemo.dao包中創建接口IBookMapper文件,代碼如下:

package com.example.mybatisdemo.dao;

import com.example.mybatisdemo.entity.Book;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * ClassName:IBookMapper
 * Description:
 * date:2021/1/12 8:39
 *
 * @author Administrator
 * @since JDK 1.8
 */
public interface IBookMapper {
    /**
     * 查詢所有書籍信息
     * @return 所有書籍信息的List集合
     */
    @Select("select * from t_books")
    @Results({
            @Result(property = "id",column = "id"),
            @Result(property = "name",column = "name"),
            @Result(property = "author",column = "author")
    })
    public List<Book> getBooks();
}

4.4 編寫控制層代碼

在com.example.mybatisdemo下創建controller包,在包上新建BookController類,代碼如下:

package com.example.mybatisdemo.controller;

import com.example.mybatisdemo.dao.IBookMapper;
import com.example.mybatisdemo.entity.Book;
import com.example.mybatisdemo.tool.DBUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * ClassName:BookController
 * Description:
 * date:2021/1/12 8:46
 *
 * @author Administrator
 * @since JDK 1.8
 */
@RestController
@RequestMapping("/book/*")
public class BookController {
    private IBookMapper iBookMapper= DBUtil.getSession().getMapper(IBookMapper.class);

    @RequestMapping("books")
    @ResponseBody
    public List<Book> showBooks(){
        List<Book> books=iBookMapper.getBooks();
        return books;
    }
}

5 啓動程序,測試

啓動程序後,在瀏覽器地址欄輸入

http://localhost:8080/book/books

後發現程序出錯了,錯誤信息如下所示:

### Error querying database.  Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${driver}
### The error may exist in com/example/mybatisdemo/dao/IBookMapper.java (best guess)
### The error may involve com.example.mybatisdemo.dao.IBookMapper.getBooks
### The error occurred while executing a query
### Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${driver}] with root cause

java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${driver}
    at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.initializeDriver(UnpooledDataSource.java:244) ~[mybatis-3.5.6.jar:3.5.6]
    at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.doGetConnection(UnpooledDataSource.java:223) ~[mybatis-3.5.6.jar:3.5.6]
    at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.doGetConnection(UnpooledDataSource.java:219) ~[mybatis-3.5.6.jar:3.5.6]
    at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.getConnection(UnpooledDataSource.java:95) ~[mybatis-3.5.6.jar:3.5.6]
    at org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:432) ~[mybatis-3.5.6.jar:3.5.6]
    at org.apache.ibatis.datasource.pooled.PooledDataSource.getConnection(PooledDataSource.java:89) ~[mybatis-3.5.6.jar:3.5.6]

根據錯誤信息的提示,應該是找不到數據源driver等信息,修改mybatis-config.xml配置件如下 :

<dataSource type="POOLED">
                <property name="driver" value="${spring.datasource.driver-class-name}"/>
                <property name="url" value="${spring.datasource.url}"/>
                <property name="username" value="${spring.datasource.username}"/>
                <property name="password" value="${spring.datasource.password}"/>
            </dataSource>

再次啓動程序,瀏覽結果如下

至此,即實現了SpringBoot與MyBatis的整合。在以上的程序中,並沒分爲數據訪問層、業務層、控制層,控制器部分僅僅是實現前端UI與後端的交互或前端UI間跳轉,並不進行業務處理,因此,增加業務層。

6 業務層

在com.example.mybatisdemo包中新建service包,在包中新建BookService類,將原控制器中的代碼提取到service包中相關的類中。代碼如下:

package com.example.mybatisdemo.service;

import com.example.mybatisdemo.dao.IBookMapper;
import com.example.mybatisdemo.entity.Book;
import com.example.mybatisdemo.tool.DBUtil;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * ClassName:BookService
 * Description:Book類的業務邏輯
 * date:2021/1/12 10:08
 *
 * @author Administrator
 * @since JDK 1.8
 */
@Service
public class BookService {
    private IBookMapper iBookMapper= DBUtil.getSession().getMapper(IBookMapper.class);

    /**
     * 取得所有書籍信息
     * @return 所有書籍信息的List集合
     */
    public List<Book> getBooks(){
        return iBookMapper.getBooks();
    }
}

BookController修改如下:

@RestController
@RequestMapping("/book/*")
public class BookController {
    @Autowired
    private BookService bookService;
    @RequestMapping("books")
    @ResponseBody
    public List<Book> showBooks(){
        List<Book> books=bookService.getBooks();
        return books;
    }
}

至此,SpringBoot整合MyBatis基本完成。

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