五、使用MyBatis实现条件查询

一、本课目标

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

简介:
1、mapper,是映射文件的根节点。里面只有一个属性namespace,即命名空间,通过namespace来区分不同的mapper来做到全局唯一。并且通过namespace还可以绑定相应的DAO接口来实现面向接口编程。

二、mapper

image.png

有了Mapper。xml文件之后,就不用写Mapper接口的具体实现类了,mybatis会通过接口的完全限定名去找到对应的Mapper里面的sql语句去执行。也就是说namaspace的命名必须跟某个接口同名,此时接口中的方法与映射文件中sql语句id一一对应。

namespace

namespace的属性值cn.smbms.dao.user.UserMapper到底是java文件的名字还是xml文件的名字?
因为我们之前的目录是以下这样的:

image.png

可以进行如下的测试:
新建一个mapper包,将UserMapper.xml放进来:
image.png

同时修改改xml文件中的namespace属性值:
image.png

则对于单元测试的第一种方式来说:
image.png

只要将后面的字符串改为跟namespace的值相同就可以成功测试。
而对于第二种使用接口的测试方式来说则会报错,这时如果将mapper包下面的UserMapper.xml文件的namespace属性值改为:
cn.smbms.dao.user.UserMapper,则可以测试成功,说明当使用接口的时候,程序会去找namespace的值为接口的完全限定名的mapper标签。

综上,在mybatis-config.xml文件中引入UserMapper.xml文件之后,当使用select的方式去执行操作的时候,只需要把namespace的值写进后面的字符串参数即可;当使用接口的方式的时候,程序会去找接口的完全限定名,只要当Mapper.xml中的namespace的值设置的跟接口的完全限定名即路径一致的时候才能执行。也就是上面的两句话,xml文件中的namespace的值必须跟某个接口的绝对路径相同,同时xml文件中的sql语句的id必须跟接口中的方法同名。
所以,可以把namespace的值写为java文件的名字,这样不管使用什么方法,总不会有问题。
习惯上都会把mapper、.xml文件跟你的mapper接口放在一个包下面,并且在MyBatis里面,我们的DAO接口一般不叫作UserDao,而叫做UserMapper

三、select元素

image.png

3、1单参数查询

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

   <!-- 根据用户名称查询用户列表(模糊查询) -->
    <select id="getUserListByUserName" parameterType="string" resultType="User">
        select * from smbms_user where userName like CONCAT('%',#{userName},'%')
    </select>

分析:1、参数类型是string,这个地方对大小写不敏感。参数类型也可以是自己定义的实体类类型。
2、sql语句中拿到参数的方法是#{参数名},这个参数名跟测试类中传进来的参数名必须一样。
3、数据库字段名必须跟实体类字段名保持一致,这样才能把查询到的数据跟实体类对象一一匹配。
在UserMapper.java中增加方法:

    public List<User> getUserListByUserName(String userName);

3、构建测试类:

@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多条件查询

问题:按条件查询用户表,若多条件情况先如何处理?


image.png

分析:
1、传入多个参数进行入参?
2、封装成user对象进行入参?


image.png

使用实体类入参

示例代码:
改造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);

改造测试类;

@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、调用mapper文件来对数据进行操作,操作之前必须将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());
        }
    }

最终的运行结果正常。

使用Map入参

在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);

实体类构建如下:

@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());
        }
    }

单元测试正常。

3.3小结

image.png

四、总结

image.png

所以mybatis的核心就是通过核心对象sqlSession的getMapper方法获得要找的sql语句的namespace+id,然后在核心配置文件引入的xml文件中去找namespace+id对应的sql语句然后执行并返回结果。如果不使用接口的话,则直接通过sqlSession的select等方法,把sql语句的namespace+id座位参数穿进去,然后mybatis会直接去找这个sql语句。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356