MyBatis - 使用示例(三)整合SpringBoot
前面两篇文章简单的示意了下直接使用MyBatis和整合Spring下使用。本文讲一下如何整合SpringBoot。
一、MyBatis集成SpringBoot使用
(一)工程结构图
先看下我工程的结构吧,如果不熟悉SpringBoot的的可以按照我这个敲一遍
(二)引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<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">
<groupId>org.example</groupId>
<artifactId>mubatis-springboot-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mubatis-springboot-demp</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-bom</artifactId>
<version>2.13.3</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Spring Boot 核心包,包括自动装配,日志,以及YAML文件解析 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 提供全栈的 WEB 开发特性,包括 Spring MVC 依赖和 Tomcat 容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 提供通用单元测试依赖,包括 JUnit, Hamcrest , Mockito -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- lombok 工具 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.22</version>
<scope>provided</scope>
</dependency>
<!-- MyBatis 相关 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<!-- druid 数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!-- 日志文件管理包 -->
<!-- log4j2 start -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
<!-- 保证 web 应用正常清理 log 资源 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
</dependency>
<dependency> <!-- 桥接:slf4j 到 log4j2 的桥梁 -->
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</dependency>
<dependency> <!-- 后向兼容:log4j1.x 平滑升级到 log4j2 -->
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
</dependency>
<dependency> <!-- 桥接:commons-logging(jcl) 到 log4j2 的桥梁 -->
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
</dependency>
<!-- slf4j 日志切面,相当于一个适配器 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<!-- 高性能并发编程框架 log4j2 使用 -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.2</version>
</dependency>
<!-- log4j2 end -->
<!-- JSON 工具 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
</dependencies>
</project>
(三)添加mybatis-config.xml
这个文件是配置mybatis的一些东西,其实也可以不用的。
<?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>
<!-- plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下: properties, settings, typeAliases, plugins,
objectFactory, objectWrapperFactory, reflectorFactory, environments, databaseIdProvider, typeHandlers, mappers -->
<!-- 配置mybatis的缓存,延迟加载等等一系列属性 -->
<settings>
<!-- 全局的开启或关闭配置文件中的所有映射器已经配置的任何缓存,关闭二级缓存,默认开启 -->
<setting name="cacheEnabled" value="true"/>
<!-- 开启一级缓存,缓存级别为SESSION(默认),如果缓存级别为STATEMENT将不会再同一个SqlSession中缓存 -->
<setting name="localCacheScope" value="STATEMENT"/>
<!-- 通过resultMap标签内的association标签可使用延迟加载 -->
<!-- 查询时,关闭关联对象即时加载以提高性能,开启延迟加载,默认关闭,关闭表示直接加载,查询时就进行关联查询 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 设置关联对象加载的形态,关闭侵入式延迟加载,在访问主对象时不进行查询关联对象,而是在真正访问关联对象时才进行关联查询,以提高性能 -->
<!-- 3.4.1及之前的版本默认为开启,表示查询时不进行关联查询,访问主对象时才进行关联查询 -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 允许使用列标签代替列名 -->
<setting name="useColumnLabel" value="true"/>
<!-- 不允许使用自定义的主键值-->
<setting name="useGeneratedKeys" value="false"/>
<!-- 是否开启自动驼峰命名规则(camel case)映射-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
(四)添加application.yml
server:
port: 8123
servlet:
context-path: /mybatis-springboot-demo
tomcat:
accept-count: 200
min-spare-threads: 200
spring:
application:
name: mybatis-springboot-demo
profiles:
active: test
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
url: jdbc:mysql://192.168.2.2:3306/mybatis
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver # 不配置则会根据 url 自动识别
initial-size: 5 # 初始化时建立物理连接的个数
min-idle: 20 # 最小连接池数量
max-active: 20 # 最大连接池数量
max-wait: 10000 # 获取连接时最大等待时间,单位毫秒
validation-query: SELECT 1 # 用来检测连接是否有效的 sql
test-while-idle: true # 申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis,则执行 validationQuery 检测连接是否有效
test-on-borrow: false # 申请连接时执行 validationQuery 检测连接是否有效
min-evictable-idle-time-millis: 120000 # 连接保持空闲而不被驱逐的最小时间,单位是毫秒
time-between-eviction-runs-millis: 3600000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
filters: stat,log4j,wall # 配置过滤器,stat-监控统计,log4j-日志,wall-防御 SQL 注入
connection-properties: 'druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000' # StatFilter配置,打开合并 SQL 功能和慢 SQL 记录
web-stat-filter: # WebStatFilter 配置
enabled: true
url-pattern: '/*'
exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*'
stat-view-servlet: # StatViewServlet 配置
enabled: true
url-pattern: '/druid/*'
reset-enable: false
login-username: druid
login-password: druid
aop-patterns: 'com.fullmoon.study.service.*' # Spring 监控配置
mybatis:
type-aliases-package: cn.tzh.mybatis.entity
mapper-locations: classpath:cn/tzh/mybatis/mapper/*.xml
config-location: classpath:mybatis-config.xml
pagehelper:
helper-dialect: mysql
reasonable: true # 分页合理化参数
offset-as-page-num: true # 将 RowBounds 中的 offset 参数当成 pageNum 使用
supportMethodsArguments: true # 支持通过 Mapper 接口参数来传递分页参数
(五)添加log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="INFO" monitorInterval="30">
<appenders>
<!-- 参考官方地址:https://logging.apache.org/log4j/2.x/ -->
<!-- 这个输出控制台的配置 -->
<Console name="Console" target="SYSTEM_OUT">
<!-- 设置输出日志级别(高于 level),匹配才打印 -->
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 打印日志的格式 -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"/>
</Console>
<!-- 定义一个日志输入文件 RollingFile,按天或者超过 100M 分割会进行分割 -->
<RollingFile name="RollingFile" fileName="logs/trace.log"
append="true" filePattern="logs/$${date:yyyy-MM}/trace-%d{yyyy-MM-dd}-%i.log.gz">
<!-- 需要接收的日志的级别(高于 level) -->
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 日志的格式 -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<!-- 定义一个日志输入文件 RollingErrorFile,按天或者超过 100M 分割会进行分割 -->
<RollingFile name="RollingErrorFile" fileName="logs/error.log"
append="true" filePattern="logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
<!-- 需要接收的日志的级别(高于 level) -->
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 日志的格式 -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</appenders>
<loggers>
<!--过滤掉 Spring 和 Mybatis 的一些无用的 DEBUG 信息 -->
<logger name="org.springframework" level="INFO"/>
<logger name="org.mybatis" level="INFO"/>
<root level="INFO" includeLocation="true">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFile"/>
<appender-ref ref="RollingErrorFile"/>
</root>
</loggers>
</configuration>
(六)创建UserMapper和映射mapper.xml
package cn.tzh.mybatis.mapper;
import cn.tzh.mybatis.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* @author tzh
* @date 2020/12/28 14:29
*/
@Mapper
public interface UserMapper {
/**
* 查询用户
*
* @param id id
* @return {@link User}
* @author tzh
* @date 2020/12/30
*/
User selectUser(@Param("id") Long id);
}
<?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="cn.tzh.mybatis.mapper.UserMapper">
<!--标识开起二级缓存-->
<cache/>
<!--查询语句-->
<select id="selectUser" resultType="User">
select *
from user
where id = #{id}
</select>
</mapper>
(七)创建service层、controller层、User实体
package cn.tzh.mybatis.entity;
import lombok.Data;
import java.io.Serializable;
/**
* @author tzh
* @date 2020/12/28 14:32
*/
@Data
public class User implements Serializable {
private static final long serialVersionUID = 2296136623557481394L;
private Long id;
private String userName;
private Integer age;
private String phone;
private String desc;
}
package cn.tzh.mybatis.service;
import cn.tzh.mybatis.entity.User;
/**
* @author tzh
* @date 2020/12/31 11:42
*/
public interface UserService {
/**
* 根据用户id查询用户详情
*
* @param id 用户id
* @return {@link User}
* @author tzh
* @date 2020/12/31
*/
User selectUser(Long id);
}
package cn.tzh.mybatis.service.impl;
import cn.tzh.mybatis.entity.User;
import cn.tzh.mybatis.mapper.UserMapper;
import cn.tzh.mybatis.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @author tzh
* @date 2020/12/31 11:44
*/
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public User selectUser(Long id) {
return userMapper.selectUser(id);
}
}
package cn.tzh.mybatis.controller;
import cn.tzh.mybatis.entity.User;
import cn.tzh.mybatis.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author tzh
* @date 2020/12/31 11:39
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;
@GetMapping("/getUser")
public User getUser(Long id) {
return userService.selectUser(id);
}
}
(八)创建启动类
package cn.tzh.mybatis;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* @author tzh
* @date 2020/12/31 15:51
*/
@SpringBootApplication
@EnableTransactionManagement
@MapperScan("cn.tzh.mybatis.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
(九)启动项目
用postman调用 发现没问题
--------------最后感谢大家的阅读,愿大家技术越来越流弊!--------------
--------------也希望大家给我点支持,谢谢各位大佬了!!!--------------