通常情况下 我们会特意的让数据库中的列名与类的属性名一致,来避免麻烦。
但有些情况下 我们的数据库表名是与类名不一致的
类属性名与表列名
我们的dao接口
package com.tubai.dao;
import com.tubai.domain.Role;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface RoleDao {
@Select(value="select * from role")
@Results(id="RoleMapper",value={
@Result(property = "roleID",column = "id"),
@Result(property = "roleName",column = "role_name"),
@Result(property = "roleDesc",column = "role_desc")
})
List<Role> selectAll();
@Select("select * from role where id = #{roleID}")
//当只有一个value需要赋值的 时候 value可以省略
//如果数组只有一个元素 那么大括号也可以省略
@ResultMap(value = {"RoleMapper"})
Role selectByID(Integer id);
@Select("select * from role where role_name like #{role_name}")
@ResultMap(value = {"RoleMapper"})
List<Role> selectByName(String name);
}
关于注解的源码
1、关于@Results这个注解
public @interface Results {
String id() default "";
Result[] value() default {};
}
我们可以发现 它有一个id属性 和一个Result数组
这个id属性的作用是作为唯一标识 方便其他的注解调用
而Result请往下看
@Result 注解
public @interface Result {
boolean id() default false;
String column() default "";
String property() default "";
Class<?> javaType() default void.class;
JdbcType jdbcType() default JdbcType.UNDEFINED;
Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class;
One one() default @One;
Many many() default @Many;
}
id为true的时候 表示当前子段是主键
而column和property和我们在xml中的配置是一样的
column代表的是在数据库中的列名
而property代表的是在类中的属性名
其他的请移步官方文档 或者等我以后用到再补…
@ResultMap注解
public @interface ResultMap {
String[] value();
}
我们发现它有一个String数组
那么就说明了 它可以同时引用多个唯一标识(我们就不用重复的写Results映射)
比如这里我们的唯一标识是上面@Results处的“RoleMapper”
一点细节
相信细心的朋友已经发现
@Select("select * from role where id = #{roleID}")
@ResultMap(value = {"RoleMapper"})
Role selectByID(Integer id);
@Select("select * from role where role_name like #{role_name}")
@ResultMap(value = {"RoleMapper"})
List<Role> selectByName(String name);
第一个方法的查询条件中写的是类中的属性名
而第二个方法中的查询条件写的是数据库中的列名
我们发现都可以正常运行 那么就说明了 这是相互映射的
也就是说 可以从 属性名映射到列名 亦可以从列名映射到属性名