mybatis中解决数据库字段名和JavaBean属性名不同问题

mybatis中解决数据库字段名和JavaBean属性名不同问题

一、问题引入

在使用mybatis进行数据库查询的时候,通常会将查询到的数据存放到一个对象中,如果我们直接配置对应的mapper映射文件,然后执行sql进行数据查询,如果数据库中的字段名和javaBean中定义的属性名相同,倒是没有问题,倘若出现了属性名和字段名不同的情况,则数据无法正常写入到对象中。

我在mapper定义了如下的sql语句

        <select id="selectAll" resultType="Brand">
            select *
            from tb_brand
        </select>

查询tb_brand表中的所有数据,并提前准备好了Brand对象,如下图:

Brand类中定义的成员变量
在这里插入图片描述

tb_brand表
在这里插入图片描述

这里可以看到上面有brandName和companyName这两个属性和字段是不相同的,此时我们直接执行,会得到如下结果:

在这里插入图片描述
可以明显的看到brandName和companyName的值为null,这说明这两个属性的值并未成功赋值,原因就是字段名和属性名不同导致的。

二、解决方案

2.1 方法一

上面分析可知,数据无法成功赋值的原因是属性名和字段名不同导致的,那么我们让他们相同不就可以了吗?按照这个思路,属性名我们不好在动了,字段名也不好动,但是在学习sql的时候我们知道,字段名是可以使用as取别名的,那如果将和属性名不相同的字段名通过取别名的方式改成一致,是否可以解决呢?

更新对应的mapper配置如下:

        <select id="selectAll" resultType="Brand">
            select id, brand_name as brandName, company_name as companyName, ordered, description, status
            from tb_brand
        </select>

执行程序结果如下:在这里插入图片描述

嗯~ o( ̄▽ ̄)o,看着很不错,貌似完美解决了,但是仔细想了一下,如果我有很多条sql语句,进行了非常多次的查询,难道我每次都要像这样写一大堆的字符串吗?这也太繁琐了吧,那有没有更好的办法呢?
既然上面的查询的字段名部分重复了,那能否给它们抽取出来呢?
于是对mapper配置文件进行了如下的改进

        <sql id="brand_col">
            id, brand_name as brandName, company_name as companyName, ordered, description, status
        </sql>
        <select id="selectAll" resultType="Brand">
            select
            # 使用include将上面的sql片段引入到sql语句中
            <include refid="brand_col"></include>
            from tb_brand
        </select>

再次进行测试
在这里插入图片描述
依然可以正常执行,虽然看起来比上面的方法繁琐了很多,但是一旦当查询的语句多了的话,还是能省点儿事儿的,但是这样就好了吗?看起来还是常常的一大串,有没有更好的方法呢?

2.2 方法二

这时我想到了之前学过的mapper代理,当时为了解决sql语句执行的问题,定义了对应的mapper接口来映射相应的mapper中的sql语句,从而完成了对应的sql执行操作,那么这里是否也可以向上面那样采用映射的方法呢,将属性和字段进行映射,从而解决上面的问题。
在这里,我才用了resultMap进行字段和属性的映射
修改mapper配置文件如下:

    <resultMap id="brandResultMap" type="brand">
<!--        主键字段使用id-->
<!--        <id column="" property=""></id>-->
<!--        一般字段使用result-->
        <result column="brand_name" property="brandName"></result>
        <result column="company_name" property="companyName"></result>
    </resultMap>
    <select id="selectAll" resultMap="brandResultMap">
        select *
        from tb_brand
    </select>

上面resultMap中的映射关系可以很清晰的看懂,这里就不再多说,当我们配置完resultMap够,需要修改<select id="selectAll" resultType="Brand">中的 resultType=“Brand”,改为<select id="selectAll" resultMap="brandResultMap">这样,然后就可以美滋滋的向最开始那样写sql了。
执行结果如下:

在这里插入图片描述
完美!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值