話不多說,實戰演示.上來先構建一個簡單的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>相關配置