MyBatis——封装MyBatis的输出结果(resultType、resultMap)、使用like进行模糊查询的两种方式

news/2025/2/23 15:29:35

文章目录:

1.封装MyBatis的输出结果

1.1 第一种方式——使用resultType 

1.2 resultType返回简单类型的数据

1.3 resultType返回对象类型的数据

1.4 resultType返回Map类型的数据

1.5 resultType默认规则(同名的列赋值给同名的属性)

1.6 第二种方式——使用resultMap

1.7 列名和属性不相同的解决方式

1.7.1 使用resultMap(自定义列名和属性名之间的对应关系)

1.7.2 自定义列别名(使用列别名,使得列别名和Java对象属性名一样) 

1.8 多表查询的一个小实例

1.8.1 在Navicat中创建两个表province、city

1.8.2 创建一个ProvinceCity实体类

1.8.3 在dao包下新建一个接口和该接口的mapper文件

1.8.4 在mybatis主配置文件中添加相应的mapper标签内容

1.8.5 编写测试方法

1.8.6 运行结果(与Navicat中测试结果一样) 

2.MyBatis使用like进行模糊查询

2.1 方式一(推荐使用!!!)

2.2 方式二(不推荐。。。)


1.封装MyBatis的输出结果

1.1 第一种方式——使用resultType 

resultType属性:在执行 select 时使用,作为 <select> 标签的属性出现。

resultType表示结果类型,mysql执行sql语句,得到Java对象的类型,它的值有两种:

  1. Java类型的全限定名称
  2. 使用别名(不推荐)

例如,下面这个例子:👇👇👇

接口中的方法为:   Student selectById(Integer id);
对应的mapper文件为:
<!--
    resultType: 1.java类型全限定名称  2.别名
    resultType: 表示mybatis执行sql语句后得到java对象类型
-->
<select id="selectById" resultType="com.bjpowernode.entity.Student">
    select id,name,email,age from student where id=#{studentId}
</select>
@Test
public void testSelectById() {
    SqlSession session = MyBatisUtil.getSqlSession();
    StudentDao studentDao=session.getMapper(StudentDao.class);
    Student student=studentDao.selectById(1003);
    System.out.println("student === " + student);
    session.close();
}

此时,resultType使用了 Java类型的全限定名称。表示的意思是 mybatis 执行sql语句,把ResultSet中的数据转为 Student 类型的对象。mybatis会执行以下操作:

  1. 调用 com.bjpowernode.entity.Student 的无参构造方法,创建对象。( Student student=new Student(); )使用反射创建对象。
  2. 同名的列赋值给同名的属性。例如:student.setId(rs.getInt("id"));          student.setName(rs.getString("name"));
  3. 得到相应的Java对象(根据接口中方法的返回值类型而定,如果是List,则mybatis将Student对象放入List集合)。

所以在测试方法中 Student student=studentDao.selectById(1003); 执行这行代码就会得到数据库中 id=1003 这行数据。

这行数据的列值赋给了student对象的属性,我们能得到student对象,就相当于是得到了 id=1003 这行数据。

1.2 resultType返回简单类型的数据

package com.bjpowernode.dao;

import com.bjpowernode.entity.Student;

/**
 *
 */
public interface StudentDao {

    long countStudent();

}
<!--
    执行sql语句,得到一个值(一行一列)
-->
<select id="countStudent" resultType="java.lang.Long">
    select count(*) from student
</select>
    @Test
    public void testCountStudent() {
        SqlSession session = MyBatisUtil.getSqlSession();
        StudentDao studentDao=session.getMapper(StudentDao.class);
        long nums=studentDao.countStudent();
        System.out.println("nums = " + nums);
        session.close();
    }

1.3 resultType返回对象类型的数据

package com.bjpowernode.dao;

import com.bjpowernode.entity.Student;

/**
 *
 */
public interface StudentDao {

    Student selectById(Integer id);

}
<!--
    resultType: 1.java类型全限定名称  2.别名
    resultType: 表示mybatis执行sql语句后得到java对象类型
-->
<select id="selectById" resultType="com.bjpowernode.entity.Student">
    select id,name,email,age from student where id=#{studentId}
