1.說明
本文介紹Spring Boot集成MyBatis-Plus框架后,
基於已經創建好的Spring Boot工程,
添加自定義的SQL實現復雜查詢等操作。
自定義SQL主要有兩種方式,
一種是Annotation注解方式,
另一種是XML配置文件方式。
2.Annotation注解方式
直接先定義接口方法,
然后在接口方法上面開發注解即可。
下面的示例實現了通過@Select注解,
在注解中開發自定義SQL語句,
實現了通過ID查詢用戶的方法:
package com.example.demo.dao;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
public interface UserDao extends BaseMapper<User> {
@Select("SELECT * FROM TBL_USER WHERE id=#{id};")
public User getUserById(Long id);
}
3.XML配置文件方式
首先在Spring Boot中指定需要加載的XML文件,
然后新建對應接口類的XML文件,
開發對應接口方法的自定義SQL語句。
現有通過ID查詢用戶的自定義接口如下:
package com.example.demo.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
public interface UserDao extends BaseMapper<User> {
public User getUserById(Long id);
}
首先修改application.yml文件:
mybatis-plus:
# 如果是放在src/main/java目錄下 classpath:/com/*/*/mapper/*Mapper.xml
# 如果是放在resource目錄 classpath:/mapper/**.xml
mapper-locations: classpath:/mapper/**.xml
然后在src\main\resources目錄下,
創建目錄mapper,
在mapper下創建文件UserDao.xml,
在XML文件中開發自定義SQL語句:
<?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.example.demo.dao.UserDao">
<select id="getUserById" parameterType="Long" resultType="com.example.demo.entity.User">
SELECT * FROM TBL_USER WHERE id = #{id}
</select>
</mapper>
4.兩種方式共存
Annotation注解和XML配置文件這兩種方式,
可以同時使用,代碼可以正常執行,
不會沖突,也不會報錯。
但是如果自定義了一個接口方法,
沒有對應到任何實現的SQL語句,
就會報沒有找到SQL綁定的錯誤異常:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.example.demo.dao.UserDao.getUserByIdAnnotation
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.<init>(MybatisMapperMethod.java:50)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.lambda$cachedMapperMethod$0(MybatisMapperProxy.java:101)
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(Unknown Source)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.cachedMapperMethod(MybatisMapperProxy.java:100)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:95)
at com.sun.proxy.$Proxy79.getUserByIdAnnotation(Unknown Source)
at com.example.demo.SampleTest.testSelectByAnnotations(SampleTest.java:31)