SpringBoot 整合mybatis

本文档详细介绍了如何在SpringBoot项目中整合Mybatis,包括添加Mybatis-Spring-Boot-Starter依赖,配置mapper接口、mapper.xml及实体类,设置application.yml文件中的Mybatis和数据源配置,以及解决XML文件未被加载的问题。通过遵循文中步骤,最终成功完成测试并返回正确结果。
摘要由CSDN通过智能技术生成

参考官方文档: http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

添加pom依赖

我添加的

 <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <!--<scope>runtime</scope>-->
        </dependency>

 <!-- mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

mybatis-spring-boot-starter会自动检测数据源、创建SqlSessionFactory 类实例、通过SqlSessionFactory实例来SqlSessionTemplate 类实例,扫描mapper类并将其注入到spring容器中。

添加mapper接口,mapper.xml以及实体类

City.java

package com.liusj.dao.model;

import java.io.Serializable;

public class City implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    private String name;

    private String state;

    private String country;

    public Long getId() {
        return this.id;
    }

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

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getState() {
        return this.state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getCountry() {
        return this.country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    @Override
    public String toString() {
        return getId() + "," + getName() + "," + getState() + "," + getCountry();
    }

}

CityMapper.java (使用@Mapper注解)

package com.liusj.dao.mapper;

import com.liusj.dao.model.City;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

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

@Mapper
public interface CityMapper {
    @Select("select * from city where state = #{state}")
    City findByState(@Param("state") String state);

    List<Map<String,Object>> getAllCitys();
}

CityMapper.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 namespace="com.liusj.dao.mapper.CityMapper" >

    <select id="getAllCitys" resultType="map">
        select * from city
    </select>
</mapper>

项目文件如下图
这里写图片描述

application.yml添加mybatis和数据源配置

# tomcat服务器配置
server:
  port: 8080
  context-path: /spring-boot-demo


# 数据源配置
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    url: jdbc:mysql://127.0.0.1:3306/spring-boot-db
    password:
    max-idle: 10
    max-wait: 1000
    min-idle: 5
    initial-size: 5



## mybatis 配置
mybatis:
  mapper-locations: classpath*:com/liusj/dao/**/*Mapper.xml
  type-aliases-package: com.liusj.dao.model
  configuration:
    map-underscore-to-camel-case: true # 下划线转驼峰
    call-setters-on-nulls : true  # 查询返回Map时,值为null的字段也要返回,默认是不返回的
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用

这里配置了*Mapper.xml文件和实体类的位置。那么mapper接口在哪里配置呢,在SpringBoot的启动文件里,添加@MapperScan("com.liusj.dao.mapper")注解,指明mapper接口文件位置
SpringbootApplication .java

package com.liusj;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.ApplicationContext;

import java.util.Arrays;

/**
 * Created by Administrator on 2018/4/17 0017.
 */
@SpringBootApplication
@MapperScan("com.liusj.dao.mapper")
public class SpringbootApplication extends SpringBootServletInitializer {
    public static void main(String[] args) throws Exception {
        ApplicationContext ctx = SpringApplication.run(SpringbootApplication.class, args);
        System.out.println("Let's inspect the beans provided by Spring Boot:");

/*        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        for (String beanName : beanNames) {
            System.out.println(beanName);
        }
        */
    }

}

测试类

CityController.java

package com.liusj.controller;

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.liusj.dao.model.City;
import com.liusj.dao.mapper.CityMapper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

@RestController
@RequestMapping("/city")
public class CityController {
    @Autowired
    private CityMapper cityMapper;

    @RequestMapping("/get")
    public Object findByStateTest() {
        City city = cityMapper.findByState("浙江省");
        return city;
    }

    @RequestMapping("/all")
    public Object findAllCity() throws JsonProcessingException {
        List<Map<String,Object>> allCitys = cityMapper.getAllCitys();
        Object o = JSON.toJSON(allCitys);
        return o;
    }
}

启动项目(前面已经介绍了怎么启动springboot项目)。
输入localhost:8080/spring-boot-demo/city/all
报错

Invalid bound statement (not found): com.liusj.dao.mapper.CityMapper.getAllCitys

仔细检查,路径配置没错。但是在生成的target/classes/com/dao/mapper/目录下并没有xm/CityMapper.xml文件也就是说xml文件编译的时候并没有复制过来。但是把xml文件放到src/main/resources文件夹下就可以。
这里写图片描述
maven资源文件路径没配置(默认情况下maven只会加载resources文件夹下的资源文件)
在pom.xml文件中添加以下配置:

<resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.yml</include>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>

            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>

注意我用的是application.yml文件作为主配置文件。需要<include>**/*.yml</include>。否则无法启动springboot。
再次启动项目,请求localhost:8080/spring-boot-demo/city/all, 返回

[
  {
    "name": "San Francisco",
    "country": null,
    "id": 1,
    "state": "CA"
  },
  {
    "name": "杭州",
    "country": "CHINA",
    "id": 2,
    "state": "浙江省"
  }
]

ok!大功告成

表结构说明

drop table if exists city;

create table city(
id int NOT NULL auto_increment,
name varchar(255),
state varchar(255),
country varchar(255),
PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;

insert into city (name, state, country) values ('San Francisco', 'CA', NULL);
insert into city (name, state, country) values ('杭州', '浙江省', 'CHINA');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值