话不多说,实战演示.上来先构建一个简单的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>相关配置