五、使用MyBatis實(shí)現(xiàn)條件查詢

一、本課目標(biāo)

  • 掌握SQL映射文件的常用元素
  • 掌握使用select完成(單/多)條件查詢
image.png

簡(jiǎn)介:
1、mapper,是映射文件的根節(jié)點(diǎn)。里面只有一個(gè)屬性namespace,即命名空間,通過(guò)namespace來(lái)區(qū)分不同的mapper來(lái)做到全局唯一。并且通過(guò)namespace還可以綁定相應(yīng)的DAO接口來(lái)實(shí)現(xiàn)面向接口編程。

二、mapper

image.png

有了Mapper。xml文件之后,就不用寫Mapper接口的具體實(shí)現(xiàn)類了,mybatis會(huì)通過(guò)接口的完全限定名去找到對(duì)應(yīng)的Mapper里面的sql語(yǔ)句去執(zhí)行。也就是說(shuō)namaspace的命名必須跟某個(gè)接口同名,此時(shí)接口中的方法與映射文件中sql語(yǔ)句id一一對(duì)應(yīng)。

namespace

namespace的屬性值cn.smbms.dao.user.UserMapper到底是java文件的名字還是xml文件的名字?
因?yàn)槲覀冎暗哪夸浭且韵逻@樣的:

image.png

可以進(jìn)行如下的測(cè)試:
新建一個(gè)mapper包,將UserMapper.xml放進(jìn)來(lái):
image.png

同時(shí)修改改xml文件中的namespace屬性值:
image.png

則對(duì)于單元測(cè)試的第一種方式來(lái)說(shuō):
image.png

只要將后面的字符串改為跟namespace的值相同就可以成功測(cè)試。
而對(duì)于第二種使用接口的測(cè)試方式來(lái)說(shuō)則會(huì)報(bào)錯(cuò),這時(shí)如果將mapper包下面的UserMapper.xml文件的namespace屬性值改為:
cn.smbms.dao.user.UserMapper,則可以測(cè)試成功,說(shuō)明當(dāng)使用接口的時(shí)候,程序會(huì)去找namespace的值為接口的完全限定名的mapper標(biāo)簽。

綜上,在mybatis-config.xml文件中引入U(xiǎn)serMapper.xml文件之后,當(dāng)使用select的方式去執(zhí)行操作的時(shí)候,只需要把namespace的值寫進(jìn)后面的字符串參數(shù)即可;當(dāng)使用接口的方式的時(shí)候,程序會(huì)去找接口的完全限定名,只要當(dāng)Mapper.xml中的namespace的值設(shè)置的跟接口的完全限定名即路徑一致的時(shí)候才能執(zhí)行。也就是上面的兩句話,xml文件中的namespace的值必須跟某個(gè)接口的絕對(duì)路徑相同,同時(shí)xml文件中的sql語(yǔ)句的id必須跟接口中的方法同名。
所以,可以把namespace的值寫為java文件的名字,這樣不管使用什么方法,總不會(huì)有問(wèn)題。
習(xí)慣上都會(huì)把mapper、.xml文件跟你的mapper接口放在一個(gè)包下面,并且在MyBatis里面,我們的DAO接口一般不叫作UserDao,而叫做UserMapper

三、select元素

image.png

3、1單參數(shù)查詢

