MyBatis的真正强大之处在于其映射语句。由于其映射语句很强大,映射器的XML文件就显得相对简单。若将其与具有相同功能的JDBC代码进行对比,会发现,使用这种方法节省了近95%的代码量。MyBatis3.0相较2.0版本一个最大的变化,就是支持使用接口来调用方法。MyBatis使用Java的动态代理可以直接通过接口来调用相应的方法,不需要提供接口的实现类,也不需要在实现类中使用SqlSession以通过命名空间间接调用。
使用接口调用有两种方式:(1)配合XML文件使用(2)配合注解使用
使用XML方式
在上一篇博文MyBatis(一)基本用法介绍(https://blog.youkuaiyun.com/duanduan_l/article/details/91397727)中已经介绍了接口配合XML文件使用的方式。
mapper接口与对应的XML文件应遵循的规则:
-
mapper.xml中namespace是mapper.java的类 全路径
-
mapper.xml中id是mapper.java的方法名
-
mapper.xml中parameterType是mapper.java的入参类型的路径
-
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<User> 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标签
<bind name="ll" value="'%'+number+'%'"/>
select * from orders where number like #{ll}