</select>
    @Test
    public void testSelectById() {
        SqlSession session = MyBatisUtil.getSqlSession();
        StudentDao studentDao=session.getMapper(StudentDao.class);
        Student student=studentDao.selectById(1003);
        System.out.println("student === " + student);
        session.close();
    }

1.4 resultType返回Map类型的数据

package com.bjpowernode.dao;

import com.bjpowernode.entity.Student;
import org.apache.ibatis.annotations.Param;

import java.util.Map;

/**
 *
 */
public interface StudentDao {

    Map<Object,Object> selectMap(@Param("stuid") Integer id);

}
<!--
    执行sql语句,得到一个Map结构的数据
    sql语句执行结果中,列名为map的key,列值为map的value
    sql语句执行得到的是一行记录,此时转为map结构是正确的
    (如果得到的是一个map结构的数据,则sql语句最多能获取一行记录,超过一行就会报错)
-->
<select id="selectMap" resultType="java.util.Map">
    select  id,name from student where id!=#{stuid}
</select>
    @Test
    public void testSelectMap() {
        SqlSession session = MyBatisUtil.getSqlSession();
        StudentDao studentDao=session.getMapper(StudentDao.class);
        Map<Object,Object> map=studentDao.selectMap(1005);
        System.out.println("map === " + map);
        System.out.println("name === " + map.get("name"));
        System.out.println("id === " + map.get("id"));
        session.close();
    }

1.5 resultType默认规则(同名的列赋值给同名的属性)

1.6 第二种方式——使用resultMap

resultMap:结果映射,自定义列名和Java对象属性的对应关系,常用在列名和属性名不同的情况下。

  1. 先定义 resultMap 标签,指定列名和属性名的对应关系。
  2. 在 select 标签中使用 resultMap 属性,指定上面定义的 resultMap 的 id 值。

resultMap可以解决列名与属性名不相同的问题。

package com.bjpowernode.dao;

import com.bjpowernode.entity.Student;
import com.bjpowernode.vo.CustomObject;
import org.apache.ibatis.annotations.Param;

/**
 *
 */
public interface StudentDao {

    CustomObject selectById2(@Param("cid") Integer id);

}
<!--
    定义resultMap
    id:给resultMap的映射关系起个名称,唯一值
    type:java类型的全限定名称
-->
<resultMap id="customMap" type="com.bjpowernode.vo.CustomObject">
    <!-- 定义列名和属性名的对应关系 -->
    <!-- 主键类型的列使用id标签 -->
    <id column="id" property="cid" />
    <!-- 非主键类型的列使用result标签 -->
    <result column="name" property="cname" />
    <!--列名和属性名相同的可以不用定义-->
    <result column="email" property="email" />
    <result column="age" property="age" />
</resultMap>
<!--
    使用resultMap属性,指定映射关系的id
    resultType和resultMap不能同时使用(二选一)
-->
<select id="selectById2" resultMap="customMap">
    select id,name,email,age from student where id=#{cid}
</select>
    @Test
    public void testSelectById2() {
        SqlSession session = MyBatisUtil.getSqlSession();
        StudentDao studentDao=session.getMapper(StudentDao.class);
        CustomObject customObject=studentDao.selectById2(1001);
        System.out.println("customObject = " + customObject);
        session.close();
    }

1.7 列名和属性不相同的解决方式

1.7.1 使用resultMap(自定义列名和属性名之间的对应关系)

1.7.2 自定义列别名(使用列别名,使得列别名和Java对象属性名一样) 

package com.bjpowernode.dao;

import com.bjpowernode.entity.Student;
import com.bjpowernode.vo.CustomObject;
import org.apache.ibatis.annotations.Param;

/**
 *
 */
public interface StudentDao {

    CustomObject selectById3(@Param("cid") Integer id);

}
<!--
    使用列别名,解决列名和属性名不同的问题
    在sql语句中将不相同的列名修改为与属性名相同即可
    select id cid,name cname
-->
<select id="selectById3" resultType="com.bjpowernode.vo.CustomObject">
    select id cid,name cname,email,age from student where id=#{cid}
