MyBatis(二)接口绑定方式介绍(xml和注解)

  MyBatis的真正强大之处在于其映射语句。由于其映射语句很强大,映射器的XML文件就显得相对简单。若将其与具有相同功能的JDBC代码进行对比,会发现,使用这种方法节省了近95%的代码量。MyBatis3.0相较2.0版本一个最大的变化,就是支持使用接口来调用方法。MyBatis使用Java的动态代理可以直接通过接口来调用相应的方法,不需要提供接口的实现类,也不需要在实现类中使用SqlSession以通过命名空间间接调用。

   使用接口调用有两种方式:(1)配合XML文件使用(2)配合注解使用

使用XML方式

在上一篇博文MyBatis(一)基本用法介绍(https://blog.csdn.net/duanduan_l/article/details/91397727)中已经介绍了接口配合XML文件使用的方式。

mapper接口与对应的XML文件应遵循的规则:

  1. mapper.xml中namespace是mapper.java的类 全路径

  2. mapper.xml中id是mapper.java的方法名

  3. mapper.xml中parameterType是mapper.java的入参类型的路径

  4. mapper.xml中resultType是mapper.java的返回值类型的路径

关于XML文件中resultMap的使用介绍:

  resultMap标签用于配置Java对象的属性和查询结果列的对应关系,通过resultMap中配置的column和property将查询列的值映射到type对象的属性上。resultMap锁包含的属性如下:

  • id:必填,并且唯一,在select标签中,resultMap指定的值即为此处id所设置的值
  • type:必填,用于配置查询列所映射到的Java对象类型
  • extends:选填,可以配置当前的resultMap继承其他的resultMap,属性值为继承resultMap的id
  • autoMapping:选填,可以填true或false,用于配置是否启用非映射字段(没有在resultMap中配置的字段)的自动映射功能,该配置可以覆盖全局的autoMappingBehavior配置

resultMap包含的所有 标签如下:

  • constructor:配置使用构造方法注入结果,包含两个子标签idArg和arg
  • id:一个id结果,标记结果作为id(唯一值),可以帮助提高整体性能
  • result:注入到Java对象属性的普通结果
  • association:一个复杂的类型关联,许多结果将包成这种这种类型
  • collection:复杂类型的集合
  • discriminator:根据结果值来决定使用哪个结果映射

多个接口参数的用法:

      对于参数比较少的情况,还有两种可以采用:使用Map类型作为参数火使用@Param注解。

      使用Map类型作为参数的方式,即在Map中通过key来映射XML文件中SQL使用的参数值名字,value用来存放参数值,需要多个参数时,通过Map的key-value方式传递参数值。

      使用@Param注解方法,将在下面进行介绍。

使用注解方式

  注解方式SQL语句直接写在接口上,这种方式的优点在于,对于比较简单的系统,效率较高,缺点是,当SQL有变化时都需要重新编译代码。在MyBatis注解SQL中,最基本胡就是@Select,@Insert,@Update,@Delete四种,示例如下:

@Select("select * from user where id = #{id}")
    public User getUserByID(int id);

    /**
     * 获取所有用户
     * @return
     */
    @Select("select * from user ")
    public List getAllUser();

    /**
     * 通过用户名和性别查找用户
     * 只有一个参数不需要使用@Param注解,多个需要使用
     * @param name
     * @param sex
     * @return
     */
  //两个及以上用户添加属性需要.属性进行区分,一个用户可以直接上传单个用户
    @Select("select * from user where username = #{name} and sex = #{sex}")
    public User getUserByNameAndSex(@Param("name") String name, @Param("sex") String sex);

在使用SQL时,关于参数占位可以有两种表示方式:#{}和${},这两种方式的区别:

  • ${}直接将参数拼接到sql语句上,类似于JDBC使用的statement,#{}通过?作为参数占位符,将参数单独传入,类似于JDBC的preparedStatement
  • ${}有SQL注入式攻击危险,#{}采用预编译机制对sql进行编译,无误传给数据库服务端

模糊查询like的三种方式:

1、直接在参数上拼接%

2、使用concat()函数做字符串拼接

select * from orders where number like concat(concat('%', #{number}),'%')

3、bind标签

  

   select * from orders where number like #{ll}

你可能感兴趣的:(MyBatis)