Mybatis 注解开发

1. MyBatis 的常用注解

这几年来注解开发越来越流行,Mybatis 也可以使用注解开发方式,这样我们就可以减少编写 Mapper映射文件了。我们先围绕一些基本的 CRUD 来学习,再学习复杂映射多表操作。

  • @Insert:实现新增
  • @Update:实现更新
  • @Delete:实现删除
  • @Select:实现查询
  • @Result:实现结果集封装
  • @Results:可以与 @Result 一起使用,封装多个结果集
  • @One:实现一对一结果集封装
  • @Many:实现一对多结果集封装

2. MyBatis 的增删改查

我们完成简单的 user 表的增删改查的操作

@Before
public void before() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = sqlSessionFactory.openSession(true);
    userMapper = sqlSession.getMapper(UserMapper.class);
    orderMapper = sqlSession.getMapper(OrderMapper.class);
}

@Test
public void addUser(){
    User user = new User();
    user.setId(3);
    user.setUsername("测试数据");

    userMapper.addUser(user);
}

@Test
public void updateUser(){
    User user = new User();
    user.setId(3);
    user.setUsername("修改了测试数据");

    userMapper.updateUser(user);

}

@Test
public void selectUser(){
    List<User> users = userMapper.selectUser();
    for (User user : users) {
        System.out.println(user);
    }
}

@Test
public void deleteUser(){
    userMapper.deleteUser(3);
}
//添加用户
@Insert("insert into user values(#{id},#{username})")
void addUser(User user);

//更新用户
@Update("update user set username = #{username} where id = #{id}")
void updateUser(User user);

//查询用户
@Select("select * from user")
List<User> selectUser();

//删除用户
@Delete("delete from user where id = #{id}")
void deleteUser(Integer id);

修改 MyBatis 的核心配置文件,我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的 Mapper 接口即可。

<!--引入映射配置文件-->
<mappers>
  	<mapper class="com.study.mapper.UserMapper"/>
</mappers>

或者指定扫描包含映射关系的接口所在的包也可以。

<!--引入映射配置文件-->
<mappers>
  	<package name="com.study.mapper"/>
</mappers>

3. MyBatis 的注解实现复杂映射开发

实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用 @Results 注解,@Result 注解,@One 注解,@Many 注解组合完成复杂关系的配置。
在这里插入图片描述
在这里插入图片描述

4. 一对一查询

4.1. 一对一查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户。
一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户。
在这里插入图片描述

4.2. 一对一查询的语句

对应的 sql 语句:

select * from orders;
select * from user where id = 查询出订单的uid;

查询的结果如下:
在这里插入图片描述

4.3. 创建 Order 和 User 实体

package com.study.pojo;

import lombok.Data;

import java.util.Date;

@Data
public class Order {

    private int id;

    private Date ordertime;

    private double total;

    /**
     * 代表当前订单属于哪个用户
     */
    private User user;
}
package com.study.pojo;

import lombok.Data;

@Data
public class User {

    private Integer id;

    private String username;

}

4.4. 创建 OrderMapper 接口

package com.study.mapper;

import com.study.pojo.Order;

import java.util.List;

public interface OrderMapper {

    // 查询订单的同时还查询订单所属用户
    List<Order> findOrderAndUser();
}

4.5. 使用注解配置 Mapper

package com.study.mapper;

import com.study.pojo.Order;
import com.study.pojo.User;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface OrderMapper {

    @Results({
        @Result(property = "id",column = "id"),
        @Result(property = "ordertime",column = "ordertime"),
        @Result(property = "total",column = "total"),
        @Result(property = "user", javaType = User.class, column = "uid",
                one = @One(select = "com.study.mapper.UserMapper.findUserById"))
    })
    @Select("SELECT * FROM orders")
    List<Order> findOrderAndUser();
}
package com.study.mapper;

import com.study.pojo.User;

public interface UserMapper {

    //根据id查询用户
    @Select({"select * from user where id = #{id}"})
    User findUserById(Integer id);
}

4.6. 测试结果

@Test
public void oneToOne(){
    List<Order> orderAndUser = orderMapper.findOrderAndUser();
    for (Order order : orderAndUser) {
        System.out.println(order);
    }
}

在这里插入图片描述

5. 一对多查询

5.1. 一对多查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户。
一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单。
在这里插入图片描述

5.2. 一对多查询的语句

对应的sql语句:

select * from user;
select * from orders where uid=查询出用户的id;

查询的结果如下:

在这里插入图片描述

5.3. 修改 User 实体

package com.study.pojo;

import lombok.Data;

import java.util.Date;

@Data
public class Order {

    private int id;

    private Date ordertime;

    private double total;
}
package com.study.pojo;

import lombok.Data;

import java.util.List;

@Data
public class User {

    private Integer id;

    private String username;

    //代表当前用户具备哪些订单
    private List<Order> orderList;
}

5.4. 创建 UserMapper 接口

List<User> findAll();

5.5. 使用注解配置 Mapper

package com.study.mapper;

import com.study.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserMapper {

    // 查询所有用户信息,同时查询出每个用户关联的订单信息
    @Results({
        @Result(property = "id" , column = "id"),
        @Result(property = "username",column = "username"),
        @Result(property = "orderList", column = "id", javaType = List.class,
                many = @Many(select = "com.study.mapper.OrderMapper.findOrderByUid"))
    })
    @Select("select * from user")
    List<User> findAll();
}
package com.study.mapper;

import com.study.pojo.Order;

import java.util.List;

public interface OrderMapper {
    @Select("select * from orders where uid = #{uid}")
    List<Order> findOrderByUid(Integer uid);
}

5.6. 测试结果

@Test
public void oneToMany(){
    List<User> all = userMapper.findAll();
    for (User user : all) {
        System.out.println(user);
    }
}

在这里插入图片描述

6. 多对多查询

6.1. 多对多查询的模型

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用。
多对多查询的需求:查询用户同时查询出该用户的所有角色。
在这里插入图片描述

6.2. 多对多查询的语句

对应的 sql 语句:

select * from user;
select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=⽤户的id

查询的结果如下:
在这里插入图片描述

6.3. 创建 Role 实体,修改 User 实体

package com.study.pojo;

import lombok.Data;

@Data
public class Role {

    private Integer id;

    private String roleName;

    private String roleDesc;
}
package com.study.pojo;

import lombok.Data;

import java.util.List;

@Data
public class User {

    private Integer id;

    private String username;

    // 表示用户关联的角色
    private List<Role> roleList;
}

6.4. 添加 UserMapper 接口方法

List<User> findAllUserAndRole();

6.5. 使用注解配置 Mapper

package com.study.mapper;

import com.study.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserMapper {

    // 查询所有用户,同时查询每个用户关联的角色信息
    @Results({
        @Result(property = "id" , column = "id"),
        @Result(property = "username",column = "username"),
        @Result(property = "roleList", column = "id", javaType = List.class,
                many = @Many(select = "com.study.mapper.RoleMapper.findRoleByUid"))
    })
    @Select("select * from user")
    List<User> findAllUserAndRole();

}
package com.study.mapper;

import com.study.pojo.Role;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface RoleMapper {

    @Select("select * from sys_role r,sys_user_role ur where r.id = ur.roleid and ur.userid = #{uid}")
    public List<Role> findRoleByUid(Integer uid);
}

6.6. 测试结果

@Test
public void ManyToMany(){
    List<User> all = userMapper.findAllUserAndRole();
    for (User user : all) {
        System.out.println(user);
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小松の博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值