Mybatis补充——注解,拦截器

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) 先定义 Providernew 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);

拦截器

拦截器执行原理

在这里插入图片描述
在这里插入图片描述

拦截器接口拦截器实现类
ExecutorCachingExecutor
StatementHandlerRoutingStatementHandler
ParameterHandlerDefaultParameterHandler
ResultSetHandlerDefaultResultSetHandler

Executor: 拦截执行器的方法。
ParameterHandler: 拦截参数的处理。
ResultHandler: 拦截结果集的处理。
StatementHandler: 拦截Sql语法构建处理

拦截器均需要实现该 org.apache.ibatis.plugin.Interceptor 接口。

拦截器-自定义拦截器步骤

(1)自定义实现org.apache.ibatis.plugin.Interceptor接口的拦截器类,并实现其中的方法
(2)添加@Intercepts注解,写上需要拦截的对象和方法,以及方法参数。
在这里插入图片描述

(3)配置文件中添加插件配置拦截器
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值