4、Mybatis中实体类bean的属性名与数据库表中对应字段名不同

例如一个USER表中一个字段为name,在工程中创建的USER表对应的bean为User,其中一个属性为user_name,在Mybaits中的sql映射文件中一定要映射字段,否则会操作sql不正确。下面以两种方式为示例:
表如下:
这里写图片描述

一、在sql语句中进行映射

1、创建表对应的实体类User,类中的属性名与表USER中的字段名不一致。

package com.lzj.mybaits.test1;

public class User {
    private int user_id;
    private String user_name;
    private int user_age;

    public User() {
        super();
    }

    public User(int user_id, String user_name, int user_age) {
        super();
        this.user_id = user_id;
        this.user_name = user_name;
        this.user_age = user_age;
    }

    public int getUser_id() {
        return user_id;
    }

    public void setUser_id(int user_id) {
        this.user_id = user_id;
    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    public int getUser_age() {
        return user_age;
    }

    public void setUser_age(int user_age) {
        this.user_age = user_age;
    }

    @Override
    public String toString() {
        return "User [user_id=" + user_id + ", user_name=" + user_name + ", user_age=" + user_age + "]";
    }

}

2、以查询语句为例,定义sql的映射userMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.lzj.mybaits.test1.userMapper">

    <!--由于conf.xml文件中已经配置了
    <typeAliases>
        <package name="com.lzj.mybaits.test1"/>
    </typeAliases>
    所以select语句返回的类型不用带包名,直接写类的名字User就可以了。
    -->
    <select id="getUser" parameterType="int" resultType="User">
        <!--在select语句中,直接把表中的id、name、age字段分别映射成实体类User中的user_id、user_name、user_age属性-->
        select id user_id, name user_name, age user_age
        from users where id=#{id}
    </select>

</mapper>

3、定义Mybaits的配置文件conf.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <typeAliases>
        <package name="com.lzj.mybaits.test1"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/lzj_database" />
                <property name="username" value="root" />
                <property name="password" value="lzjlzj" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/lzj/mybaits/test1/userMapper.xml"/>
    </mappers>

</configuration>

4、定义测试类

package com.lzj.mybaits.test1;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybaitsTest {

    public static void main(String[] args) throws Exception {
        String resource = "conf.xml";
        InputStream in = MybaitsTest.class.getClassLoader().getResourceAsStream(resource);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        /*自动提交事务*/
        SqlSession session = factory.openSession(true);
        String statement = "com.lzj.mybaits.test1.userMapper.getUser";
        User user = session.selectOne(statement, 3);
        System.out.println(user);
        session.close();
    }

}

运行测试类,输出结果如下

User [user_id=3, user_name=lzj, user_age=25]

二、通过<resultMap>指定字段映射

大多数情况下可以通过<resultMap> 标签指定表中字段和实体类中属性的映射。修改上面sql的userMapper.xml映射文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.lzj.mybaits.test1.userMapper">

    <!--type属性指定要映射的那个实体类,由于在conf.xml中已经用`<typeAliases>`配置了包名,故此地不用写全类名-->
    <resultMap type="User" id="userResult">
        <!--主键用<id>标签,表示把表中的id字段映射到实体类User中的user_id属性-->
        <id property="user_id" column="id"/>
        <!--非主键用<reslut>标签,表示把表中的name字段映射到实体类User的user_name属性-->
        <result property="user_name" column="nane"/>
        <result property="user_age" column="age"/>
    </resultMap>

    <!--resultMap属性指定该select语句返回的结果要映射到User实体类中,并对字段和属性之间进行了映射->
    <!--#{id}为指定的int类型的传入的参数-->
    <select id="getUser" parameterType="int" resultMap="userResult">
        select id, name, age
        from users where id=#{id}
    </select>

</mapper>
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
出现这种情况可能是因为MybatisPlus默认开启了驼峰命转换,而您的表中字段名是下划线命的,导致MybatisPlus找不到该字段。您可以试试以下方法解决该问题: 1. 在实体类对应字段上添加@TableField注解,指定该字段名对应数据库字段名,例如: ```java @TableField(value = "del_flag") private Integer delFlag; ``` 2. 在MybatisPlus的全局配置,禁用驼峰命转换,例如: ```java @Configuration @MapperScan("com.example.mapper") public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { return new MybatisPlusInterceptor(); } @Bean public ConfigurationCustomizer configurationCustomizer() { return configuration -> configuration.setObjectWrapperFactory(new MybatisMapWrapperFactory()); } @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean(); sqlSessionFactory.setDataSource(dataSource); sqlSessionFactory.setTypeAliasesPackage("com.example.entity"); GlobalConfig globalConfig = new GlobalConfig(); globalConfig.setDbConfig(new GlobalConfig.DbConfig().setCapitalMode(false)); sqlSessionFactory.setGlobalConfig(globalConfig); MybatisConfiguration configuration = new MybatisConfiguration(); configuration.setMapUnderscoreToCamelCase(false); sqlSessionFactory.setConfiguration(configuration); sqlSessionFactory.setPlugins(new Interceptor[]{ new PaginationInterceptor(), new OptimisticLockerInterceptor(), new MybatisPlusInterceptor() }); return sqlSessionFactory.getObject(); } } ``` 配置的`configuration.setMapUnderscoreToCamelCase(false)`即为禁用驼峰命转换的配置。 希望以上方法可以帮到您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值