最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解讀Mapper與Mapper.xml文件之間匹配的問(wèn)題

 更新時(shí)間:2023年01月09日 16:58:40   作者:實(shí)習(xí)生dc  
這篇文章主要介紹了解讀Mapper與Mapper.xml文件之間匹配的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Mapper與Mapper.xml文件之間匹配問(wèn)題

這里我們做一個(gè)實(shí)例

user實(shí)體類

public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;
    private String phone;

數(shù)據(jù)庫(kù)user表

在這里插入圖片描述

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="wdc.dao.UserMapper">
    <resultMap id="BaseResultMap" type="wdc.pojo.User">
        <!-- column為數(shù)據(jù)庫(kù)字段名  property 為實(shí)體類字段名-->
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="user_name" property="username" jdbcType="VARCHAR"/>
        <result column="user_password" property="password" jdbcType="VARCHAR"/>
        <result column="user_email" property="email" jdbcType="VARCHAR"/>
        <result column="user_phone" property="phone" jdbcType="VARCHAR"/>

    </resultMap>
    <!-- 這里 id 是數(shù)據(jù)庫(kù)字段名 #{id}是實(shí)體類字段名,sql語(yǔ)句后面不加封號(hào)-->
    <select id="selectUser" parameterType="java.lang.Integer" resultMap="BaseResultMap">
         select *from USER where id=#{id}
    </select>
    <!--此sql用于登錄查詢
    #{username} 是對(duì)應(yīng)mapper接口文件中 @Param注解中的參數(shù)名(防止mapper之間不匹配)-->
    <select id="login" parameterType="java.lang.String" resultMap="BaseResultMap">
        select *from user where user_name=#{username} and user_password=#{password}
    </select>
</mapper>

從上面不難看出,我們使用了resultMap作為映射集,目的是為了使得 實(shí)體類user 中的字段與數(shù)據(jù)庫(kù)中的字段進(jìn)行匹配。

而在查詢中我們選擇 使用結(jié)果集resultMap來(lái)進(jìn)行數(shù)據(jù)映射

  <!-- 這里 id 是數(shù)據(jù)庫(kù)字段名 #{id}是實(shí)體類字段名,sql語(yǔ)句后面不加封號(hào)-->
  <select id="selectUser" parameterType="java.lang.Integer" resultMap="BaseResultMap">

而在另一個(gè)查詢中,我們?cè)诰帉憇ql語(yǔ)句時(shí),使用了對(duì)應(yīng)userMapper文件中,@Param所對(duì)應(yīng)的參數(shù)名

 <!-- #{username} 是對(duì)應(yīng)mapper接口文件中 @Param注解中的參數(shù)名(防止mapper之間不匹配)-->
   <select id="login" parameterType="java.lang.String" resultMap="BaseResultMap">
       select *from user where user_name=#{username} and user_password=#{password}
   </select>

這里也是為了防止mapper 文件與 xml文件之間匹配出現(xiàn)異常。

userMapper

package wdc.dao;

import org.apache.ibatis.annotations.Param;
import wdc.pojo.User;

public interface UserMapper {
    User selectUser(int id)throws Exception;
    //    登錄
    //    @Param中的參數(shù)名,對(duì)應(yīng).xml文件中sql語(yǔ)句#{}中的參數(shù)名(防止mapper之間不匹配)
    User login(@Param("username") String username, @Param("password") String password)throws Exception;
}

這里我們重點(diǎn)解釋一下

@Param注解

這里我們應(yīng)該,采用#{}的方式把@Param注解括號(hào)內(nèi)的參數(shù)進(jìn)行引用

對(duì)應(yīng)的是使用方法,上述代碼中明確標(biāo)出。

這里我們也可以不使用@Param注解,前提是數(shù)據(jù)庫(kù)字段與實(shí)體類字段一一對(duì)應(yīng),例如 數(shù)據(jù)庫(kù)命名為user_name,而我們的實(shí)體類就應(yīng)該使用 駝峰命名 userName,這樣就可以使mybatis將查詢的結(jié)果自發(fā)的進(jìn)行一一對(duì)應(yīng)填充置user 對(duì)象中。

但是由于此案例,數(shù)據(jù)庫(kù)字段和實(shí)體類字段之間的命名方式,使得mybatis 從數(shù)據(jù)庫(kù)中查出的字段,不能正常的識(shí)別和對(duì)應(yīng)正確的實(shí)體類字段,于是,我們需要使用@Param注解來(lái)指明,我們所要引用的參數(shù)的名稱,方便再mapper.xml文件中,采用#{}的方式把@Param注解括號(hào)內(nèi)的參數(shù)進(jìn)行引用,

