Mybatis动态SQL注解开发操作数据库

通过Mybatis的动态注解开发,只需要在映射文件中使用注解来配置映射关系,从而无需编写XML映射文件。常用的注解有@Select,@Update,@Insert,@Delete等,它们分别用于配置查询,更新,插入和删除操作。

**方式一:**在mapper文件中使用@Select,@Update,@Insert,@Delete注解

1、定义数据模型类Person.java

java 复制代码
package com.lingyi.mybatis.bean;

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

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "person")
public class Person {
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    private Integer age;
    private Date birthday;
    private String email;
    private String name;
    private String gender;
    private Double salary;
}

2、编写Mapper接口

创建一个PersonMapper接口,用于定义用户与数据库的相关操作,在接口方法上使用Mybatis的注解完成SQL操作。其中PersonMapper接口可以继承mybatis的BaseMapper,也可以不继承BaseMapper。下面在原有工程的PersonMapper下添加如下内容:

java 复制代码
package com.lingyi.mybatis.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lingyi.mybatis.bean.Person;
import org.apache.ibatis.annotations.*;

/***
 * BaseMapper是MyBatisPlus内置的通用Mapper,提供了很多的方法
 * 如果它提供的方法不能满足业务需求,我们可以在这里开发新的方法
 */
//这里可以不需要填写@Mapper注解,因为在Applicaton.java的入口文件指明扫描了Mapper文件所在的包@MapperScan(basePackages = {"com.lingyi.mybatis.mapper"})
@Mapper
public interface PersonMapper extends BaseMapper<Person> {
    //mapper中自定义操作数据库的方法,通过xml方式,在xml文件中定义。
    public  Person getPersonById(Integer id);

    //mybatis动态SQL方式操作数据库
    @Select("select * from person where id = #{id}")
    Person getPersonByIdFromDynamicSql(@Param( "id") int id);

    @Insert("insert into person (age,birthday,email,gender,name,salary) Values(#{age},#{birthday},#{email},#{gender},#{name},#{salary})")
    int insertPesonByDynamicSql(Person person);

    @Update("update person set age = #{age} where id = #{id}")
    int updatePersonByDynamicSql(Person person);

    @Delete("delete from person where id = #{id}")
    int deletePersonByDynamicSql(Person person);

}

3、编写测试用例

在原有工程的TestPersonMapper.java文件中添加测试用例

java 复制代码
package com.lingyi.mybatis;

import com.lingyi.mybatis.bean.Person;
import com.lingyi.mybatis.mapper.PersonMapper;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class TestPersonMapper {
    @Autowired
    private PersonMapper personMapper;

    /**
     * 测试mybatis中xml方式操作数据库
     */
    @Test
    public  void testPersonMapper(){
        Person person = personMapper.selectById(1);
        System.out.println(person);
    }

    /**
     * 测试mybatis动态SQL语法
     */
    @Test
    public  void testSelectPersonByDynamicSql(){
       Person person =  personMapper.getPersonByIdFromDynamicSql(1);
       System.out.println(person);
    }
    @Test
    public  void testInsertPersonByByDynamicSql(){
        Person person = new Person();
        person.setAge(45);
        person.setName("lisi");
        person.setGender("男");
        person.setSalary(30000.0);
        person.setEmail("1234@qq.com");
        personMapper.insertPesonByDynamicSql(person);

    }
    @Test
    public void testUpdatePersonByDynamicSql(){
        Person person = new Person();
        person.setAge(35);
        person.setId(1);
        personMapper.updatePersonByDynamicSql(person);

    }
    @Test
    public  void testDeletePersonByDynamicSql(){
        Person person = new Person();
        person.setId(16);
        personMapper.deletePersonByDynamicSql(person);

    }
}

**方式二:**在Mapper接口中使用@SelectProvider或者@InsertProvider,@UpdateProvider,@DeleteProvider注解来实现动态生成SQL语句。

