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>相关配置

posted @ 2020-03-16 21:48  狼_少_年  阅读(4928)  评论(0编辑  收藏  举报