最常用的 @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语句抒写略有不同