MyBatis學(xué)習(xí)總結(jié)(四)——解決字段名與實體類屬性名不相同的沖突

github同步更新
博客同步更新
簡書同步更新

項目地址:傳送門

在平時的開發(fā)中,我們表中的字段名和表對應(yīng)實體類的屬性名稱不一定都是完全相同的虐拓,下面來演示一下這種情況下的如何解決字段名與實體類屬性名不相同的沖突心俗。

一、準(zhǔn)備演示需要使用的表和數(shù)據(jù)


CREATE TABLE orders(
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    order_no VARCHAR(20), 
    order_price FLOAT
);
INSERT INTO orders(order_no, order_price) VALUES('aaaa', 23);
INSERT INTO orders(order_no, order_price) VALUES('bbbb', 33);
INSERT INTO orders(order_no, order_price) VALUES('cccc', 22);

二蓉驹、定義實體類

package com.shi.mybatis;

/**
 * @author AFinalStone
 * 定義orders表對應(yīng)的實體類
 */
public class Order {
    /**
     * 
    CREATE TABLE orders(
        order_id INT PRIMARY KEY AUTO_INCREMENT,
        order_no VARCHAR(20), 
        order_price FLOAT
    );
     */
    
    //Order實體類中屬性名和orders表中的字段名是不一樣的
    private int id;                //id===>order_id
    private String orderNo;        //orderNo===>order_no
    private float price;        //price===>order_price

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Order [id=" + id + ", orderNo=" + orderNo + ", price=" + price+ "]";
    }
}

三城榛、編寫測試代碼

3.1、編寫SQL的xml映射文件

  • 1态兴、創(chuàng)建一個orderMapper.xml文件狠持,orderMapper.xml的內(nèi)容如下:
<?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,namespace的值習(xí)慣上設(shè)置成包名+sql映射文件名瞻润,這樣就能夠保證namespace的值是唯一的
例如namespace="com.shi.mapping.orderMapper"就是com.shi.mapping(包名)+orderMapper(orderMapper.xml文件去除后綴)
 -->
<mapper namespace="com.shi.mapping.orderMapper">

    <!--
        根據(jù)id查詢得到一個order對象喘垂,使用這個查詢是查詢不到我們想要的結(jié)果的,
        這主要是因為實體類的屬性名和數(shù)據(jù)庫的字段名對應(yīng)不上的原因绍撞,因此無法查詢出對應(yīng)的記錄
     -->
    <select id="getOrderById" parameterType="int"
            resultType="Order">
        select * from orders where order_id=#{id}
    </select>

    <!--
        根據(jù)id查詢得到一個order對象正勒,使用這個查詢是可以正常查詢到我們想要的結(jié)果的,
        這是因為我們將查詢的字段名都起一個和實體類屬性名相同的別名傻铣,這樣實體類的屬性名和查詢結(jié)果中的字段名就可以一一對應(yīng)上
     -->
    <select id="selectOrder" parameterType="int"
            resultType="Order">
        select order_id id, order_no orderNo,order_price price from orders where order_id=#{id}
    </select>

    <!--
    根據(jù)id查詢得到一個order對象章贞,使用這個查詢是可以正常查詢到我們想要的結(jié)果的,
    這是因為我們通過<resultMap>映射實體類屬性名和表的字段名一一對應(yīng)關(guān)系 -->
    <select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap">
        select * from orders where order_id=#{id}
    </select>
    <!--通過<resultMap>映射實體類屬性名和表的字段名對應(yīng)關(guān)系 -->
    <resultMap type="Order" id="orderResultMap">
        <!-- 用id屬性來映射主鍵字段 -->
        <id property="id" column="order_id"/>
        <!-- 用result屬性來映射非主鍵字段 -->
        <result property="orderNo" column="order_no"/>
        <result property="price" column="order_price"/>
    </resultMap>

</mapper>
  • 2非洲、在conf.xml文件中注冊orderMapper.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>

    <!-- 引用db.properties配置文件 -->
    <properties resource="db.properties"/>

    <!--不要把typeAliases放在頭部或者尾部鸭限,否則會報錯-->
    <typeAliases>
        <!--     <typeAlias type="com.shi.mybatis.User" alias="UserModel"/>-->
        <package name="com.shi.mybatis"/>
    </typeAliases>

    <!--
        development : 開發(fā)模式
        work : 工作模式
     -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!-- 配置數(shù)據(jù)庫連接信息 -->
            <dataSource type="POOLED">
                <!-- value屬性值引用db.properties配置文件中配置的值 -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${name}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>


    <mappers>
        <!-- 注冊userMapper.xml文件,
        userMapper.xml位于com.shi.mapping這個包下两踏,所以resource寫成com/shi/mapping/orderMapper.xml.xml-->
        <mapper resource="com/shi/mapping/orderMapper.xml"/>
    </mappers>


</configuration>

3.2败京、編寫單元測試代碼

package com.shi.mybatis;