這樣會(huì)更方便代碼的閱讀,也便于避免一些未知錯(cuò)誤的發(fā)生。

測(cè)試

關(guān)于對(duì)象判空,和空指針異常(NullPointer)

@Test
    public void testLogin() throws Exception{
        ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:config/spring-mybatis.xml");
        UserMapper userMapper = (UserMapper) ac.getBean("userMapper");
        User user = null;

            user = userMapper.login("張","123");
            if(user == null)
                System.out.println("沒(méi)數(shù)據(jù)");
            else
                System.out.println(user);


    }

這里測(cè)試登錄接口后我們發(fā)現(xiàn),當(dāng)沒(méi)有數(shù)據(jù)返回時(shí),我們可以直接 使用  user==null 的方式來(lái)對(duì) 對(duì)象進(jìn)行判空。

而當(dāng)我們?cè)诖舜a中,直接將異常使用 try catch 捕捉時(shí),我們發(fā)現(xiàn),當(dāng)對(duì)象 user 為空時(shí),控制臺(tái)并不會(huì)報(bào)出異常。

而當(dāng)我們?cè)谡{(diào)用 user對(duì)象的toSring方法時(shí),則會(huì)出現(xiàn)NullPoint的空指針異常

小結(jié):

導(dǎo)致mapper 與xml之間出現(xiàn)不匹配的原因主要有:

  • 1. mapper 文件中 方法名與 xml 中查詢語(yǔ)句id 進(jìn)行匹配
  • 2. mapper 文件中 參數(shù)類型,與xml 文件中的參數(shù)類型匹配
  • 3. mapper 文件中 返回值類型,與xml文件中的 返回值類型匹配
  • 4. XML 文件的 namespace 指定的路徑與 相應(yīng)的實(shí)體類對(duì)應(yīng)
  • 5. mapper 文件 和xml文件不在同一個(gè)包下的,要在配置文件中,將兩個(gè)文件的包同時(shí)進(jìn)行掃描

還有一些較為簡(jiǎn)單的異常不一一例舉,但說(shuō)明相應(yīng)原因以供參考:

  • 6. 數(shù)據(jù)庫(kù)密碼填寫錯(cuò)誤
  • 7. 數(shù)據(jù)庫(kù)服務(wù)未開(kāi)啟
  • 8. 數(shù)據(jù)庫(kù)路徑 以及亂碼問(wèn)題

jdbc.url=jdbc:mysql://localhost:3306/blog?characterEncoding=utf-8

Mapper和Mapper.xml的關(guān)系

Category.java

CategoryMapper.java 

這是mapper接口,面向接口編程的思想還是很重要的。也是本次博文最重要的部分。

接口定義有以下特點(diǎn):

  • Mapper 接口方法名和 CategoryMapper.xml 中定義的每個(gè) sql 的 id 同名。
  • Mapper 接口方法的輸入?yún)?shù)類型和 CategoryMapper.xml 中定義的 sql 的parameterType 類型相同。
  • Mapper 接口的返回類型和 CategoryMapper.xml 中定義的 sql 的 resultType 類型相同

CategoryMapper.xml 

1.xml文件的namespace要寫成mapper接口的路徑。