</select>
    @Test
    public void testSelectById3() {
        SqlSession session = MyBatisUtil.getSqlSession();
        StudentDao studentDao=session.getMapper(StudentDao.class);
        CustomObject customObject=studentDao.selectById3(1001);
        System.out.println("customObject = " + customObject);
        session.close();
    }

1.8 多表查询的一个小实例

1.8.1 在Navicat中创建两个表province、city

每个属性的数据类型分别为:int、varchar、varchar、varchar。 id为主键

每个属性的数据类型分别为:int、varchar、int。  id为主键

1.8.2 创建一个ProvinceCity实体类

package com.bjpowernode.vo;

/**
 *
 */
public class ProvinceCity {

    private Integer pid;
    private String pname;
    private Integer cid;
    private String cname;

    public Integer getPid() {
        return pid;
    }

    public void setPid(Integer pid) {
        this.pid = pid;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    public Integer getCid() {
        return cid;
    }

    public void setCid(Integer cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    @Override
    public String toString() {
        return "ProvinceCity{" +
                "pid=" + pid +
                ", pname='" + pname + '\'' +
                ", cid=" + cid +
                ", cname='" + cname + '\'' +
                '}';
    }
}

1.8.3 在dao包下新建一个接口和该接口的mapper文件

package com.bjpowernode.dao;

import com.bjpowernode.vo.ProvinceCity;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 *
 */
public interface ProvinceDao {

    List<ProvinceCity> selectProvinceCity(@Param("pid") Integer pid);

}
<?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="com.bjpowernode.dao.ProvinceDao">
    <!-- 使用insert、update、delete、select标签写sql -->

        <select id="selectProvinceCity" resultType="com.bjpowernode.vo.ProvinceCity">
                SELECT province.id pid,province.name pname,city.id cid,city.name cname
                from province
                join city on province.id=city.provinceid
                where province.id=#{pid}
        </select>
</mapper>

1.8.4 在mybatis主配置文件中添加相应的mapper标签内容

<mappers>
    <mapper resource="com/bjpowernode/dao/ProvinceDao.xml"/>
</mappers>

1.8.5 编写测试方法

    @Test
    public void testSelectProvinceCity() {
        SqlSession session=MyBatisUtil.getSqlSession();
        ProvinceDao provinceDao=session.getMapper(ProvinceDao.class);
        List<ProvinceCity> provinceCities=provinceDao.selectProvinceCity(1);
        provinceCities.forEach( p-> System.out.println(p));
        session.close();
    }

1.8.6 运行结果(与Navicat中测试结果一样) 


2.MyBatis使用like进行模糊查询

2.1 方式一(推荐使用!!!)

在Java程序中,把 like 的内容组装好,直接把这个内容传入到 sql 语句中。 

package com.bjpowernode.dao;

import com.bjpowernode.entity.Student;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 *
 */
public interface StudentDao {

    List<Student> selectLikeOne(@Param("name") String name);

}
<!-- like的第一种方式 -->
<select id="selectLikeOne" resultType="com.bjpowernode.entity.Student">
    select * from student where name like #{name}
</select>
    @Test
    public void testLikeOne() {
        SqlSession session = MyBatisUtil.getSqlSession();
        StudentDao studentDao=session.getMapper(StudentDao.class);
        List<Student> students=studentDao.selectLikeOne("%张%");
        students.forEach( stu-> System.out.println(stu));
        session.close();
    }

这里使用like进行模糊查询:查询student表中,名字中包含 "张" 字的所有人都信息。 

2.2 方式二(不推荐。。。)

在sql语句中,组织 like 的内容。

package com.bjpowernode.dao;

import com.bjpowernode.entity.Student;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 *
 */
public interface StudentDao {

    List<Student> selectLikeTwo(@Param("name") String name);

}
<!-- like的第二种方式 -->
<select id="selectLikeTwo" resultType="com.bjpowernode.entity.Student">
    select * from student where name like "%" #{name} "%"
</select>
    @Test
    public void testLikeTwo() {
        SqlSession session = MyBatisUtil.getSqlSession();
        StudentDao studentDao=session.getMapper(StudentDao.class);
        List<Student> students=studentDao.selectLikeTwo("张");
        students.forEach( stu-> System.out.println(stu));
        session.close();
    }

这里同样是使用like进行模糊查询:查询student表中,名字中包含 "张" 字的所有人都信息。 

但是可以看到两种方式的mapper文件中,第二种方式的写法更为复杂,第一种方式比较符合大家对 sql 语句的理解和使用。

 


http://www.niftyadmin.cn/n/712037.html

相关文章

python 并行计算架构_python并行编程学习之并行计算存储体系结构

基于指令和可被同时处理的存储单元的数目&#xff0c;计算机系统可以分为以下四种类目&#xff1a;单指令&#xff0c;单数据单元(SISD)在该体系结构中&#xff0c;计算机是单处理器机器&#xff0c;一次只能用单一的指令来操作单一的数据流。在SISD中&#xff0c;机器指令按照…

C++PE文件格式解析类(轻松制作自己的PE文件解析器)

PE是Portable Executable File Format&#xff08;可移植的运行体&#xff09;简写&#xff0c;它是眼下Windows平台上的主流可运行文件格式。PE文件里包括的内容非常多&#xff0c;详细我就不在这解释了&#xff0c;有兴趣的能够參看之后列出的參考资料及其它相关内容。 近期我…

win7 linux三系统,苹果电脑装windows7,Linux,mac os三系统,不需要BootBoot | MOS86

苹果已经简化了在您的Mac上双启动Windows的过程&#xff0c;但是当涉及到Linux&#xff0c;BootCamp不是那么好使了。 这里是如何在苹果电脑装Windows 7,Ubuntu 10.04和mac os x。如果你是Mac用户&#xff0c;你可能已经使用苹果电脑的BootCamp在你的系统上获得Windows7的必要程…

INDEX--创建索引和删除索引时的SCH_M锁

最近有一个困惑&#xff0c;生产服务器上有一表索引建得乱七八糟&#xff0c;经过整理后需要新建几个索引&#xff0c;再删除几个索引&#xff0c;建立索引时使用联机&#xff08;ONLINEON&#xff09;创建,查看下服务器负载&#xff08;磁盘和CPU压力均比较低的情况&#xff0…

MyBatis——动态SQL的四个常用标签(<if>、<where>、<foreach>、<sql>)

文章目录&#xff1a; 1.什么是动态SQL&#xff1f; 2.MyBatis中的动态SQL 2.1 动态SQL——if标签 2.1.1 语法格式 2.1.2 应用举例 2.2 动态SQL——where标签 2.2.1 语法格式 2.2.2 应用举例 2.3 动态SQL——foreach标签 2.3.1 语法格式 2.3.2 应用举例1&#x…

如何解决设置maven时Could not read settings.xml

今天初学maven碰到了配置错误 错误信息: 解决方法: 可以看到再次点击Browse选择settings.xml文件后出现了警告&#xff1a;Unable to parse global ...\u7a9d\n<m... 226:3) , 这个226说明第226行出现了错误&#xff0c;导致了文件不能正常读取&#xff0c;仔细检查该行有没…

孝感市小学生机器人编程比赛_在B站教编程的小学生Vita君比赛拿了一等奖,这会让更多人爱上编程吗?...

记者 | 伍洋宇编辑 | 在这个暑假&#xff0c;八岁半的Vita君又给自己攒了个荣誉——在八月举行的编程体验与比赛类活动核桃杯省级阶段中&#xff0c;他拿到了一等奖。Vita所在的上海市图形化编程小学低年级组一共有996人参加&#xff0c;而他的成绩在一等奖获得者中排名第二。对…

一站式了解智能终端处理器

智能手机都含有两个最重要的处理器平台--应用处理器和基带处理器。应用处理器是主控处理器&#xff0c;包含基带处理器等全部外围设备&#xff08;WIFI、GPS、触摸屏、相机、陀螺仪等&#xff09;都由其管理。本专栏描写叙述智能终端应用处理器和基带处理器架构以及两者之间的通…