import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class TestOrder {
    
    @Test
    public void testGetOrderById(){
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        /**
         * 映射sql的標(biāo)識字符串,
         * com.shi.mapping.orderMapper是orderMapper.xml文件中mapper標(biāo)簽的namespace屬性的值梦染,
         * getOrderById是select標(biāo)簽的id屬性值赡麦,通過select標(biāo)簽的id屬性值就可以找到要執(zhí)行的SQL
         */
        String statement = "com.shi.mapping.orderMapper.getOrderById";//映射sql的標(biāo)識字符串
        //執(zhí)行查詢操作,將查詢結(jié)果自動封裝成Order對象返回
        Order order = sqlSession.selectOne(statement,1);//查詢orders表中id為1的記錄
        //使用SqlSession執(zhí)行完SQL之后需要關(guān)閉SqlSession
        sqlSession.close();
        System.out.println(order);//打印結(jié)果:null弓坞,也就是沒有查詢出相應(yīng)的記錄
    }
    
    @Test
    public void testGetOrderById2(){
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        /**
         * 映射sql的標(biāo)識字符串隧甚,
         * com.shi.mapping.orderMapper是orderMapper.xml文件中mapper標(biāo)簽的namespace屬性的值,
         * selectOrder是select標(biāo)簽的id屬性值渡冻,通過select標(biāo)簽的id屬性值就可以找到要執(zhí)行的SQL
         */
        String statement = "com.shi.mapping.orderMapper.selectOrder";//映射sql的標(biāo)識字符串
        //執(zhí)行查詢操作戚扳,將查詢結(jié)果自動封裝成Order對象返回
        Order order = sqlSession.selectOne(statement,1);//查詢orders表中id為1的記錄
        //使用SqlSession執(zhí)行完SQL之后需要關(guān)閉SqlSession
        sqlSession.close();
        System.out.println(order);//打印結(jié)果:Order [id=1, orderNo=aaaa, price=23.0]
    }
    
    @Test
    public void testGetOrderById3(){
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        /**
         * 映射sql的標(biāo)識字符串,
         * com.shi.mapping.orderMapper是orderMapper.xml文件中mapper標(biāo)簽的namespace屬性的值族吻,
         * selectOrderResultMap是select標(biāo)簽的id屬性值帽借,通過select標(biāo)簽的id屬性值就可以找到要執(zhí)行的SQL
         */
        String statement = "com.shi.mapping.orderMapper.selectOrderResultMap";//映射sql的標(biāo)識字符串
        //執(zhí)行查詢操作珠增,將查詢結(jié)果自動封裝成Order對象返回
        Order order = sqlSession.selectOne(statement,1);//查詢orders表中id為1的記錄
        //使用SqlSession執(zhí)行完SQL之后需要關(guān)閉SqlSession
        sqlSession.close();
        System.out.println(order);//打印結(jié)果:Order [id=1, orderNo=aaaa, price=23.0]
    }
}

執(zhí)行單元測試的結(jié)果:

1、testGetOrderById方法執(zhí)行查詢后返回一個null砍艾。

2蒂教、testGetOrderById2方法和testGetOrderById3方法執(zhí)行查詢后可以正常得到想要的結(jié)果。

四脆荷、總結(jié)

上面的測試代碼演示當(dāng)實體類中的屬性名和表中的字段名不一致時凝垛,使用MyBatis進(jìn)行查詢操作時無法查詢出相應(yīng)的結(jié)果的問題以及針對問題采用的兩種辦法:

解決辦法一: 通過在查詢的sql語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致蜓谋,這樣就可以表的字段名和實體類的屬性名一一對應(yīng)上了梦皮,這種方式是通過在sql語句中定義別名來解決字段名和屬性名的映射關(guān)系的。

解決辦法二: 通過<resultMap>來映射字段名和實體類屬性名的一一對應(yīng)關(guān)系桃焕。這種方式是使用MyBatis提供的解決方式來解決字段名和屬性名的映射關(guān)系的剑肯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市观堂,隨后出現(xiàn)的幾起案子让网,更是在濱河造成了極大的恐慌,老刑警劉巖师痕,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溃睹,死亡現(xiàn)場離奇詭異,居然都是意外死亡胰坟,警方通過查閱死者的電腦和手機(jī)丸凭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腕铸,“玉大人,你說我怎么就攤上這事铛碑『莨” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵汽烦,是天一觀的道長涛菠。 經(jīng)常有香客問我,道長撇吞,這世上最難降的妖魔是什么俗冻? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮牍颈,結(jié)果婚禮上迄薄,老公的妹妹穿的比我還像新娘。我一直安慰自己煮岁,他們只是感情好讥蔽,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布涣易。 她就那樣靜靜地躺著,像睡著了一般冶伞。 火紅的嫁衣襯著肌膚如雪新症。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天响禽,我揣著相機(jī)與錄音徒爹,去河邊找鬼。 笑死芋类,一個胖子當(dāng)著我的面吹牛隆嗅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梗肝,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼榛瓮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了巫击?” 一聲冷哼從身側(cè)響起禀晓,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坝锰,沒想到半個月后粹懒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡顷级,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年凫乖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弓颈。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡帽芽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翔冀,到底是詐尸還是另有隱情导街,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布纤子,位于F島的核電站搬瑰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏控硼。R本人自食惡果不足惜泽论,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卡乾。 院中可真熱鬧翼悴,春花似錦、人聲如沸说订。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钙姊,卻和暖如春毯辅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背煞额。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工思恐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膊毁。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓胀莹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親婚温。 傳聞我的和親對象是個殘疾皇子描焰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容