Mybatis常见注解有哪些(总结)当下,注解⾮常流⾏,以前很长篇的代码,现在基本上⼀个注解就能搞定。
那,在Mybatis中⼜有哪些注解呢?
Mybatis中的注解基本上都在org.apache.ibatis.annotations⽬录下:
@MapperScan
该注解存在着争议,但不可否认的是这个注解确实是Mybatis的注解,是为了集成Spring⽽写的注解。该注解主要是扫描某个包⽬录下的Mapper,将Mapper接⼝类交给Spring进⾏管理。
使⽤⽅式
@SpringBootApplication
@MapperScan("batis.mapper")
public class Application {
}
其实,从名字上就能看出,是⽤来扫描的Mapper的。
扫描包路径可以是⼀个或者多个,也可以在路径中可以使⽤ * 作为通配符对包名进⾏匹配。
@SpringBootApplication
@MapperScan("com.tian.*.mapper")
public class Application {
}
@SpringBootApplication
@MapperScan({"batis.mapper","batis.mapper1"})
public class Application {
}
灵活度相当⾼,这样在实际上项⽬中,我们就可以指定扫描想要被扫描的包路径。
@Mapper
该注解⽬的就是为了不再写mapper映射⽂件(l)。可以⼤⼤的简化编写xml的繁琐。该注解是由Mybatis框架中定义的⼀个描述数据层接⼝的注解,注解往往起到的都是⼀个描述性作⽤,⽤于告诉Spring框架此接⼝的实现类由Mybatis负责创建,并将其实现类对象存储到spring容器中。
使⽤⽅式
@Mapper
public interface UserMapper {
User selectById(Integer id);
}
@Insert
插⼊记录的时候主键如何⽣成?对此基本上有三种⽅案,分别是:⼿动指定(应⽤层)、⾃增主键(数据层单表)、选择主键(数据层多表)。对应xml⽂件中的<insert>标签。
在应⽤层⼿动指定主键
⼿动指定的⽅式不把主键区别看待,插⼊之前在应⽤层⽣成对象的时候就会给主键⼀个值,插⼊的时候与普通字段没啥区别。
/**
* 插⼊记录,⼿动分配主键
*/
@Insert("INSERT INTO t_user (id, username, passwd) VALUES (#{id}, #{username}, #{passwd})")
int addUserAssignKey(User user);
在上⾯的这个例⼦中,mybatis并不知道到底哪个字段是主键,id虽然是主键字段,但并没有被区别对待。
「注意」
#{username}这种写法,是把User作为了当前上下⽂,这样访问User的属性的时候直接写属性名字就可以了。
表⾃增主键
⾃增主键对应着XML配置中的主键回填,⼀个简单的例⼦:
/**
* 插⼊记录,数据库⽣成主键
*/
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("INSERT INTO t_user (username, passwd) VALUES (#{username}, #{passwd})")
int addUserGeneratedKey(User user);
使⽤Option来对应着XML设置的select标签的属性,userGeneratordKeys表⽰要使⽤⾃增主键,keyProperty⽤来指定主键字段的字段名。⾃增主键会使⽤数据库底层的⾃增特性。
选择主键
选择主键从数据层⽣成⼀个值,并⽤这个值作为主键的值。
/**
* 插⼊记录,选择主键
*/
@Insert("INSERT INTO t_user (username, passwd) VALUES (#{username}, #{passwd})")
@SelectKey(statement = "SELECT UNIX_TIMESTAMP(NOW())", keyColumn = "id", keyProperty = "id", resultType = Long.class, before = true)
int addUserSelectKey(User user);
@Delete
删除的时候只要把语句条件神马的写在@Delete注解的value⾥就好了,返回⼀个int类型是被成功删除的记录数。对应xml⽂件中
的<delete>标签。
/**
* 删除记录
*/
@Delete("DELETE FROM t_user WHERE id=#{id}")
int delete(Long id);
@Update
修改的时候和删除⼀样只要把SQL语句写在@Update的value中就好了,返回⼀个int类型表⽰被修改的记录⾏数。
对应xml⽂件中的<update>标签。
/**
* 修改记录
*/
@Update("UPDATE t_user SET username=#{username}, passwd=#{passwd} WHERE id=#{id}")
int update(User user);
@Select
查询的时候稍稍有些复杂,因为查询会涉及到如何将查出来的字段设置到对象上,对应xml⽂件中的<select>标签。
通常有那么三种办法:
在SQL语句中⼿动指定别名来匹配
在写SQL语句的时候,⼿动为每⼀个字段指定⼀个别名来跟对象的属性做匹配,适⽤于表字段名与对象属性名差异很⼤没有规律并且表字段不多的情况。
/**
* 根据ID查询,⼿动设置别名
*/
@Select("SELECT id, username, passwd, birth_day AS birthDay FROM t_user WHERE id=#{id}")
User loadByIdHandAlias(Long id);
使⽤mybatis的⾃动下划线驼峰转换
mybatis有⼀个选项叫mapUnderscoreToCamelCase,当表中的字段名与对象的属性名相同只是下划线和驼峰写法的差异时适⽤。
配置了mapUnderscoreToCamelCase之后mybatis在将ResultSet查出的数据设置到对象的时候会尝试先将下划线转换为驼峰然后前⾯拼接set去设置属性。
开启转换:
然后查询
/**
* 根据ID查询,开了⾃动驼峰转换
*/
@Select("SELECT * FROM t_user WHERE id=#{id}")
User loadByIdAutoAlias(Long id);
查看打印的结果,birth_day属性填充到了对象中:
使⽤ResultMap
对于表的字段名和对象的属性名没有太⼤相同点并且表中的字段挺多的情况下,应该使⽤ResultMap做适配。
/**
* 使⽤ResultMap
*/
@Results(id = "userMap", value = {
/
/可以使⽤这种⽅式来处理字段名和数据库表字段名不⼀致的情况
@Result(id=true, column = "id", property = "id"),
@Result(column = "username", property = "username"),
@Result(column = "passwd", property = "passwd"),
@Result(column = "birth_day", property = "birthDay")
})springboot其实就是spring
@Select("SELECT * FROM t_user WHERE id=#{id}")
User loadByIdResultMap(Long id);
@Results对应着XML中的ResultMap,同时可以为其指定⼀个id,其它地⽅可以使⽤这个id来引⽤它,⽐如要引⽤上⾯的这个Results:/**
* 引⽤其他的Result
*/
@ResultMap("userMap")
@Select("SELECT * FROM t_user WHERE id=#{id}")
User loadByIdResultMapReference(Long id);
使⽤@ResultMap来引⽤⼀个已经存在的ResultMap,这个ResultMap可以是在Java中使⽤@Results注解定义的,也可以是在XML中使⽤resultMap标签定义的。
增删改查注解总结
其他注解
@Results:结果映射的列表, 包含了⼀个特别结果列如何被映射到属性或字段的详情。属性:value, id。value 属性是 Result 注解的数组。对应xml中的<resultMap>标签。
@Result:在列和属性或字段之间的单独结果映射。属性:id,column, property, javaType ,jdbcType ,type Handler, one,many。id 属性是⼀个布尔值,表⽰了应该被⽤于⽐较(和在 XML 映射中的相似)的属性。one 属性是单独的联系, 和<association>相似 , ⽽ many 属性是对集合⽽⾔的 , 和<collection>相似。它们这样命名是为了避免名称冲突。类似于<resultMap>的⼦标签<result>``<id>。
@One:复杂类型的单独属性值映射。属性: select,已映射语句(也就是映射器⽅法)的完全限定名,它可以加载合适类型的实例。注意:联合映射在注解 API 中是不⽀持的。这是因为 Java 注解的限制,不允许循环引⽤。类似于<association>标签。
@Many:与@One类似,⼀对多的关系,类似于<collection>
@Param :参数标签,我们在Mapper的⽅法签名上标注的参数,我们可以指定参数名称,然后在注解中或者xml中的SQL⾥就可以使⽤我们⾃定义的参数名称。
@SelectKey :获取最新插⼊id。
@CacheNamespace :为给定的命名空间 (⽐如类) 配置缓存。对应xml中的<cache>。
@CacheNamespaceRef :参照另外⼀个命名空间的缓存来使⽤。属性:value,应该是⼀个名空间的字符串值(也就是类的完全限定名) 。对应xml中的<cacheRef>标签。
@ConstructorArgs :收集⼀组结果传递给⼀个劫夺对象的构造⽅法。属性:value,是形式参数的数组。
@Arg :单独的构造⽅法参数 , 是 ConstructorArgs 集合的⼀部分。属性: id,column,javaType,typeHandler。id 属性是布尔值, 来标识⽤于⽐较的属性,和XML 元素相似。对应xml中的<arg>标签。
@Case :单独实例的值和它对应的映射。属性: value,type,results。Results 属性是结果数组,因此这个注解和实际的 ResultMap 很相似,由下⾯的 Results 注解指定。对应xml中标签<case>。
Mybatis常⽤注解对应的⽬标和标签
总结
mybatis最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的。⽽到了 MyBatis 3提供了新的基于注解的配置。mybatis提供的注解有很多,笔者进⾏了分类:
「增删改查:」@Insert、@Update、@Delete、@Select、@MapKey、@Options、@SelelctKey、@Param、
@InsertProvider、@UpdateProvider、@DeleteProvider、@SelectProvider
「结果集映射:」@Results、@Result、@ResultMap、@ResultType、@ConstructorArgs、@Arg、@One、@Many、
@TypeDiscriminator、@Case

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。