用户芝麻开门 發表於 2026-1-12 08:44:12

MyBatis-Plus中@TableField和@TableId说明

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一、@TableField(value = &ldquo;表字段&rdquo;)</li><li>二、@TableField(select = false)</li><li>三、@TableField(exist = false)</li><li>四、@TableId(type = IdType.AUTO)补充</li><li>总结</li></ul></div><p class="maodian"></p><h2>一、@TableField(value = &ldquo;表字段&rdquo;)</h2>
<p>如果表的字段与pojo类的属性值对应不上,就像表字段为user_name,但是属性的为uName时,在查询所有中就会报错,找不到表的字段信息。</p>
<blockquote><p>java.sql.SQLSyntaxErrorException: Unknown column &lsquo;u_name&rsquo; in &lsquo;field list&rsquo;</p></blockquote>
<p>就是表的字段和User类没有对应上。</p>
<p>这里就需要加入该注解@TableField(value = &ldquo;user_name&rdquo;),解决字段不一致问题(value写表字段名),使得一一对应起来。</p>
<div class="jb51code"><pre class="brush:java;">    @TableField(value = "user_name")
    private String uName;
</pre></div>
<p><strong>注:</strong></p>
<p>但如果表字段user_name。定义的userName。</p>
<p>驼峰命名会自动识别。不写注解也可以)</p>
<p>再次运行即可解决该问题 如图所示:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011208422645.png" /></p>
<p class="maodian"></p><h2>二、@TableField(select = false)</h2>
<p>这是用来解决如果用户名密码不想显示时可以在属性上添加该字段,sql语句就不会去查询该字段。</p>
<p>这样在查询时密码字段会变成null输出,保证安全性。</p>
<div class="jb51code"><pre class="brush:java;">         //查询不显示用户密码
    @TableField(select = false)
    private String userPassword;
</pre></div>
<p class="maodian"></p><h2>三、@TableField(exist = false)</h2>
<p>在添加中,如果User类下的属性数据库字段没有,再添加时还会给这个属性赋值,然后发送到mapper执行插入数据操作时就会报错。</p>
<blockquote><p>java.sql.SQLSyntaxErrorException: Unknown column &lsquo;hobby&rsquo; in &lsquo;field list&rsquo;</p></blockquote>
<p>Mybatis-plus忽略表中映射的字段:</p>
<p>Mybatis-plus使用entity和数据库进行关联映射,有时候可能有些字段,在当前表中不存在,但是操作的时候,又需要进行使用,所以有时候就需要进行忽略。</p>
<p>具体如何忽略如下:</p>
<ul><li>@TableField(exist = false):表示该属性不是表中字段,但又是必须使用的。</li><li>@TableField(exist = true):表示该属性是表中字段。</li></ul>
<p>执行下面的测试方法进行测试:</p>
<div class="jb51code"><pre class="brush:java;">        //测试添加方法
    @Test
    public void testInsert(){
      User user=new User();
      user.setUserName("哈哈111");
      user.setUserEmail("12433");
      user.setUserRole("ADMIN");
      user.setUserStatus("0");
      user.setUserPassword("12344");

                // 表中没有字段
      user.setHobby("足球");
      //受影响的行数count
      int count = userMapper.insert(user);
      if(count&gt;0){//添加成功
            //输出所有数据
            testSelectList();
      }else {//添加失败
            System.out.println("添加失败~");
      }
    }
</pre></div>
<p><strong>解决该方法:</strong></p>
<p>就要使用 @TableField(exist = false)注解,表示数据表中没有该字段,添加时生成sql代码就会知道。</p>
<div class="jb51code"><pre class="brush:java;">//数据库中没有该字段时需要添加注解
@TableField(exist = false)
private String hobby;
</pre></div>
<p class="maodian"></p><h2>四、@TableId(type = IdType.AUTO)补充</h2>
<p>这个是通过id查询时,如果不在id主键属性上添加该注解的话,就会报以下错误</p>
<blockquote><p>org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.imust.mp.mapper.UserMapper.selectById</p></blockquote>
<p>这就表名虽然有属性和表字段也对应,但是在通过id查询时MP不知道这个是主键,所以无法执行该方法,解决方法就是在属性上添加@TableId(type = IdType.AUTO),type等于的值有很多,一般主键都是用这个。</p>
<div class="jb51code"><pre class="brush:java;">        @TableId(type = IdType.AUTO)
    private Integer userId;
</pre></div>
<p>查看运行效果 如图所示:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011208422694.png" /></p>
<p class="maodian"></p><h2>总结</h2>
<p>以上为个人经验,希望能给大家一个参考,也希望大家多多支持琼殿技术社区。</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>MyBatis-Plus之@TableField的用法解读</li><li>mybatis-plus常用注解@TableId和@TableField的用法</li><li>Mybatis-Plus&nbsp;@TableField自动填充时间为null的问题解决</li><li>MyBatis-Plus标签@TableField之fill自动填充方式</li><li>Mybatis-Plus使用@TableField实现自动填充日期的代码示例</li><li>Mybatis-plus常见的坑@TableField不生效问题</li><li>Mybatis-plus使用注解 @TableField(exist = false)</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: MyBatis-Plus中@TableField和@TableId说明