• MyBatis—利用MyBatis查询(查询所有,查询一行,条件查询)


    文章目录

    1、查询所有

    基本步骤

    1.定义mapper接口,编写接口方法
    在这里插入图片描述
    2.定义sql映射文件
    创建一个和mapper接口相同的xml文件,放在相同包目录下面,然后编写sql语句
    在这里插入图片描述
    我是查询所有,所以sql语句和mysql查询所有一样,如果你想要查询特定字段,也可以自行定义。
    在这里插入图片描述
    3.编写MyBaits代码
    编写代码的步骤(参考另一篇)

    package com.mybatis.demo;
    
    
    import com.mybatis.mapper.StuMapper;
    import com.mybatis.pojo.Stu;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.InputStream;
    import java.util.List;
    
    public class MyBatis003 {
        public static void main(String[] args) throws Exception {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            StuMapper stuMapper = sqlSession.getMapper(StuMapper.class);
    
            List stus = stuMapper.selectAll();
    
            for (Stu stu:stus) {
                System.out.println(stu);
            }
    
            sqlSession.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    4.查询结果,将数据库表stu里面所有信息都查询出来了
    在这里插入图片描述

    5.注意信息
    当你的数据库字段名和你的定义的实体类属性名不同时,不能查询出不同的字段对应数据信息。假如我数据库名称是username,实体类属是userName,下面是解决三种方法。
    方法一:在定义sql语句时起别名
    在这里插入图片描述
    方法二:定义sql片段,直接用sql标签引入sql语句,直接用include标签加上sql片段的ID名就可以找到对用的SQL语句。
    在这里插入图片描述
    方法三:使用resultMap标签,映射数据库字段名和属性名(最常用)
    resultMap里面最常用的两个子标签,一个是result,它是映射普通字段名和属性名,还有一个是id子标签,它是映射主键和属性名。里面的column属性时数据库表的字段名,property是实体类的属性名。
    在这里插入图片描述

    2、查询详情(通过特定属性查询)

    1.定义mapper接口,编写接口方法,这里的参数列表就是你想要查询的属性对应的全部信息。可以通过name属性查询该学生全部信息。
    在这里插入图片描述
    2.编写sql映射文件
    创建一个和mapper接口相同的xml文件,放在相同包目录下面,然后编写sql语句
    在这里插入图片描述
    3.编写MyBaits代码

    package com.mybatis.demo;
    
    import com.mybatis.mapper.StuMapper;
    import com.mybatis.pojo.Stu;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    public class MyBatis004 {
        public static void main(String[] args) throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            StuMapper stuMapper = sqlSession.getMapper(StuMapper.class);
    
            Stu stu = stuMapper.selectByName("小赵");
    
            System.out.println(stu);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    4.查询结果
    在这里插入图片描述

    5.注意细节
    1.参数占位符的使用
    参数占位符就是我上面的 name=#{name},一般有两种。一种就是#{},这个参数占位附可以防止sql注入,相当于name=?,还有一种是${},这个就不能防止sql注入了,因为它是直接把参数拼到后面,相当于name=name。
    2.特殊字符处理
    特殊字符就是=,>,<等,在xml中有的特殊字符会被xml文件识别,这时候就需要对特殊字符进行处理。一种方法就是使用转义字符,还有一种就是使用CDATA区
    比如我要查询id小于18 的同学信息
    在这里插入图片描述

    3、多条件查询

    以下案例都以在stu表查询小字开头的,住在上海,并且性别为男的同学

    (1)接口参数列表三种表达方式

    1. 散装参数:散装参数需要用@Param把sql里面的占位符表示出来,好让对应的参数找到对应占位符。

      List selectByCondition(@Param("name")String name,@Param("adr")String adr,@Param("gender")String gender);
      
      • 1
    2. 类封装参数:类封装参数需要在MyBatis程序中定义对应的参数内容,再传入方法。

      List selectByCondition(Stu stu);
      
      • 1
    3. Map集合封装参数:要保证sql里面的参数名和Map集合中的键名保持一致。

      List selectByCondition(Map map);
      
      • 1

    下面不同实例我会用不同的参数列表类型。

    (2)多条件查询

    实现步骤‘
    1.定义Mapper接口,编写对应方法
    在这里插入图片描述

    2.编写sql映射文件
    在这里插入图片描述

    3.编写MyBatis代码

    package com.mybatis.demo;
    
    import com.mybatis.mapper.StuMapper;
    import com.mybatis.pojo.Stu;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    public class MyBatis005 {
        public static void main(String[] args) throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            StuMapper stuMapper = sqlSession.getMapper(StuMapper.class);
    
            List stus = stuMapper.selectByCondition("小%", "上海", "男");
    
            for (Stu stu:stus) {
                System.out.println(stu);
            }
    
            sqlSession.close();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    4.运行结果
    在这里插入图片描述

    (3)动态Sql

    什么是动态sql:动态sql就是sql语句随着用户输入的条件不同,对应生成的sql语句也会不同。比如在查询用户的时候,你可能只知道用户的姓名,也可能知道用户姓名,性别等。不同的输入对应sql语句是不同的。动态sql就可以解决这个问题。MyBatis提供了一些动态sql方法以及介绍,这里我就不一一介绍了。你可以去官网看对应语句以及用法。
    在这里插入图片描述

    (4)多条件动态查询

    实现步骤
    1.定义mapper接口,编写方法。(这里用类封装参数列表) 在这里插入图片描述
    2.编写sql映射文件,这里用到了动态sql if语句,就是先判断有没有传入这个参数,如果有那就执行对应where条件,如果没有就不添加where条件到sql语句。
    在这里插入图片描述
    3.编写MyBatis代码
    在编写代码时我用到的是类封装参数列表,所以在执行sql语句之前要封装好实体类。
    在这里插入图片描述

    package com.mybatis.demo;
    
    import com.mybatis.mapper.StuMapper;
    import com.mybatis.pojo.Stu;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    public class MyBatis006 {
        public static void main(String[] args) throws IOException {
            Stu stu = new Stu();
    
            String name = "小%";
            String adr = "上海";
            String gender = "男";
    
            stu.setName(name);
            stu.setAdr(adr);
            stu.setGender(gender);
    
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            StuMapper stuMapper = sqlSession.getMapper(StuMapper.class);
    
            List stus = stuMapper.selectByCondition(stu);
    
            for (Stu s:stus
                 ) {
                System.out.println(s);
            }
    
            sqlSession.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    4.运行结果
    在这里插入图片描述
    5.注意点
    由于if条件里面的sql语句是直接拼接在总的sql语句上的,所以如果第一个if里面的text为空,那里面的sql语句是不会加上去的。以我写的为例,如果参数列表name为空,那总的sql语句就变成了select * from stu whereand adr in adr and gender = gender;显然不符合sql语句语法,会报错。
    在这里插入图片描述
    MyBatis提供了解决这个问题的方法,就是在if标签外面将where关键字替换成为一个where标签,然后里面每个sql语句都加一个and就好了。
    在这里插入图片描述

    (5)单条件动态查询

    实现步骤
    1.定义一个mapper接口,定义对应方法(这里使用的是map集合封装参数)
    在这里插入图片描述
    2.定义sql映射文件,单条件动态查询用到的是choose:when,otherwise,相当于java里面的Switch:case,default。当满足第一个when标签的test条件,就执行当前语句,不会再往下执行。when里面都不满足就执行otherwise里面的。
    在这里插入图片描述
    3.编写MyBatis代码
    这里使用的是map集合封装参数,所以在执行sql之前要把参数列表封装到map集合里面。

    在这里插入图片描述

    package com.mybatis.demo;
    
    import com.mybatis.mapper.StuMapper;
    import com.mybatis.pojo.Stu;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class MyBatis007 {
        public static void main(String[] args) throws IOException {
            Map map = new HashMap<>();
    
            String name = "小%";
            String adr = "上海";
            String gender = "男";
    
            map.put("name",name);
            map.put("adr",adr);
            map.put("gender",gender);
    
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            StuMapper stuMapper = sqlSession.getMapper(StuMapper.class);
    
            List stus = stuMapper.selectByCondition(map);
    
            for (Stu s:stus
                 ) {
                System.out.println(s);
            }
    
            sqlSession.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    4.执行结果
    看到这个执行结果你可能有点质疑,不是有限定地址在上海,性别为男的吗。其实第三步已经解释了,当满足一个when标签的条件后,后面的条件不会被传到sql语句。所以这里相当于只查找了小字开头的同学,这正是单条件的解释。
    在这里插入图片描述

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    python脚本自动下载图片
    UniAD【异常检测:Reconstruction-based】【expand】
    Matlab神经网络工具箱——一个例子搞定神经网络算法
    【无人机】四轴无人机的轨迹进行可视化和动画处理(Matlab代码实现)
    GPT-5:未来已来,你准备好了吗
    装饰者模式
    JAVA大学生备考平台计算机毕业设计Mybatis+系统+数据库+调试部署
    通过CTY、VTY、TTY访问网络设备[计网实践Cisco Packet Tracer]
    Effective C++改善程序与设计的55个具体做法 6. 继承与面向对象设计
    【C++】一些特殊类的实现
  • 原文地址:https://blog.csdn.net/m0_54850825/article/details/126075513