MyBatis-Plus 之自定义sql

推荐:MyBatis Plus汇总

MyBatis-Plus 之自定义sql

首先创建一个数据库表,如下图所示:
在这里插入图片描述

然后创建一个Spring Boot项目,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>org.kaven</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
spring:
  application:
    name: mybatis-plus
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: ITkaven@123
    url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useSSL=false

server:
  port: 8085

logging:
  level:
    root: warn
    com.kaven.mybatisplus.dao: trace
  pattern:
    console: '%p%m%n'

实体类User:

package com.kaven.mybatisplus.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@TableName("user")
@Data
public class User {

    @TableId
    private String id;

    @TableField("username")
    private String username;

    @TableField("password")
    private String password;

    @TableField("age")
    private Integer age;

    /**
     * 使用 @TableField(exist = false) ,表示该字段在数据库中不存在 ,所以不会插入数据库中
     * 使用 transient 、 static 修饰属性也不会插入数据库中
     */
    @TableField(exist = false)
    private String phone;
}

启动类:

package com.kaven.mybatisplus;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan(basePackages = "com.kaven.mybatisplus.dao")
public class AppRun {
    public static void main(String[] args) {
        SpringApplication.run(AppRun.class , args);
    }
}

@MapperScan(basePackages = "com.kaven.mybatisplus.dao")这个一定要加上。

我们先在数据库中添加几行数据,方便演示。
在这里插入图片描述
使用MyBatis-Plus来自定义sql,可以用Mybatis的方式来实现。

  • 通过Mybatis的注解

Mapper接口UserMapper:

package com.kaven.mybatisplus.dao;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.kaven.mybatisplus.entity.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Component;

import java.util.List;


@Component
public interface UserMapper extends BaseMapper<User> {

    @Select("select * from user ${ew.customSqlSegment}")
    List<User> selectBySql(@Param(Constants.WRAPPER) Wrapper<User> userWrapper);
}

测试方法:

package com.kaven.mybatisplus.dao;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.kaven.mybatisplus.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperSqlTest {

    @Autowired
    private UserMapper userMapper;


    @Test
    public void selectBySql(){
        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
        userLambdaQueryWrapper.like(User::getUsername , "k").lt(User::getAge , 40).last("limit 4");

        List<User> userList = userMapper.selectBySql(userLambdaQueryWrapper);
        userList.forEach(System.out::println);
    }
}

结果如下:
在这里插入图片描述
结果是正确的。

  • 通过Mybatis的Mapper.xml

添加UserMapper.xml文件。
在这里插入图片描述

<?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.kaven.mybatisplus.dao.UserMapper">
    <select id="selectBySql" resultType="com.kaven.mybatisplus.entity.User">
        select * from user ${ew.customSqlSegment}
    </select>
</mapper>

修改配置文件:

spring:
  application:
    name: mybatis-plus
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: ITkaven@123
    url: jdbc:mysql://47.112.7.219:3306/test?characterEncoding=utf-8&useSSL=false

server:
  port: 8085

logging:
  level:
    root: warn
    com.kaven.mybatisplus.dao: trace
  pattern:
    console: '%p%m%n'

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

添加Mapper.xml文件路径的配置。

把UserMapper接口中@Select注解那一行删掉。

package com.kaven.mybatisplus.dao;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.kaven.mybatisplus.entity.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import java.util.List;


@Component
public interface UserMapper extends BaseMapper<User> {

    List<User> selectBySql(@Param(Constants.WRAPPER) Wrapper<User> userWrapper);
}

测试代码不变。

package com.kaven.mybatisplus.dao;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.kaven.mybatisplus.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperSqlTest {

    @Autowired
    private UserMapper userMapper;


    @Test
    public void selectBySql(){
        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
        userLambdaQueryWrapper.like(User::getUsername , "k").lt(User::getAge , 40).last("limit 4");

        List<User> userList = userMapper.selectBySql(userLambdaQueryWrapper);
        userList.forEach(System.out::println);
    }
}

结果如下:
在这里插入图片描述
结果是一样的。

这样就使用MyBatis-Plus来自定义了sql,如果有些业务逻辑很难用MyBatis-Plus来实现,就可以通过自定义sql来完成。

写博客是博主记录自己的学习过程,如果有错误,请指正,谢谢!

