Mybatis补充——注解,拦截器
注解:
注解 Annotation 是从JDK1.5 开始引入的新技术。
注解的作用:
不是程序本身,可以对程序作出解释
可以被其他程序读取到
Annotation格式
注解是以@注解名的方式在代码中实现的,可以添加一些参数值
如:@SuppressWarnings(value=“unchecked”)
注解使用的位置:
package、class、method、field 等上面,相当于给他们添加了额外的辅助信息
元注解:
@Target:用于描述注解的使用范围
@Retention:用于描述注解的生命周期
@Documented:说明该注解将被包含在javadoc 中
@Inherited:说明子类可以继承父类中的该注解
@Repeatable:可重复注解
内置注解
@Override: 重写检查
@Deprecated:过时
@SuppressWarnings: 压制警告
@FunctionalInterface: 函数式接口
自定义注解
public @interface MyAnno{}
MyBatis 注解
@Select("select * from user where uid=#{uid}")
public User findUserById(int uid);
MyBatis 常用注解
@Insert:实现新增 和 xml中的 sql语法完全一样
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@ResultMap:实现引用@Results 定义的封装
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
@SelectProvider: 实现动态 SQL 映射
@ResultMap : 引用结果集合
@SelectKey : 获取最新插入
@Select @Results @Result
注意:配置文件
使用注解实现映射查询:
@Select("select * from user where uid=#{uid}")
@Results(id = "userMap",value= {
@Result(id = true,column = "uid",property = "uid"),
@Result(column = "uname",property = "uame"),
@Result(column = "address",property = "address")
}
)
public User findUserById(Integer uid);
@ResultMap
使用注解@ResultMap可以重用结果映射:
@Select("select * from user where uid=#{uid}")
@Results(id = "userMap",value= {
@Result(id = true,column = "uid",property = "uid"),
@Result(column = "uname",property = "uame"),
@Result(column = "address",property = "address")
}
)
public User findUserById(Integer uid);
@ResultMap(value = "userMap")
@Select("select * from user")
public List<User> findAllUser();
@Insert @SelectKey
使用注解@SelectKey可以获取自动增长主键
/**
* 注意:before=false
*/
@Insert("insert into user(uname,sex,address)values
(#{uname},#{sex},#{address})")
@SelectKey(before = false,keyColumn = "uid",
keyProperty = "uid",
statement = "select last_insert_id()",
resultType = Integer.class)
public int insertUser(User user);
@Delete @Param
使用注解@Param可以映射参数
/**
* 根据主键删除用户
* 注意#{userId} 和 @Param("userId") 对应
*/
@Delete("delete from user where uid=#{userId}")
public void delete(@Param("userId") Integer uid);
@Param
@ResultMap("userMap")
@Select("select * from user where uname like #{username} and sex=#{sex}")
public List<User> findUserByNameAndSex(@Param("username") String uname, @Param("sex") String sex);
@Update
使用注解@Update完成修改
/**
* 修改用户信息
*/
@Update("update user set uname=#{uname},address=#{address} where uid=#{uid}")
public int updateUser(User user);
关联映射:@One
使用注解@One完成一对一关联映射(一个订单对应一个用户):
@Results(id="orderUserMap",value={
@Result(id=true,column = "oid",property = "oid"),
@Result(column = "user_id",property = "userId"),
@Result(column = "user_id",property = "user", one=@One(select = "com.wdzl.mybatis.mapper.ItemsMapper.findUserById"))
})
@Select("select orders.* from orders where oid=#{oid}")
public Order findOrderById(Integer oid);
关联映射:@Many
使用注解@Many完成一对多关联映射(一个订单对应多个订单详情)
@Results(id="orderDetailMap",value={
@Result(id=true,column = "oid",property = "oid"),
@Result(column = "user_id",property = "userId"),
@Result(column = "oid",property = "orderDetails",many=@Many(select = "com.wdzl.mybatis.mapper.ItemsMapper.findOrderDetails"))
})
@Select("select orders.* from orders where oid=#{oid}")
public Order findOrder(Integer oid);
使用注解内嵌 Script 脚本实现动态SQL(了解)
@Update("<script>update school " +
"<set>" +
" <if test=\"schoolName!=null\">" +
" sCname=#{schoolName}," +
" </if>" +
" <if test=\"address!=null\">" +
" address=#{address}," +
" </if>" +
"</set>" +
"<where>" +
" <if test=\"scid!=null\">" +
" scid=#{scid}" +
" </if>" +
"</where>" +
"</script>")
public void update(School school);
使用Provider注解标识
@InsertProvider、@SelectProvider、@UpdateProvider、@DeleteProvider
(1) 先定义 Provider 类
new SQL(){
{
SELECT("sid,sname,sex");
FROM("student");
if(student.getSname()!=null){
WHERE("sname=#{sname}");
}
ORDER_BY("birthday desc");
}
}.toString();
(2) 注解使用Provider类
@SelectProvider(type = StudentProvider.class,method = "query")
public List<Student> list(Student student);
拦截器
拦截器执行原理
拦截器接口 | 拦截器实现类 |
---|---|
Executor | CachingExecutor |
StatementHandler | RoutingStatementHandler |
ParameterHandler | DefaultParameterHandler |
ResultSetHandler | DefaultResultSetHandler |
Executor: 拦截执行器的方法。
ParameterHandler: 拦截参数的处理。
ResultHandler: 拦截结果集的处理。
StatementHandler: 拦截Sql语法构建处理
拦截器均需要实现该 org.apache.ibatis.plugin.Interceptor 接口。
拦截器-自定义拦截器步骤
(1)自定义实现org.apache.ibatis.plugin.Interceptor接口的拦截器类,并实现其中的方法
(2)添加@Intercepts注解,写上需要拦截的对象和方法,以及方法参数。
(3)配置文件中添加插件配置拦截器