参考教程
Springboot 整合 Mybatis 的完整 Web 案例, 我这篇是对他文章的实践和一些个人理解。
1. IDEA 初始化项目
使用 IDEA 新建一个 SpringBoot 项目,有疑问的请参考,springBoot startup: 常用配置(一)
2. 目录结构
最终的目录结构如下:
springBootStruct.png
3. 配置 pom.xml
3.1 由于 springBoot 迭代速度快,所以指定版本。
<properties>
<mybatis-spring-boot>1.2.0</mybatis-spring-boot>
<mysql-connector>5.1.39</mysql-connector>
</properties>
3.2 添加 Mybatis 相关依赖
<!--Spring Boot Mybatis 依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mysql-connector}</version>
</dependency>
<!--MySQL 连接驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector}</version>
</dependency>
<!--Junit 测试-->
<dependency>
<groupId>juint</groupId>
<artifactId>junit</artifact>
<version>4.12</version>
</dependency>
3.3 配置 application
mybatis.typeAliasesPackage=org.spring.springboot.domain
mybatis.mapperLocations=classpath:mapper/*.xml
4. 配置 domain/City
配置领域实体(Domain Entity),建立对象和数据库表之间的映射。详细介绍,领域实体。
public class City{
private Long id;
private Long provinceId;
private String cityName;
private String description;
alt + insert 插入 get/set 方法
}
5. 配置 dao / CityDao
@Respository
是一个常见的 Spring 注解,用来表示和数据库相关的操作。
dao, database access obejct (数据库访问对象), 主要是用来封装一些和数据库相关的操作。
注解 @Param
有啥作用,可见 Mybatis 使用经验 。
@Repository
public interface CityDao{
City findByName(@Param("cityName") String cityname);
}
5.1 配置 mapper/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="org.spring.springboot.dao.CityDao">
<resultMap id="BaseResultMap" type="org.spring.springboot.domain.City">
<result column="id" property="id" />
<result column="province_id" property="provinceId" />
<result column="city_name" property="cityName" />
<result column="description" property="description" />
</resultMap>
<parameterMap id="City" type="org.spring.springboot.domain.City"/>
<sql id="Base_Column_List">
id, province_id, city_name, description
</sql>
<select id="findByName" resultMap="BaseResultMap" parameterType="java.lang.String">
select
<include refid="Base_Column_List" />
from city
where city_name = #{cityName}
</select>
</mapper>
6. 配置 service / CityService
public interface CityService{
City findCityByName(String cityName);
}
实现该接口 service / impl / CityServiceImpl
// 注意这个注解
@Service
public class CityServiceImpl implements CityServer{
@Autowire
private CityDao cityDao;
public City findCityByName(String cityName){
return cityDao.findByName(cityName);
}
}
7. 配置 Controller / CityRestController
@RestController
public class CityRestController{
private final CityService cityService;
@Autowired
public CityRestController(CityService cityService){
this.cityService = cityService;
}
@GetMapping(value = "/api/city")
public City findOneCity(@RequestParam(value = "cityName", required = true) String cityName){
return cityService.findCityByName(cityName);
}
}
8. 配置 application.java
必须向 SpringBoot 注册 MyBatis 的配置,否则就会有
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.zzjack.imitationapi.dao.DBTesterDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
代码:
@SpringBootApplication
// dao层的位置
@MapperScan("com.zzjack.imitationapi.dao")
public static void main(String[] args){
SpringApplication.run(SpringbootApplication.class, args);
}
MyBatis 打印sql语句到控制台
- 增加 application.yml 配置
mybatis:
config-location: classpath:configuration/mybatis-config.xml
- 配置 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>
<settings>
<!-- 打印SQL语句到控制台 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
</configuration>
增加测试
// 这些注解不是 Java 自身实现的,而是由框架Spring实现的,所以一定要增加注解
@SpringTest
@RunWith(SpringRunner.class)
public class CityTest{
// 去了顶部的俩个注解就不能把它注入bean
@Autowired
private CityDao cityDao;
@Test
public void findOneCity(){
City city = cityDao.findOne("hebei");
System.out.println(city);
}
}