起头自述
本文主要是参考spring-boot-starter 的xml方式的集成方式,在此之前我也曾在网上找过很多集成的例子,有很多还是以mybatis-spring的方式来集成,也曾遇到过很多问题,所以推荐大家参考该项目(github/mybatis/spring-boot-starter )进行取舍。
SpringBoot集成Mybatis
1.首先创建一个maven quickstart 项目。创建好后结构目录如下。
maven的quickstart项目默认没有resources源文件目录,因此我们需要自己创建(项目右键-build Path-configure...-source栏目-Add Folder...
)创建src/main/resources
源文件目录建好之后目录结构如下
2.修改pom.xml并添加相应的依赖,完整版如下
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>springboot-mybatis-sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot-mybatis-sample</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- SpringBoot web starter,web项目依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 若是使用默认logback日志,请自行移除exclusions块,该块排除默认日志包 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Mybatis Starter依赖包 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<!-- 除此处需要制定版本以外,其他各依赖包均无需指定版本信息,Springboot会自动添加合适版本 -->
<version>1.3.1</version>
<!-- 若是使用默认logback日志,请自行移除exclusions块,该块排除默认日志包 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 读取yml配置文件需要的依赖包 -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
<!--Log4j2 依赖Starter,此处不采用默认的Logback,视个人项目需求而定 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!--Log4j Web容器日志依赖 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
</dependency>
<!--单元测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Boot测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<!-- 这是为了防止maven构建eclipse或者idea项目出错需要指定源文件目录和配置文件目录 -->
<sourceDirectory>src/main/java</sourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<!-- SpringBoot项目所需要依赖的插件,该插件主要用于打包Springboot项目 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.在src/main/resources
下添加application.yml
配置如下(切记,该配置下,配置文件中不能以tab代替空格,否则出错)
server:
port: 8089
spring:
datasource:
url: jdbc:mysql://localhost:3306/sample?useSSL=false&characterEncoding=UTF-8
# 请根据自己的数据库做相应更改
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
# tomcat连接池配置
tomcat:
max-wait: 10000
max-active: 50
test-on-borrow: true
# mybatis 配置
mybatis:
config-location: classpath:mybatis-config.xml
4.日志文件配置-在src/main/resources
下配置 log4j2.yml
Configuration:
status: INFO
name: Log4j2 Yaml Config
properties:
property:
- name: ArchiveFileName
value: logs/archive/
- name: filename
value: logs/example
Appenders:
# 日志打印到Console
Console:
- name: DefaultConsoleAppender
target: SYSTEM_OUT
PatternLayout:
pattern: |
%highlight{%d [%t] %-5level: %msg%throwable}
- name: TraceDataAccessAction
target: SYSTEM_OUT
PatternLayout:
pattern: |
%highlight{%d [%t] %-5level: %msg%throwable}
# 日志记录到文件
File:
- name: DefaultFileAppender
fileName: ${filename}-all.log
PatternLayout:
pattern: |
%date-%-5level-%msg
Filters:
ThresholdFilter:
level: INFO
- name: WarnningFileAppender
fileName: ${filename}-warn.log
PatternLayout:
pattern: |
%date-%-5level-%msg
Filters:
ThresholdFilter:
level: WARN
Loggers:
Root:
level: INFO
AppenderRef:
#都是需要默认输出的日志
- ref: DefaultConsoleAppender
- ref: DefaultFileAppender
- ref: WarnningFileAppender
Logger:
#记录错误日志
- name: WARN_FILE_LOGGER
level: WARN
additivity: true
#跟踪sql的执行情况,name为mybatis - mapper街口所在的包名
- name: com.sample.demo.mapper
level: TRACE
5.在src/main/resources
添加mybatis配置文件mybatis-config.xml
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<!-- 类型别名定义,为模型类所在包的包名 -->
<package name="com.sample.demo.model"/>
</typeAliases>
<mappers>
<!--
映射文件所在位置,该文件放置于src/main/resources下,但是
包名应该和mapper映射接口保持一致,这样mybatis在获取映射时
才能获取到mapper接口中对应的方法和mapper文件中对应的id的
对应关系
-->
<mapper resource="com/sample/demo/mapper/CityMapper.xml"/>
</mappers>
</configuration>
6.根据第5步中的mapper名称在src/main/resources
源文件目录中创建目录com/sample/demo/mapper
并在mapper中添加CityMapper.xml
映射文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 此处的命名空间应和mapper接口保持一致 -->
<mapper namespace="com.sample.demo.mapper.CityMapper">
<select id="selectCityById" resultType="City">
SELECT
*
FROM city WHERE
id = #{id}
</select>
</mapper>
7.在这里插入一下ha~~先创建数据库和数据表,完整sql如下
-- create database and use it
DROP database IF EXISTS sample;
CREATE DATABASE sample;
USE sample;
-- check table
DROP TABLE
IF EXISTS city;
DROP TABLE
IF EXISTS hotel;
-- create table
CREATE TABLE city (
id INT PRIMARY KEY auto_increment,
`NAME` VARCHAR(36),
state VARCHAR(36),
country VARCHAR(36)
);
CREATE TABLE hotel (
city INT,
`NAME` VARCHAR(36),
address VARCHAR(36),
-- zip 邮编
zip VARCHAR(36)
);
INSERT INTO city (NAME, state, country)
VALUES
('San Francisco', 'CA', 'US'),
('北京市', 'BeiJing', 'CN');
INSERT INTO hotel (city, NAME, address, zip)
VALUES
(
1,
'Conrad Treasury Place',
'William & George Streets',
'4001'
),
(
2,
'Chengdu',
'China & SiChuan Province',
'637200'
)
8.在Java源文件目录src/main/java
下创建包com.sample.demo
并在该包下添加SpringBootMybatis.java。类并添加代码如下
package com.sample.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootMybatis {
public static void main(String[] args) {
SpringApplication.run(SpringBootMybatis.class, args);
}
}
9.在Java源文件目录src/main/java
下创建新的包com.sample.demo.model
并在该包下添加实体类City.java。并添加代码如下
package com.sample.demo.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 City setId(Long id) {
this.id = id;
return this;
}
public String getName() {
return this.name;
}
public City setName(String name) {
this.name = name;
return this;
}
public String getState() {
return this.state;
}
public City setState(String state) {
this.state = state;
return this;
}
public String getCountry() {
return this.country;
}
public City setCountry(String country) {
this.country = country;
return this;
}
@Override
public String toString() {
return getId() + "," + getName() + "," + getState() + "," + getCountry();
}
}
10.在Java源文件目录src/main/java
下创建新的包com.sample.demo.mapper
并在该包下添加CityMapper.java 接口。并添加代码如下
package com.sample.demo.mapper;
import org.apache.ibatis.annotations.Mapper;
import com.sample.demo.model.City;
@Mapper
public interface CityMapper {
/**
* 该方法名称应与CityMapper.xml中select的id保持一致
* @return
*/
public City selectCityById(Integer id);
}
11.创建测试类 - 在src/test/java
下创建包com.sample.demo.mapper
并添加测试类CityMapperTest.java
代码如下
package com.sample.demo.mapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class CityMapperTest {
@Autowired
private CityMapper cityMapper;
@Test
public void testSelectCityById() {
System.out.println(this.cityMapper.selectCityById(1).toString());
}
}
12.运行测试类结果如下(部分)
[33m2017-11-17 14:06:16,647 [main] WARN : maxIdle is larger than maxActive, setting maxIdle to: 50
[36m2017-11-17 14:06:17,143 [main] DEBUG: ==> Preparing: SELECT * FROM city WHERE id = ?
[36m2017-11-17 14:06:17,166 [main] DEBUG: ==> Parameters: 1(Integer)
[30m2017-11-17 14:06:17,173 [main] TRACE: <== Columns: id, NAME, state, country
[30m2017-11-17 14:06:17,173 [main] TRACE: <== Row: 1, San Francisco, CA, US
[36m2017-11-17 14:06:17,178 [main] DEBUG: <== Total: 1
1,San Francisco,CA,US
最后附完整项目结构图
项目资源地址
springboot-sample-demo