MyBatis - 使用示例(三)整合SpringBoot

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调用 发现没问题

在这里插入图片描述

--------------最后感谢大家的阅读,愿大家技术越来越流弊!--------------

在这里插入图片描述

--------------也希望大家给我点支持,谢谢各位大佬了!!!--------------

猜你喜欢

转载自blog.csdn.net/Zack_tzh/article/details/112175162
今日推荐