2.sql的id和mapper中的方法名要對(duì)應(yīng)起來(lái),比如下面,mapper中方法名為add,insert的sql標(biāo)簽id也要為add

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot整合shiro實(shí)現(xiàn)記住我功能

    springboot整合shiro實(shí)現(xiàn)記住我功能

    這篇文章主要介紹了springboot整合shiro實(shí)現(xiàn)記住我功能,配置類 ShiroConfig,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • 解決java.util.zip.ZipException: Not in GZIP format報(bào)錯(cuò)問(wèn)題

    解決java.util.zip.ZipException: Not in GZIP&nbs

    這篇文章主要介紹了解決java.util.zip.ZipException: Not in GZIP format報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • JavaWeb三大組件之監(jiān)聽(tīng)器Listener詳解

    JavaWeb三大組件之監(jiān)聽(tīng)器Listener詳解

    這篇文章主要介紹了JavaWeb三大組件之監(jiān)聽(tīng)器Listener詳解,在JavaWeb應(yīng)用程序中,Listener監(jiān)聽(tīng)器是一種機(jī)制,用于監(jiān)聽(tīng)和響應(yīng)特定的事件,它可以感知并響應(yīng)與應(yīng)用程序相關(guān)的事件,從而執(zhí)行相應(yīng)的邏輯處理,需要的朋友可以參考下
    2023-10-10
  • SpringBoot集成Seata的全過(guò)程

    SpringBoot集成Seata的全過(guò)程

    本文介紹了事務(wù)的四大特性(原子性、一致性、隔離性、持久性)以及本地事務(wù)和分布式事務(wù)的概念,本地事務(wù)是指在單個(gè)數(shù)據(jù)庫(kù)級(jí)別的事務(wù)管理,而分布式事務(wù)則是跨多個(gè)數(shù)據(jù)庫(kù)或服務(wù)的事務(wù)管理,感興趣的朋友一起看看吧
    2024-11-11
  • Java?多個(gè)時(shí)間區(qū)間進(jìn)行合并處理方法

    Java?多個(gè)時(shí)間區(qū)間進(jìn)行合并處理方法

    用戶在選擇多個(gè)時(shí)間區(qū)間之后,如選擇的時(shí)間區(qū)間連續(xù)或者有重疊,需要對(duì)所選的時(shí)間區(qū)間進(jìn)行合并,這其實(shí)是一個(gè)區(qū)間合并問(wèn)題,下面通過(guò)本文給大家介紹Java?多個(gè)時(shí)間區(qū)間進(jìn)行合并處理的解決方案,一起看看吧
    2024-02-02
  • Seata?AT獲取數(shù)據(jù)表元數(shù)據(jù)源碼詳解

    Seata?AT獲取數(shù)據(jù)表元數(shù)據(jù)源碼詳解

    這篇文章主要為大家介紹了Seata?AT獲取數(shù)據(jù)表元數(shù)據(jù)源碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • SpringBoot測(cè)試之@SpringBootTest與MockMvc的實(shí)戰(zhàn)應(yīng)用小結(jié)

    SpringBoot測(cè)試之@SpringBootTest與MockMvc的實(shí)戰(zhàn)應(yīng)用小結(jié)

    本文將深入探討SpringBoot測(cè)試中兩個(gè)核心工具:@SpringBootTest注解與MockMvc測(cè)試框架的實(shí)戰(zhàn)應(yīng)用,幫助開(kāi)發(fā)者構(gòu)建更穩(wěn)健的測(cè)試體系,提高代碼質(zhì)量與可維護(hù)性,感興趣的朋友一起看看吧
    2025-03-03
  • jstack報(bào)錯(cuò)Unable to open socket file解決

    jstack報(bào)錯(cuò)Unable to open socket file解決

    這篇文章主要為大家介紹了jstack報(bào)錯(cuò)Unable to open socket file的解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-02-02
  • JDBC增刪改查和查唯一的完整代碼解析

    JDBC增刪改查和查唯一的完整代碼解析

    這篇文章主要介紹了JDBC增刪改查和查唯一的完整代碼解析,代碼分為第四部分,每部分代碼都不錯(cuò),對(duì)jdbc增刪改查操作感興趣的朋友一起學(xué)習(xí)吧
    2016-12-12
  • Java 通過(guò) 二三法 巧解前端數(shù)據(jù)顯示

    Java 通過(guò) 二三法 巧解前端數(shù)據(jù)顯示

    實(shí)踐來(lái)源于理論,做開(kāi)發(fā)前肯定要先了解相關(guān)的規(guī)則和原理,看到標(biāo)題或許你會(huì)好奇什么是二三法。本篇文章帶你深入了解,需要的朋友可以參考下
    2021-10-10

最新評(píng)論

永泰县| 娱乐| 商水县| 徐水县| 盐津县| 金门县| 酒泉市| 贡山| 札达县| 正定县| 含山县| 胶南市| 大足县| 泸定县| 灵武市| 盱眙县| 江阴市| 勃利县| 武强县| 自贡市| 上饶市| 三明市| 苏尼特左旗| 隆德县| 南召县| 石家庄市| 红河县| 蒙山县| 保靖县| 集贤县| 绥阳县| 汽车| 石棉县| 鸡泽县| 漳平市| 龙山县| 扎囊县| 平陆县| 宣城市| 阳信县| 界首市|