关于Mybatis注解开发数据库表名与类中属性名不一致的情况

通常情况下 我们会特意的让数据库中的列名与类的属性名一致,来避免麻烦。

但有些情况下 我们的数据库表名是与类名不一致的

类属性名与表列名

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

我们的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);

第一个方法的查询条件中写的是类中的属性名

而第二个方法中的查询条件写的是数据库中的列名

我们发现都可以正常运行 那么就说明了 这是相互映射的

也就是说 可以从 属性名映射到列名 亦可以从列名映射到属性名

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值