### 回答1: Mybatis-plus提供了多种自定义SQL的方式,以下是其中几种常用的方式: 1. 使用@Select注解或者Mapper.xml文件中的<select>标签编写自定义SQL语句。 2. 使用@Update、@Insert、@Delete注解或者Mapper.xml文件中的<update>、<insert>、<delete>标签编写自定义SQL语句。 3. 使用Wrapper对象构建查询条件,然后调用BaseMapper的selectList()、selectOne()等方法进行查询。 4. 使用SqlHelper类提供的方法构建SQL语句,然后调用BaseMapper的selectList()、selectOne()等方法进行查询。 5. 使用自定义SQL解析器,将自定义SQL语句解析成Mybatis-plus可识别的SQL语句,然后调用BaseMapper的selectList()、selectOne()等方法进行查询。 以上是常用的几种自定义SQL的方式,具体使用哪种方式取决于具体的业务需求和个人习惯。 ### 回答2: Mybatis-plus 是一个基于 Mybatis 的增强工具,它提供了一系列解决方案,使得 Mybatis 的使用变得更加简单和高效。其中,自定义 SQLMybatis-plus 的一个重要特性,它提供了一种自由扩展 SQL 的方式,使得开发者可以通过自己的实现来满足各种灵活的需求。 要使用自定义 SQL,首先需要在 Mapper 接口中定义方法,并用 @Select 注解标注该方法。在注解中,我们可以书写 SQL 语句,如: ``` @Select("select * from user where name = #{name}") User findUserByName(@Param("name") String name); ``` 这里的 @Select 注解告诉了 Mybatis-plus,这是一个查询方法,所使用的 SQL 是 select * from user where name = #{name}。其中,#{name} 是一个占位符,Mybatis-plus 会自动将方法参数中的 name 值替换到该占位符中。 除了 @Select,Mybatis-plus 还提供了一些其他的注解,如 @Insert、@Update、@Delete 等,它们分别表示插入、更新、删除操作。类似于 @Select,这些注解也可以用自定义 SQL,声明方式都类似。 在定义完自定义 SQL 方法之后,我们就可以在业务方法中调用这些方法来实现对数据库的操作了,如: ``` User user = userMapper.findUserByName("Tom"); ``` 最后需要注意的是,虽然自定义 SQL 可以满足我们的各种需求,但是它们本身也存在一些缺点。比如它们可能会使代码可读性变低,也会存在 SQL 注入等安全问题。因此,在使用自定义 SQL 的时候,需要谨慎考虑,遵循安全和可读性原则来编写。 ### 回答3: MyBatis-Plus 是一个基于 MyBatis 的增强工具,在其基础上,提供了更加强大和便捷的操作。在使用 MyBatis-Plus 进行数据库操作时,很多情况下需要编写自定义SQL 语句来满足特定的需求,因此,学习如何自定义 SQL 语句是非常必要的。 MyBatis-Plus 支持多种方式自定义 SQL,以下分别介绍: 1. @Select 注解 @Select 注解可以在方法上加入 SQL 语句,执行时会使用该 SQL 语句进行查询。例如: @Select("select * from user where id = #{id}") User selectById(Long id); 2. XML 映射文件 在 MyBatis-Plus 配置文件中,可以配置 XML 映射文件的位置和名称,然后在 XML 文件中书写 SQL 语句,例如: <select id="selectById" resultType="com.example.model.User"> select * from user where id = #{id} </select> 3. 自定义接口 自定义接口是将 SQL 语句封装在方法中最为常用的方式,只需定义一个接口并继承 MyBatis-Plus 提供的 BaseMapper 接口,然后在接口中定义方法即可。例如: public interface UserMapper extends BaseMapper<User> { @Select("select * from user where username = #{username}") User selectByUsername(String username); } 4. 自定义 SQL 语句构建器 MyBatis-Plus 提供了 LambdaQueryWrapper 和 QueryWrapper 等构建器来方便编写 SQL 语句,若这些构建器无法满足我们的需求,可以自定义 SQL 语句构建器。例如: public class CustomWrapper<T> extends AbstractWrapper<T, CustomWrapper<T>> { public CustomWrapper() { super(); } public CustomWrapper(T entity) { super.setEntity(entity); } public CustomWrapper(T entity, String... columns) { super.setEntity(entity); super.select(columns); } public CustomWrapper<T> myMethod(String field, Object value) { super.eq(field, value); return this; } } 以上就是 MyBatis-Plus 自定义 SQL 的几种方式,选择哪种方式取决于个人需求和习惯。无论是哪种方式,都需要注意 SQL 注入的风险,保证 SQL 语句的安全性。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITKaven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值