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

在这里插入图片描述

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论 2

打赏作者

月下赶路人

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值