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 findAll()

实现复杂查询

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

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

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

@Many (多对一)代替标签,是多表查询的关键,在注解中用来指定子查询返回对象集合。使用格式:@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 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 findAll()

接上面的接口查询

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

一对多:

查用户的所有订单

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

private List 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 findUserAndOrderAll(); // 在 OrderMapper中 @Select(“select * from orders where uid=#{uid}”) public List 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 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 findUserAndRoleAll();

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

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