SpringBoot+Mybatis Demo搭建

1,753 阅读3分钟

使用原生Mybatis连接数据库进度数据读写操作,需要在Java代码中完成获取xml配置文件、通过SqlSessionFactoryBuilder创建SqlSessionFactory,再由SqlSessionFactory创建SqlSession,最后由SqlSession发起数据读写。

        //定义读取文件名
        String resources = "mybatis-config.xml";
        //创建流
        Reader reader=null;
        try {
            //读取mybatis-config.xml文件到reader对象中
            reader= Resources.getResourceAsReader(resources);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //初始化mybatis,创建SqlSessionFactory类的实例
        SqlSessionFactory sqlMapper=new SqlSessionFactoryBuilder().build(reader);
        //创建session实例
        SqlSession session=sqlMapper.openSession();
        //传入参数查询,返回结果
        UserVO user=session.selectOne("findById",1000);
        //输出结果
        System.out.println(user.getUser_name());
        //关闭session
        session.close();

在SpringBoot中提供了mybatis-spring-boot-starter简化整体操作步骤,本文记录SpringBoot整合Mybatis的步骤。

开发环境

IDEA 2019.2.4 + JDK1.8 + maven 3.3.9 + mysql

数据准备

数据库名称:springbootdb

建表和数据初始化脚本:

drop table if exists demo_city_t;

CREATE TABLE demo_city_t ( 
city_id INT NOT NULL primary key, 
city_name VARCHAR (50),
province_name VARCHAR(50),
description VARCHAR(100),
creation_date DATE, 
last_update_date DATE  
);

insert INTO demo_city_t VALUES(2000, 'beijing', 'BEIJING', '中国首都', current_date, current_date);
insert INTO demo_city_t VALUES(2001, 'shenzhen', 'GUANGDONG', '改革开放城市', current_date, current_date);
commit;

项目结构

  • src/pom.xml文件配置依赖项.
  • src/java/[package]/Application.java为应用启动入口。
  • src/java/[package]/controller/CityRestController.java定义对外开放的Restful API,而API的实现逻辑由service承接。
  • src/java/[package]/service/CityService.java定义有哪些服务可以支撑API功能。
  • src/java/[package]/service/impl/CityServiceImpl.java实现CityService定义的接口,会调用Dao的方法对数据库进行读写。
  • src/java/[package]/dao/CityDao.java定义了进行数据库读写操作的接口方法,支撑service的实现。
  • src/java/[package]/domain/City.java定义了POJO类,用于向SQL传递执行参数以及接收SQL的执行结果。
  • src/resource/application.properties文件配置SpringBoot应用的属性,包括数据源、mybatis的SQL映射文件。
  • src/resource/mapper/文件夹下文件通常和src/java/[package]/dao/一一对应,dao的文件定义了进行数据库读写的接口,mapper的文件定义这些接口对应的SQL脚本。

50

引入依赖

主要引入mybatis和mysql驱动依赖包

        <!-- Spring Boot Mybatis 依赖 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis-spring-boot}</version>
        </dependency>

        <!-- MySQL 连接驱动依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector}</version>
        </dependency>

项目属性配置

src/resource/application.properties文件

## 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdb?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

## Mybatis 配置
mybatis.typeAliasesPackage=org.spring.springboot.domain
mybatis.mapperLocations=classpath:mapper/*.xml

POJO配置

src/java/[package]/domain/City.java文件。变量名称采用驼峰命名法,SQL查询结果的每个字段都必须要有对应的类属性。

package org.spring.springboot.domain;

public class City {

    /**
     * 城市编号
     */
    private Long cityId;

    /**
     * 省份编号
     */
    private Long provinceName;

    /**
     * 城市名称
     */
    private String cityName;

    /**
     * 描述
     */
    private String description;

    public Long getCityId() {
        return cityId;
    }

    public void setCityId(Long id) {
        this.cityId = id;
    }

    public Long getProvinceName() {
        return provinceName;
    }

    public void setProvinceName(Long provinceName) {
        this.provinceName = provinceName;
    }

    public String getCityName() {
        return cityName;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

DAO配置

src/java/[package]/dao/CityDao.java

package org.spring.springboot.dao;

import org.apache.ibatis.annotations.Param;
import org.spring.springboot.domain.City;

/**
 * 城市 DAO 接口类
 */
public interface CityDao {

    /**
     * 根据城市名称,查询城市信息
     *
     * @param cityName 城市名
     */
    City findByName(@Param("cityName") String cityName);
}

Mapper配置

src/resource/mapper/CityMapper.xml配置DAO对应SQL脚本。

<?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 namespace="org.spring.springboot.dao.CityDao">
	<!--设置SQL查询结果每个字段和domain中City属性的对应关系
		如果没有该配置项,就要求City.java的属性和SQL字段名称完全相同-->
	<resultMap id="BaseResultMap" type="org.spring.springboot.domain.City">
		<result column="city_id" property="cityId" />
		<result column="province_name" property="provinceName" />
		<result column="city_name" property="cityName" />
		<result column="description" property="description" />
	</resultMap>

	<!--id和Dao中接口方法名称一一对应-->
	<select id="findByName" resultMap="BaseResultMap" parameterType="java.lang.String">
		select
		city_id, province_name, city_name, description
		from demo_city_t
		where city_name = #{cityName}
	</select>
</mapper>

service接口定义及实现

  • src/java/[package]/service/CityService.java定义有哪些服务可以支撑API功能。
package org.spring.springboot.service;

import org.spring.springboot.domain.City;

/**
 * 城市业务逻辑接口类
 */
public interface CityService {

    /**
     * 根据城市名称,查询城市信息
     * @param cityName
     */
    City findCityByName(String cityName);
}
  • src/java/[package]/service/impl/CityServiceImpl.java实现CityService定义的接口,会调用Dao的方法对数据库进行读写。
package org.spring.springboot.service.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.spring.springboot.dao.CityDao;
import org.spring.springboot.domain.City;
import org.spring.springboot.service.CityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 城市业务逻辑实现类
 */
@Service
public class CityServiceImpl implements CityService {

    private final Logger LOG = LoggerFactory.getLogger(CityServiceImpl.class);

    @Autowired
    private CityDao cityDao;

    public City findCityByName(String cityName) {
        LOG.info("=====>Enter Servie");
        return cityDao.findByName(cityName);
    }

}

Restful API定义

src/java/[package]/controller/CityRestController.java定义对外开放的Restful API,而API的实现逻辑由service承接。

package org.spring.springboot.controller;

import org.spring.springboot.domain.City;
import org.spring.springboot.service.CityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
public class CityRestController {

    @Autowired
    private CityService cityService;
    
    @RequestMapping(value = "/api/city", method = RequestMethod.GET)
    public City findOneCity(@RequestParam(value = "cityName", required = true) String cityName) {
        return cityService.findCityByName(cityName);
    }

}

项目入口

package org.spring.springboot;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Spring Boot 应用启动类
 */
@SpringBootApplication
// mapper 接口类扫描包配置
@MapperScan("org.spring.springboot.dao")
public class Application {

    public static void main(String[] args) {
        // 程序启动入口
        // 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
        SpringApplication.run(Application.class,args);
    }
}

启动验证

在项目入口文件下,右键运行即可。

调用接口成功,数据和后台表数据吻合,整合成功。