在UserMapper.xml文件中增加查詢:

   <!-- 根據(jù)用戶名稱查詢用戶列表(模糊查詢) -->
    <select id="getUserListByUserName" parameterType="string" resultType="User">
        select * from smbms_user where userName like CONCAT('%',#{userName},'%')
    </select>

分析:1、參數(shù)類型是string,這個(gè)地方對(duì)大小寫不敏感。參數(shù)類型也可以是自己定義的實(shí)體類類型。
2、sql語(yǔ)句中拿到參數(shù)的方法是#{參數(shù)名},這個(gè)參數(shù)名跟測(cè)試類中傳進(jìn)來(lái)的參數(shù)名必須一樣。
3、數(shù)據(jù)庫(kù)字段名必須跟實(shí)體類字段名保持一致,這樣才能把查詢到的數(shù)據(jù)跟實(shí)體類對(duì)象一一匹配。
在UserMapper.java中增加方法:

    public List<User> getUserListByUserName(String userName);

3、構(gòu)建測(cè)試類:

@Test
    public void testGetUserListByUserName() {
        List<User> userList = null;
        SqlSession sqlSession = null;
        String userName = "趙";
        try {
            sqlSession = MyBatisUtil.createSqlSession();
            userList = sqlSession.getMapper(UserMapper.class).getUserListByUserName(userName);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            MyBatisUtil.closeSqlSession(sqlSession);
        }
        for (User user:userList) {
            logger.debug("testGetUserList userCode:" + user.getUserCode()
                    + "and userName" + user.getUserName());
        }
    }

3.2多條件查詢

問(wèn)題:按條件查詢用戶表,若多條件情況先如何處理?


image.png

分析:
1、傳入多個(gè)參數(shù)進(jìn)行入?yún)ⅲ?br> 2、封裝成user對(duì)象進(jìn)行入?yún)ⅲ?/p>

image.png

使用實(shí)體類入?yún)?/h4>

示例代碼:
改造UserMapper.xml文件:

    <!-- 查詢用戶列表 -->
    <select id="getUserList" parameterType="user" resultType="User">
        select * from smbms_user 
        where userName like CONCAT('%',#{userName},'%')
        and userRole=#{userRole}
    </select>

改造接口:

public List<User> getUserList(User user);

改造測(cè)試類;

@Test
    public void testGetUserList() {
        List<User> userList = null;
        SqlSession sqlSession = null;
        User user1 = new User();
        user1.setUserName("趙");
        user1.setUserRole(2);
        try {
            sqlSession = MyBatisUtil.createSqlSession();
        // 4、調(diào)用mapper文件來(lái)對(duì)數(shù)據(jù)進(jìn)行操作,操作之前必須將mapper文件引入到mabatis-config.xml中
        //  userList = sqlSession.selectList("mmp.UserMapper.getUserList");
            userList = sqlSession.getMapper(UserMapper.class).getUserList(user1);
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            MyBatisUtil.closeSqlSession(sqlSession);
        }
        for (User user:userList) {
            logger.debug("testGetUserList userCode:" + user.getUserCode()
                    + "and userName" + user.getUserName());
        }
    }

最終的運(yùn)行結(jié)果正常。

使用Map入?yún)?/h4>

在UserMapper.xml文件中增加:

    <select id="getUserListByMap" parameterType="Map" resultType="User">
        select * from smbms_user 
        where userName like CONCAT('%',#{uName},'%')
        and userRole=#{uRole}
    </select>

在接口中增加方法;

public List<User> getUserListByMap(Map<String, String> userMap);

實(shí)體類構(gòu)建如下:

@Test
    public void testGetUserListByMap() {
        List<User> userList = null;
        SqlSession sqlSession = null;
        Map<String, String> userMap = new HashMap<String, String>();
        userMap.put("uName", "趙");
        userMap.put("uRole", "2");
        try {
            sqlSession = MyBatisUtil.createSqlSession();
            userList = sqlSession.getMapper(UserMapper.class).getUserListByMap(userMap);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            MyBatisUtil.closeSqlSession(sqlSession);
        }
        for (User user:userList) {
            logger.debug("testGetUserList userCode:" + user.getUserCode()
                    + "and userName" + user.getUserName());
        }
    }

單元測(cè)試正常。

3.3小結(jié)

image.png

四、總結(jié)

image.png

所以mybatis的核心就是通過(guò)核心對(duì)象sqlSession的getMapper方法獲得要找的sql語(yǔ)句的namespace+id,然后在核心配置文件引入的xml文件中去找namespace+id對(duì)應(yīng)的sql語(yǔ)句然后執(zhí)行并返回結(jié)果。如果不使用接口的話,則直接通過(guò)sqlSession的select等方法,把sql語(yǔ)句的namespace+id座位參數(shù)穿進(jìn)去,然后mybatis會(huì)直接去找這個(gè)sql語(yǔ)句。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容