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基本完成。

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