文章目录
- [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);
}
}