以下是一个使用@Select注解和Provider接口来动态生成SELECT语句的示例:

java 复制代码
//mapper接口中
public interface PersonMapper {
    @SelectProvider(type = PersonSqlProvider.class, method = "getPersonFromProviderById")
    User getPersonFromProviderById(Long id);
}

//PersonSqlProvider类中
public class PersonSqlProvider {
    public String getPersonFromProviderById(Long id) {
        return "SELECT * FROM person WHERE id = " + id;
    }
}

在上面的示例中,@SelectProvider注解指定了Provider接口的类型和方法,Provider接口中包含了生成SELECT语句的方法getPersonFromProviderById。在Provider接口的getPersonFromProviderById方法中,可以根据传入的参数动态生成SELECT语句。

通过这种方式,开发者可以根据不同的条件动态生成SELECT语句,从而实现更灵活的数据库查询操作。

在MyBatis中,可以使用动态SQL注解来实现动态生成SQL语句。以下是一些常用的动态SQL注解以及它们的使用方法:

1、@SelectProvider:用于动态生成SELECT语句的注解。

java 复制代码
@SelectProvider(type = UserSqlProvider.class, method = "getUserById")
User getUserById(Long id);

在这个例子中,@SelectProvider注解指定了Provider接口的类型和方法,Provider接口中包含了生成SELECT语句的方法getUserById。

2、@InsertProvider:用于动态生成INSERT语句的注解。

java 复制代码
@InsertProvider(type = UserSqlProvider.class, method = "insertUser")
void insertUser(User user);

在这个例子中,@InsertProvider注解指定了Provider接口的类型和方法,Provider接口中包含了生成INSERT语句的方法insertUser。

3、@UpdateProvider:用于动态生成UPDATE语句的注解。

java 复制代码
@UpdateProvider(type = UserSqlProvider.class, method = "updateUser")
void updateUser(User user);

在这个例子中,@UpdateProvider注解指定了Provider接口的类型和方法,Provider接口中包含了生成UPDATE语句的方法updateUser。

4、@DeleteProvider:用于动态生成DELETE语句的注解。

java 复制代码
@DeleteProvider(type = UserSqlProvider.class, method = "deleteUser")
void deleteUser(Long id);

在这个例子中,@DeleteProvider注解指定了Provider接口的类型和方法,Provider接口中包含了生成DELETE语句的方法deleteUser。

相关推荐
BaiPeter22 分钟前
ZPL文件预览
开发语言·c++
aiks_yuan1 小时前
Java CPU 100% 怎么排查:JDK 11 起 jstack 自带线程 CPU 时间,不用再 top -H 换算十六进制(JDK 8、11、17 实测)
java
Flynn Liang2 小时前
AiServices 源码级拆解:一个接口如何变成 RAG Agent
java·langchain·源码分析·rag·langchain4j·aiservices
Flynn Liang2 小时前
LangChain4j 1.23 架构全景:Java 大模型应用的 6 层抽象
java·langchain·大模型·rag·ai agent·langchain4j
聪明的笨猪猪3 小时前
实际工程问题:AI生成Redis分布式锁的原子性缺陷导致库存超卖
java·经验分享·面试·ai编程
软件技术NINI4 小时前
基于SpringBoot和Vue的新能源汽车销售推荐系统
java·vue.js·spring boot·后端·汽车·毕业设计·毕设
Flynn Liang4 小时前
LangChain4j 生产级工程骨架:12 个模块 + Docker 一键启动
java·spring boot·langchain·rag·langchain4j
噢,我明白了5 小时前
JAVA中的一些基础应用知识点
java·开发语言
SL_staff6 小时前
私有化低代码不是妥协,而是企业级数字化的自主可控主航道
java
装不满的克莱因瓶6 小时前
【SpringAI Alibaba】ReactAgent结构化输出OutputType与OutputSchema实战
java·人工智能·ai·springai·springaialibaba