参考官方文档: 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');