mybatis 注解开发,概述

常用的注解

@Insert

@Update

@Delete

@Select

@Result  : 实现结果集封装

@Results : 可以与@Result一起使用,封装多个结果集

@One : 实现一对一结果集封装

@Many : 实现一对多结果集封装

 

演示简单的CRUD操作

@Insert("insert into user values(#{id},#{username},#{password},#{birthday})")
public void save (User user)
@Select("select * from user")
public List<User> findAll()

 

实现复杂查询

@Results  代替的是标签,<resultMap>该注解中可以使用单个@Result注解,也可以使用@Result集合。使用格式:@Results({@Result(),@Result()})或者@Results(@Result())

 

@Result 代替<id>标签和<result>标签。@Result中属性介绍:column:数据库中的列名,property:需要装配的属性名,one:需要使用的@One注解(@Result (one=@One)),many;需要使用的@Many注解(@Result (many=@Many()))。

 

@One (一对一) 代替<assocation>标签,是多表查询的关键,(对方查询时使用的接口方法) ,在注解中用来指定子查询返回单一对象。@One注解属性介绍:select:指定用来多表查询的sqlmapper,使用格式:@Result(column=“” ,property=“”,one=@One(select=“”))

 

@Many (多对一)代替<collection>标签,是多表查询的关键,在注解中用来指定子查询返回对象集合。使用格式:@Result(property=“”,column=“”,many=@Many(select=""))

 

举一个例子

一对一:

查订单对应的用户

// 这里有一个id的重复,用oid,实现了冗余列名,这种封装和xml的方式一样
@Select("select *,o.id oid from orders o,user u where o.uid=u.id")
@Results({
    @Result(column="oid",property="id"),
    @Result(column="ordertime",property="ordertime"),
    @Result(column="total",property="total"),
    @Result(column="uid",property="user.id"),
    @Result(column="username",property="user.username"),
    @Result(column="password",property="user.password"),

})
public List<Order> findAll();

 

// 分开查,查2次
@Select(“select * from orders”)
@Results({
    @Result(column=“id”,property=“id”),
    @Result(column=“ordertime”,property=“ordertime”),
    @Result(column=“total”,property=“total”),
    @Result ( property="user",   //要封装的属性名称
         column=“uid”,// 根据哪个字段查询user表的数据
         javaType= User.class// 要封装的实体类型
         one = @One(select="cn.taotao.mapper.UserMapper.findById")             查询哪个接口的方法获得数据
    )
})
publc List<Order> findAll()

接上面的接口查询

@Select(“select * from user where id=#{id}”)
public User findById(Integer id);

 

一对多:

查用户的所有订单

在User类中,创建一个属性 ,建立映射关系,该用户的所有订单

private List<Order> orderList;    在@Result中需要引入这个属性

// 在 UserMapper中

@Select("select * from user")
@Results({
    @Result(id=true, column= "id", property="id"),
    @Result(column= "username", property="username"),
    @Result(column= "password", property="password"),
    @Result(
             property="orderList",column="id" ,  // 当前的id,作为对方的uid查询传入 ,返回类型为List
             javaType=List.class,
many=@Many(select=“cn.taotao.mapper.OrderMapper.findbyUid”) ) ), }) public List<User> findUserAndOrderAll(); // 在 OrderMapper中 @Select(“select * from orders where uid=#{uid}”) public List<Order> findByUid(int uid);

 

多对多

(关键: 从user中建立映射关系,然后从中间表(user_role)查询结果,这个查询复杂,联合查询(user-role和role表),将结果封装到user中的映射关系属性中)

用户角色表,一个用户对应多个角色,一个角色有多个用户。

多对多一般对应一个中间表。这个例子用到了3张表,一个是user,一个role,一个是user_role(不需要建立mapper)

分别建立role,user的bean。

public class User {

    private int id;
    private String username;
    private Sting password;
    private Date birthday;
    private List<Role> roleList;     //当前用户拥有哪些角色,映射关系只需做一个即可,不用再role中建立,
}

在UserMapper中

@Select(“select * from user”)
@Results({
     @Result(id=true,column="id",property="id"),
     @Result(column="username" ,property="username"),
     @Result(property="roleList",column="id",   // 将id传入查询
           javaType=List.class,
          many=@Many(select = "cn.taotao.mapper.RoleMapper.findByUid")   // 对应下面的接口查询
      )

})
public List<User> findUserAndRoleAll();

建立RoleMapper,这个查询是关键,关联两张表,根据uid查询出所有的角色信息

@Select("select * from user_role ur,role r where ur.roleId=r.id and ur.userId=#{uid}")
public List<Role> findByUid(int uid)

 

posted @ 2022-05-07 10:45  琴声清幽  阅读(148)  评论(0编辑  收藏  举报