6.Mybatis注解开发

本文详细介绍了MyBatis中如何使用注解进行增删改查操作,包括@Insert、@Update、@Delete和@Select的运用,以及如何通过@Results、@Result、@One和@Many实现一对多、一对一和多对多查询的映射。
摘要由CSDN通过智能技术生成

目录

 

6.1 MyBatis的常⽤注解

6.2 MyBatis的增删改查

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

6.4 ⼀对⼀查询

6.4.1 ⼀对⼀查询的模型

6.4.2 ⼀对⼀查询的语句

6.5 ⼀对多查询

6.5.1 ⼀对多查询的模型

6.5.2 ⼀对多查询的语句

6.6 多对多查询

6.6.1 多对多查询的模型

6.6.2 多对多查询的语句


6.1 MyBatis的常⽤注解

这⼏年来注解开发越来越流⾏,Mybatis也可以使⽤注解开发⽅式,这样我们就可以减少编写Mapper

 

映射⽂件了。我们先围绕⼀些基本的 CRUD 来学习,再学习复杂映射多表操作。
@Insert :实现新增
@Update :实现更新
@Delete :实现删除
@Select :实现查询
@Result :实现结果集封装
@Results :可以与 @Result ⼀起使⽤,封装多个结果集
@One :实现⼀对⼀结果集封装
@Many :实现⼀对多结果集封装
 

6.2 MyBatis的增删改查

 
在之前项目基础上创建测试接口
 
//新增用户
@Insert("insert into user values(#{id},#{username})")
public void addUser(User user);

//根据id修改姓名
@Update("update user set username=#{username} where id=#{id}")
public void updateUser(User user);

//查询用户
@Select("select * from user")
public void selectUser();

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

编写测试方法,@Before是在方法执行执行会执行的操作,

private IUserMapper mapper;

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

@Test
public void  testAddUser(){
    User user = new User();
    user.setId(3);
    user.setUsername("test");
    mapper.addUser(user);

}

结果

修改测试

@Test
public void testUpdateUser(){
    User user = new User();
    user.setId(3);
    user.setUsername("修改test");
    mapper.updateUser(user);
}

查询用户

@Test
public void  testSelectUser(){
    List<User> users = mapper.selectUser();
    System.out.println("查询所有用户"+users);
}

结果:

查询所有用户[User{id=1, username='lucy', roleList=[]}, User{id=2, username='tom', roleList=[]}, User{id=3, username='修改test', roleList=[]}]


删除用户

@Test
public void testDeleteUser(){
    mapper.deleteUser(3);
}

修改 MyBatis 的核⼼配置⽂件,我们使⽤了注解替代的映射⽂件,所以我们只需要加载使⽤了注解的
 
Mapper 接⼝即可
<mappers>
<!-- 扫描使⽤注解的类 -->
<mapper class = "com.ch.mapper.IUserMapper" ></mapper>
</mappers>

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

<mappers>
<!-- 扫描使⽤注解的类所在的包 -->
<package name = "com.ch.mapper" ></package>
</mappers>

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

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

 

6.4 ⼀对⼀查询

6.4.1 ⼀对⼀查询的模型

⽤户表和订单表的关系为,⼀个⽤户有多个订单,⼀个订单只从属于⼀个⽤户
 
⼀对⼀查询的需求:查询⼀个订单,与此同时查询出该订单所属的⽤户
 
 

6.4.2 ⼀对⼀查询的语句

对应的 sql 语句
 
select * from orders;
select * from user where id= 查询出订单的 uid;

定义接口

IUserMapper接口
@Select("select * from user where id=#{id}")
public User findUserById(Integer id);
IOrderMapper
//查询订单的同时查询该用户
@Results({
        @Result(property = "id",column = "id"),
        @Result(property = "orderTime",column = "ordertime"),
        @Result(property = "total",column = "total"),
        @Result(property = "user",column = "uid",javaType = User.class,one = @One(select = "com.ch.mapper.IUserMapper.findUserById"))
})
@Select("select * from orders")
public List<Order> findOrderAndUser();

 将colum="uid"传递给IUserMapper中的findUserById接口,进行查询,IUserMapper中返回的User返回给IOrderMapper进行封装

测试

@Test
public void testOnoToOne(){
    List<Order> orderAndUser = orderMapper.findOrderAndUser();
    System.out.println("用户信息"+orderAndUser);

}

测试结果

用户信息[Order{id=1, orderTime='2019-12-12', total=3000.0, user=User{id=1, username='lucy'}}, Order{id=2, orderTime='2019-12-12', total=4000.0, user=User{id=1, username='lucy'}}, Order{id=3, orderTime='2019-12-12', total=5000.0, user=User{id=2, username='tom'}}]

6.5 ⼀对多查询

6.5.1 ⼀对多查询的模型

⽤户表和订单表的关系为,⼀个⽤户有多个订单,⼀个订单只从属于⼀个⽤户
 
⼀对多查询的需求:查询⼀个⽤户,与此同时查询出该⽤户具有的订单
 
 

6.5.2 ⼀对多查询的语句

对应的 sql 语句:
 
select * from user;
select * from orders where uid= 查询出⽤户的 id;

 IOrderMapper接口定义

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

IUserMapper接口定义

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

测试结果:

用户和订单信息[User{id=1, username='lucy', orderList=[Order{id=1, orderTime='2019-12-12', total=3000.0, user=null}, Order{id=2, orderTime='2019-12-12', total=4000.0, user=null}]}, User{id=2, username='tom', orderList=[Order{id=3, orderTime='2019-12-12', total=5000.0, user=null}]}]

6.6 多对多查询

6.6.1 多对多查询的模型

⽤户表和⻆⾊表的关系为,⼀个⽤户有多个⻆⾊,⼀个⻆⾊被多个⽤户使⽤
 
多对多查询的需求:查询⽤户同时查询出该⽤户的所有⻆⾊
 

6.6.2 多对多查询的语句

对应的 sql 语句:
 
select * from user;
 
select * from sys_role r,sys_user_role ur where r.id=ur.roleid and ur.userid=用户的id
 

 创建IRoleMapper接口

package com.ch.mapper;

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

import java.util.List;

public interface IRoleMapper {

    @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);
}

改造IUserMapper的接口

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

测试

@Test
public void ManyToMany(){
    List<User> allUserAndRole = mapper.findAllUserAndRole();
    System.out.println("用户角色信息"+allUserAndRole);
}

结果如下:

用户角色信息[User{id=1, username='lucy', roleList=[Role{id=1, roleName='CTO', roleDesc='CTO'}, Role{id=2, roleName='CEO', roleDesc='CEO'}]}, User{id=2, username='tom', roleList=[Role{id=1, roleName='CTO', roleDesc='CTO'}, Role{id=2, roleName='CEO', roleDesc='CEO'}]}]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值