MybatisPlus注解多种方式实现一对一、一对多查询、增删改

环境搭建

创建SpringBoot项目,引入依赖

  <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

完成配置

server:
  port: 8089
spring:
  datasource:   #数据源
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/jdbc?useSSL=false&characterEncoding=utf8&serverTimezone=UTC
    username: root
    password: root

# mybatis-plus配置
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true  # 开启自动驼峰映射
  type-aliases-package: demo.domain  # 别名扫描包
  global-config:
    banner: off

创建数据库及表

Emp表

在这里插入图片描述
company表

在这里插入图片描述
项目结构图

在这里插入图片描述

实体类

员工实体

/**
 * 员工实体
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "emp",autoResultMap = true)
public class Emp {

    private int id;

    private String username;

    private int age;


    private List<Company> companies;

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", age=" + age +
                ", companies=" + companies +
                '}';
    }

}

公司实体

/**
 * 公司实体
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "company",autoResultMap = true)
public class Company {

    private int id;

    private String name;

    private Emp emp;


}

查询

EmpMapper

@Mapper
public interface EmpMapper {

    /**
     * 一般查询
     * @param id
     * @return
     */
    @Select("select * from emp where id=#{id}")
    public Emp getById(int id);

    /**
     * 多属性查询方式一
     * @param username
     * @param age
     * @return
     */
    @Select("select * from emp where username=#{username} and age=#{age}")
    public Emp getByNameAndAge(String username, int age);

    /**
     * 多属性查询方式二
     * 对象方式
     * @param emp
     * @return
     */
    @Select("select * from emp where username=#{username} and age=#{age}")
    public Emp getByNameAndAge(Emp emp);

	/**
	 根据emp id查询所属公司,配合一对多查询
	*/
	@Select("select * from company where eid=#{id}")
    public List<Company> findByEid(int id);
    
    /**
     * 一对多查询
     * @return
     */
    @Select("select * from emp")
    @Results({
            @Result(column = "id", property = "id"),
            @Result(column = "username", property = "username"),
            @Result(column = "age", property = "age"),
            @Result(
                    property = "companies",
                    column = "id",
                    javaType = List.class,
                    many = @Many(select = "demo.mapper.EmpMapper.findByEid")
            )
    })
    public List<Emp> getEmpAndCompany();


	/**
     * 一对一查询,方式一
     * @return
     */
    @Select("select *,c.id cid from emp e,company c where e.id=c.eid")
    @Results({
            @Result(column = "cid",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(column = "eid",property = "emp.id"),
            @Result(column = "username",property = "emp.username"),
            @Result(column = "age",property = "emp.age")
    })
    public List<Company> findAll();

	/**
     * 一对一查询,方式二
     * @return
     */
    @Select("select* from company")
    @Results({
            @Result(column = "id", property = "id"),
            @Result(column = "name", property = "name"),
            @Result(
                    property = "emp",
                    column = "eid",
                    javaType = demo.domain.Emp.class,
                    one = @One(select = "demo.mapper.EmpMapper.getById")
            )
    })
    public List<Company> findAll2();
}

增删改

EmpMapper


@Mapper
public interface EmpMapper{

    /**
     * 插入一条数据
     * @param emp
     */
    @Insert("insert into emp values(#{username},#{age})")
    public void add(Emp emp);

    /**
     * 修改数据
     * @param emp
     */
    @Update("update emp set age=#{age} where username=#{username}")
    public void update(Emp emp);

    /**
     * 删除数据
     * @param username
     */
    @Delete("delete from emp where username=#{username}")
    public void delete(String username);
}

测试类

@SpringBootTest
class DemoApplicationTests {

    @Resource
    private EmpMapper empMapper;

    @Test
    void testGetById(){
        Emp emp = empMapper.getById(1);
        System.out.println(emp);
    }
    
    @Test
    void testGetByNameAndAge(){
        Emp emp=new Emp();
        emp.setUsername("张三");
        emp.setAge(20);
        //Emp res = empMapper.getByNameAndAge("张三", 21);
        Emp res = empMapper.getByNameAndAge(emp);
        System.out.println(res);
    }
    
    @Test
    void testGetAll(){
        List<Company> companyList = empMapper.findByEid(1);
        System.out.println(companyList);
        
//        List<Emp> empList = empMapper.getEmpAndCompany();
//        System.out.println(empList);
        
//        List<Company> list = empMapper.findAll2();
//        System.out.println(list);

    }

}
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis Plus 中,可以使用 QueryWrapper 来实现一对多查询。QueryWrapper 是 MyBatis Plus 提供的一个用于构建查询条件的类。 假设有两个表,一个是主表 User,一个是从表 Order,它们之间是一对多的关系,一个用户可以有多个订单。要实现一对多查询,可以通过 QueryWrapper 的嵌套查询实现。 首先,需要定义两个实体类 User 和 Order,分别对应数据库中的用户表和订单表。假设 User 实体类中有一个字段为 orders,表示该用户的所有订单,可以使用 @TableField 注解来映射该字段: ```java public class User { private Long id; private String name; @TableField(exist = false) private List<Order> orders; // 省略 getter 和 setter 方法 } public class Order { private Long id; private String orderNo; private Long userId; // 省略 getter 和 setter 方法 } ``` 然后,可以使用 QueryWrapper 来构建查询条件。在查询条件中,可以通过嵌套查询实现一对多查询。假设要查询所有用户及其订单,可以使用如下代码: ```java QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("status", 1); // 查询条件,这里假设 status 字段为用户表的状态字段 List<User> userList = userMapper.selectList(queryWrapper); for (User user : userList) { QueryWrapper<Order> orderQueryWrapper = new QueryWrapper<>(); orderQueryWrapper.eq("user_id", user.getId()); // 查询条件,这里假设 user_id 字段为订单表的用户ID字段 List<Order> orderList = orderMapper.selectList(orderQueryWrapper); user.setOrders(orderList); } ``` 以上代码中,首先使用 QueryWrapper 构建查询条件,然后通过 userMapper.selectList 方法查询用户列表。接着,遍历用户列表,根据每个用户的 ID 构建订单表的查询条件,并通过 orderMapper.selectList 方法查询该用户的订单列表。最后,将订单列表设置到用户对象的 orders 字段中。 这样就实现一对多查询,每个用户对象中的 orders 字段就包含了该用户的所有订单。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值