Mybatis 注解开发

文章目录

  • [1. MyBatis 的常用注解](#1. MyBatis 的常用注解)
  • [2. MyBatis 的增删改查](#2. MyBatis 的增删改查)
  • [3. MyBatis 的注解实现复杂映射开发](#3. MyBatis 的注解实现复杂映射开发)
  • [4. 一对一查询](#4. 一对一查询)
    • [4.1. 一对一查询的模型](#4.1. 一对一查询的模型)
    • [4.2. 一对一查询的语句](#4.2. 一对一查询的语句)
    • [4.3. 创建 Order 和 User 实体](#4.3. 创建 Order 和 User 实体)
    • [4.4. 创建 OrderMapper 接口](#4.4. 创建 OrderMapper 接口)
    • [4.5. 使用注解配置 Mapper](#4.5. 使用注解配置 Mapper)
    • [4.6. 测试结果](#4.6. 测试结果)
  • [5. 一对多查询](#5. 一对多查询)
    • [5.1. 一对多查询的模型](#5.1. 一对多查询的模型)
    • [5.2. 一对多查询的语句](#5.2. 一对多查询的语句)
    • [5.3. 修改 User 实体](#5.3. 修改 User 实体)
    • [5.4. 创建 UserMapper 接口](#5.4. 创建 UserMapper 接口)
    • [5.5. 使用注解配置 Mapper](#5.5. 使用注解配置 Mapper)
    • [5.6. 测试结果](#5.6. 测试结果)
  • [6. 多对多查询](#6. 多对多查询)
    • [6.1. 多对多查询的模型](#6.1. 多对多查询的模型)
    • [6.2. 多对多查询的语句](#6.2. 多对多查询的语句)
    • [6.3. 创建 Role 实体,修改 User 实体](#6.3. 创建 Role 实体,修改 User 实体)
    • [6.4. 添加 UserMapper 接口方法](#6.4. 添加 UserMapper 接口方法)
    • [6.5. 使用注解配置 Mapper](#6.5. 使用注解配置 Mapper)
    • [6.6. 测试结果](#6.6. 测试结果)

1. MyBatis 的常用注解

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

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

2. MyBatis 的增删改查

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

java 复制代码
@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);
}
java 复制代码
//添加用户
@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 接口即可。

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

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

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

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

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

4. 一对一查询

4.1. 一对一查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户。

一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户。

4.2. 一对一查询的语句

对应的 sql 语句:

sql 复制代码
select * from orders;
select * from user where id = 查询出订单的uid;

查询的结果如下:

4.3. 创建 Order 和 User 实体

java 复制代码
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;
}
java 复制代码
package com.study.pojo;

import lombok.Data;

@Data
public class User {

    private Integer id;

    private String username;

}

4.4. 创建 OrderMapper 接口

java 复制代码
package com.study.mapper;

import com.study.pojo.Order;

import java.util.List;

public interface OrderMapper {

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

4.5. 使用注解配置 Mapper

java 复制代码
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();
}
java 复制代码
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. 测试结果

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

5. 一对多查询

5.1. 一对多查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户。

一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单。

5.2. 一对多查询的语句

对应的sql语句:

sql 复制代码
select * from user;
select * from orders where uid=查询出用户的id;

查询的结果如下:

5.3. 修改 User 实体

java 复制代码
package com.study.pojo;

import lombok.Data;

import java.util.Date;

@Data
public class Order {

    private int id;

    private Date ordertime;

    private double total;
}
java 复制代码
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 接口

java 复制代码
List<User> findAll();

5.5. 使用注解配置 Mapper

java 复制代码
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();
}
java 复制代码
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. 测试结果

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

6. 多对多查询

6.1. 多对多查询的模型

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用。

多对多查询的需求:查询用户同时查询出该用户的所有角色。

6.2. 多对多查询的语句

对应的 sql 语句:

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 实体

java 复制代码
package com.study.pojo;

import lombok.Data;

@Data
public class Role {

    private Integer id;

    private String roleName;

    private String roleDesc;
}
java 复制代码
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 接口方法

java 复制代码
List<User> findAllUserAndRole();

6.5. 使用注解配置 Mapper

java 复制代码
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();

}
java 复制代码
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. 测试结果

java 复制代码
@Test
public void ManyToMany(){
    List<User> all = userMapper.findAllUserAndRole();
    for (User user : all) {
        System.out.println(user);
    }
}
相关推荐
8***84823 分钟前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
9***J6285 分钟前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
M***Z21017 分钟前
SQL 建表语句详解
java·数据库·sql
v***79417 分钟前
Spring Boot 热部署
java·spring boot·后端
执笔论英雄17 分钟前
【RL】python协程
java·网络·人工智能·python·设计模式
galaxyffang28 分钟前
认证、会话管理、授权的区别
java
未名编程32 分钟前
Windows 下如何部署 Nacos 并导入配置文件
java·windows
boonya38 分钟前
Java中Plugin设计模式的规范应用
java·spring·设计模式·插件模式
杰克尼1 小时前
3. 分巧克力
java·数据结构·算法
听风吟丶1 小时前
Java 高级多线程编程:从虚拟线程到结构化并发的实战演进
java·开发语言