mybatis 映射sql常用注解

最常用的 @Insert,@Update,@Delete,@Select 这里就不说了
表结构如下,注意,使用的是MySQL
这里写图片描述
@Options获取自增长id
UserMapper 写法如下,keyProperty 对应的数据表自增长id

    @Insert("insert into user(name,age) values(#{name},#{age})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int addUser(User user);

获取 增长id 值

     userMapper.addUser(user);
     int id = user.getId();
     System.out.println("获取到的自增长id为:"+id);

@SelectKey

LZ测试的MySQL,如是Oracle什么的,可能就不适用了,那就可以换成
@SelectKey,当然了,MySQL也是适用的
UserMapper如下,注意 before=true 是获取执行添加操作之前 before = false 就是获取刚刚执行了添加操作之后的,获取增长id 方式同上

    @Insert("insert into user(name,age) values(#{name},#{age})")
    @SelectKey(statement="select max(id) FROM user",
            keyProperty="id", resultType=int.class ,before = false)
    int addUser1(User user);

@Results查询结果映射
如下 column 对应的是数据表的字段 property 对应是User实体的字段属性
注,数据表和实体字段名字一样,可不写,不一样,就得这样匹配(查询操作)

    @Select("select * from user where id = #{id}")
    @Results({
                @Result(column = "age", property = "age"),
                @Result(column = "name", property = "name"),
            })
    User getUsers(int id);

@Param 参数注解
当我们传2个参数时,必须要用此注解,单个注解可不必,如下
“id2” 对应的名称是和 #{id2} 一致

    @Select("select * from user where id = #{id2} and age = #{age}")
    User selectUser(@Param("id2")int id,@Param("age")int age);

@One 一对一 关联查询数据
比如我user表还有一个对应的部门 department_id 外键,同理 User 实体增加一个
private Department department 属性 ,需求是查询用户信息包含该用户的部门信息

    // 查询部门信息
    @Select("select * from department where id = #{id}")
    Department getDepartment(int id);

    @Select("select * from user where id = #{id}")
    @Results({
            @Result(column = "department_id", property = "department",
                    one = @One(select = "com.yf.dao.UserMapper.getDepartment"),javaType = Department.class),
    })
    User getUserInfo(int id);

上面 department_id 其实作为参数 传入了 getDepartment方法里的id

@Many 一对多查询
假设情形是一个部门对应多个用户
Department实体类添加
private List<User> users; 为了方便,我把sql语句都写一起了,如下

    @Select("select * from user where department_id = #{departmentId}")
    List<User> getUsers(int departmentId);

    @Select("select * from department where id = # {id}")
    @Results({
            @Result(column = "id", property = "users",
                    many = @Many(select = "com.yf.dao.UserMapper.getUsers")),
    })
    Department selectDepartment(int id);

时间原因,这里没有亲测,自行建数据表测试

动态sql
@InsertProvider @UpdateProvider @DeleteProvider @SelectProvider
这里以 @DeleteProvider 为例,其他3个模式都是一样
注意:LZ测试这个时,一个参数也加了@Param ,没加报错了

  @DeleteProvider(type = DySql.class, method = "delUser")
  int delete(@Param("id") int id);

再看 DySql.java

public class DySql {

    public String delUser(int id) {
        return new SQL() {
            {
                DELETE_FROM("user"); // SELECT(查) INSERT_INTO(增) UPDATE(改)
                WHERE("id = #{id}");
            }
        } .toString();
    }

    public String delUser2(int id) {
        String sql = "delete from user where id ="+id;
        return sql;
    }

}

这里写了二种方式,第一种速度快点,sql语句抒写略有不同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值