mapper映射文件存放的位置


話不多說,實戰演示.上來先構建一個簡單的Springboot項目,我們使用Mybatis-Plus框架,目錄結構如下:

1.pom.xml中引入依賴

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.kd.mybatisplus</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath />
    </parent>
    <properties>
        <mybatis-plus.version>3.1.2</mybatis-plus.version>
        <mysql.version>5.1.47</mysql.version>
        <lombok.version>1.18.8</lombok.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
    </dependencies>

</project>

2.編寫啟動類

package com.mybatisplus;

import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author Adil
 * @date 2020-03-16 14:56:21
 */
@SpringBootApplication
@MapperScan("com.mybatisplus.mapper")
@Slf4j
public class MybatisplusApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisplusApplication.class, args);
    }
}

3.編寫application.yml配置文件(注意數據源的配置改成自己的)

server:
  port: 8081
  servlet:
    context-path: /mybatisplus
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis_db?characterEncoding=utf-8
    username: root
    password: root

4.編寫實體類

package com.mybatisplus.pojo;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * @author Adil
 * @date 2020-03-16 15:04:08
 */
@Data
public class User implements Serializable {
    private static final long serialVersionUID = -6391149300294480283L;
    private Integer id;
    private String username;
    private Date birthday;
    private Character sex;
    private String homeAddress;
}

5.編寫controller

package com.mybatisplus.controller;

import com.mybatisplus.pojo.User;
import com.mybatisplus.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author Adil
 * @date 2020-03-16 15:21:20
 */
@RestController
@Slf4j
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping(method = RequestMethod.GET, value = "/select")
    public List<User> selectUsers() {
        List<User> users = null;
        try {
            users = userService.selectUsers();
        } catch (Exception e) {
            log.info("查詢用戶失敗!");
        }
        return users;
    }
}

6.編寫service

package com.mybatisplus.service;

import com.mybatisplus.pojo.User;

import java.util.List;

/**
 * @author Adil
 * @date 2020-03-16 15:20:00
 */
public interface UserService {
    List<User> selectUsers();
}

6.1編寫serviceImpl

package com.mybatisplus.service.impl;

import com.mybatisplus.mapper.UserMapper;
import com.mybatisplus.pojo.User;
import com.mybatisplus.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author Adil
 * @date 2020-03-16 15:20:27
 */
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> selectUsers() {
        return userMapper.selectUsers();
    }
}

7.編寫mapper

package com.mybatisplus.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mybatisplus.pojo.User;

import java.util.List;

/**
 * @author Adil
 * @date 2020-03-16 15:17:33
 */
public interface UserMapper extends BaseMapper<User> {
    List<User> selectUsers();
}

7.1.編寫映射文件

<?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.mybatisplus.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.mybatisplus.pojo.User">
        <id column="id" property="id"></id>
        <result column="user_name" property="username"></result>
        <result column="user_birthday" property="birthday"></result>
        <result column="user_sex" property="sex"></result>
        <result column="home_address" property="homeAddress"></result>
    </resultMap>
    <select id="selectUsers" resultMap="BaseResultMap">
    select u.id , u.user_name , u.user_birthday  , u.user_sex , u.home_address from `user` u
</select>
</mapper>

8.測試結果

經過以上一頓操作,發現沒有問題,Springboot項目成功啟動,並執行UserMapper.xml映射文件中的SQL語句,成功將查詢到的數據返回.

如果是按照以上目錄層級關系創建的項目,並且沒有進行其余配置的情況下,一定要注意mapper接口和mapper.xml映射文件的位置,兩者所在的相對路徑一定要保持一致,即都在com.mybatisplus.mapper包下,這樣Mybatis會根據相同的路徑自動映射.(mapper接口是從java包下開始,mapper.xml映射文件是從resources下開始.如果不一致,則映射不到xml文件,打印異常信息查詢失敗)

那么是否意味着在一個項目中,mapper接口和xml映射文件的相對路徑一定要保持一致呢?當然不是,我們也可以將xml文件放置在resources下創建的任意目錄下,但前提是必須進行相關配置

更改xml文件的路徑,更改后路徑:resources/mappers:

如果僅僅是更改了xml映射文件的相對路徑后,我們再來測試,會發現出現了異常,查詢失敗!這時我們在application.yml配置文件中添加如下配置:

mybatis-plus:
  mapper-locations: classpath:mappers/*.xml

再次測試,成功返回數據.

這里的mapper-locations后跟xml文件的路徑,其作用就是能夠加載mapper接口所對應的映射文件.

然而公司的項目中,xml映射文件多數都放在了mapper接口所在的目錄下,如下圖:

在mapper下創建了一個xml目錄,這樣將xml映射文件與mapper接口放在一起,也好便於管理.那么可能有人會認為,將application.yml配置文件按照如下形式改造不就Ok了嘛.

mybatis-plus:
  mapper-locations: classpath:com/mybatisplus/mapper/xml/*.xml

經本人親測,查詢失敗!

所以要想把xml映射文件放在java根目錄下,只修改application.yml中的配置是不夠的,還需要在pom.xml文件中添加如下配置:

<build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

這樣Mybatis才會實現mapper接口與xml文件的映射關系.親測后查詢成功!

總結:

1.不做多余配置的前提下,一定要保證mapper接口和xml映射文件的相對路徑一致;

2.如果xml映射文件存放在resources下,而且mapper接口和xml映射文件的相對路徑不一致,需要在application.yml中進行mapper-locations配置

3.如果xml映射文件存放在java下,不僅要在application.yml中進行mapper-locations配置,同時還要在pom.xml文件中添加<resource>相關配置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM