详解MyBatis查询结果处理(简单类型,POJO,resultMap输出映射)

MyBatis查询结果处理

我们在使用传统的JDBC代码进行数据库操作时,增、删、改的sql语句由于基本上没有数据库的结果响应所以会比较简单,而对于查询的sql语句而言,我们需要通过对ResultSet结果集进行处理解析后才能将其响应给客户端,而对结果集的处理解析往往是一个非常繁琐的过程,会浪费我们大量的时间。

对于sql语句查询的结果,MyBtais框架提供了对结果进行处理的功能,MyBatis框架的Mapped Statement(底层封装对象)对sql执行输出结果进行定义,包括基本类型、HashMap、POJO等Executor通过Mapped Statement在执行sql后将输出结果映射到java对象,输出结果的映射过程就相当于JDBC对结果的解析处理过程。

简单类型输出映射

返回简单的基本类型,以查询表中记录为例:

接口中的方法为:

//查询user表有多少条记录
int findUserCount();

mapper.xml文件中配置为:

<select  id="findUserCount" resultType="int">
	SELECT COUNT(1) FROM t_user
</select>

POJO对象输出映射

POJO(Plain Old Java Objects,普通的java对象),如果数据库表中的列名与java类中的属性名完全相同,MyBatis会自动将查询结果封装到POJO对象中。

以查询表中id=?的详细数据为例

1.普通的Java类——User

package com.cwd.mybatis.bean;
import org.apache.ibatis.type.Alias;
import java.util.Date;

@Alias("User")
public class User {
    private int id;
    private String name;
    private int age;
    private Date birthday;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}

2.数据库表——t_user

在这里插入图片描述

3.接口中的方法为:

//查询id=?的user信息
User findUserById(int id);

4.mapper.xml文件中配置为:

<select id="findUserById" parameterType="int" resultType="User">
	SELECT * FROM t_user WHERE id = #{id}
</select>

5.测试,如有不懂请参见一篇文章告诉你什么是Mybatis+Mybatis的搭建及使用

@Test
public void test4() {
	try {
        //读取MyBtais全局配置文件
	 	Reader reader = Resources.getResourceAsReader("MyBatisConfig.xml");
        //创建会话工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //建立轻量级会话
        SqlSession sqlSession = sessionFactory.openSession();
        //获取接口的代理对象
		UserDao userDao = sqlSession.getMapper(UserDao.class);
        //调用方法
		System.out.println(userDao.findUserById(1));
        //递交事务
		sqlSession.commit();
        //关闭会话
		sqlSession.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

在这里插入图片描述

注意

POJO对象输出映射中,除了java类中属性名与表中列名完全相同外,还需注意我们所熟悉的驼峰命名,如果java类中使用了标准的驼峰命名,数据库中使用下划线连接命名,我们可以在MyBatis全局配置文件中开启全局设置实现属性与列的自动转换,比如从数据库命名 user_name自动映射到userName。

<!--mybatis的全局设置-->
<settings>
	<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

resultMap输出映射

resultType可以指定将查询结果映射为POJO,但需要Java类中的属性名和sql查询的列名一致放可映射成功。如果sql查询字段名和java类的属性名不一致,我们可以通过resultMap将字段名和属性名座椅个对应关系,resultMap实质上还需要将查询结果映射到POJO对象中。

定义resultMap

1.数据库有如下字段(列):

CREATE TABLE t_work(
	id_ SMALLINT PRIMARY KEY COMMENT'作业id',
	work_name_ VARCHAR(50) NOT NULL COMMENT'作业名',
	work_class_ VARCHAR(50) NOT NULL COMMENT'布置班级'
)

2.如下Work.java类:

package com.cwd.mybatis.bean;

public class Work {
    private Integer id;
    private String name;
    private String grade;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }
}

3.在mapper.xml文件中定义resultMap:

<!--定义resultMap-->
<resultMap id="workResultMap" type="Work">
	<id column="id_" property="id"/>
	<result property="name" column="work_name_"/>
	<result property="grade" column="work_class_"/>
</resultMap>

注意:

​ (1)resultMap标签的id属性是resultMap的唯一标识,本例中定义为workResultMap。
​ (2)resultMap标签的type属性是映射的POJO对象。
​ (3)id标签映射的是主键,result标签映射的是非主键。
​ (4)property设置POJO的属性名称,column映射查询结果即数据库表的列名称或别名。

使用resultMap

1.接口中的方法为:

//根据id查询数据库表中的信息
Work findWorkById(int id);

2.mapper.xml文件中配置为:

<select id="findWorkById" resultMap="workResultMap" parameterType="int">
	SELECT id_,work_name_,work_class_ FROM t_work WHERE id_ = #{id}
</select>

注意:

​ (1)本例输出映射使用的是resultMap,而非resultType。

​ (2)resultMap引用了workResultMap。

3.测试:

@Test
public void test5() {
	try {
        //读取MyBtais全局配置文件
	 	Reader reader = Resources.getResourceAsReader("MyBatisConfig.xml");
        //创建会话工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //建立轻量级会话
        SqlSession sqlSession = sessionFactory.openSession();
        //获取接口的代理对象
        WorkDao workDao = sqlSession.getMapper(WorkDao.class);
        //调用方法
        System.out.println(workDao.findWorkById(1));
        //递交事务
		sqlSession.commit();
        //关闭会话
		sqlSession.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

在这里插入图片描述

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MyBatis自连接三级联动和resultMap三级映射是一种常见的数据查询映射方式。下面我来解释一下。 首先,自连接三级联动是指在数据库中,存在一个表,其中的某些字段关联到该表的自身字段。通常情况下,我们需要使用连续的JOIN语句来实现多级联动查询。在MyBatis中,可以使用XML配置文件或注解来定义SQL语句,然后使用resultMap进行结果的映射。 在XML配置文件中,可以使用<resultMap>元素来定义映射关系。对于自连接的情况,可以使用嵌套的<association>或<collection>元素来表示关联关系。例如: ```xml <resultMap id="userMap" type="User"> <id property="id" column="id" /> <result property="name" column="name" /> <association property="manager" javaType="User"> <id property="id" column="manager_id" /> <result property="name" column="manager_name" /> <collection property="subordinates" ofType="User"> <id property="id" column="subordinate_id" /> <result property="name" column="subordinate_name" /> ... </collection> </association> </resultMap> ``` 上述代码中,定义了一个名为userMapresultMap映射了User对象及其关联的manager和subordinates字段。 在实际查询时,可以使用嵌套的SELECT语句或连续的JOIN语句来实现自连接的多级联动查询。例如: ```xml <select id="getUserWithManagerAndSubordinates" resultMap="userMap"> SELECT u.id, u.name, m.id AS manager_id, m.name AS manager_name, s.id AS subordinate_id, s.name AS subordinate_name FROM user u LEFT JOIN user m ON u.manager_id = m.id LEFT JOIN user s ON u.id = s.manager_id WHERE u.id = #{id} </select> ``` 上述代码中,使用了连续的LEFT JOIN语句来查询用户及其关联的上级经理和下级员工信息。 通过以上的配置和查询,就可以实现MyBatis中的自连接三级联动和resultMap三级映射。希望能对你有所帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值