Mybatis结果集映射与生命周期详细介绍

目录
  • 一、ResultMap结果集映射
    • 1、设计思想
    • 2、resultMap的应用场景
  • 二、生命周期和作用域

一、ResultMap结果集映射

1、设计思想

对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了

2、resultMap的应用场景

下面这个是我的数据库表

然后这是我们对应的Java实体类User2,除了有参构造外,它还定义了一个无参构造,而且用户id字段为userId,与数据库表中的id不一致

我们在执行查询方法后可以发现,实体类中的userId和数据库表中的id字段没有办法被自动关联,所以查出来的结果中,userId字段是空

所以,为了解决这种问题,我们就需要用到resultMap结果集映射(当然,使用as关键字给字段取一个别名也可以解决此问题)

select id as userId,name,sex,age from t_decade_user;

  • 首先我们需要在SQL映射文件中定义一个结果集映射resultMap,在里面定义一下实体类属性字段和数据库表字段的映射关系,property为实体类中的属性名,column为数据库表中的字段名
  • 然后在具体查询语句处,将原来的resultType替换成resultMap,并在此处引用我们之前定义的结果集映射
<?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.decade.mapper.UserMapper">
    <resultMap id="userInfo" type="com.decade.entity.User2">
        <result property="userId" column="id" jdbcType="VARCHAR"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="sex" column="sex" jdbcType="VARCHAR"/>
        <result property="age" column="age" jdbcType="INTEGER"/>
    </resultMap>
    <select id="getUserInfoById" resultMap="userInfo">
        select * from t_decade_user where id = #{userId} and name =  #{name};
    </select>
</mapper>

我们在接口类中添加一个注解@Param,这样就可以避免参数绑定报错的问题(只有一个入参时,不会出现这种错误)

package com.decade.mapper;
import com.decade.entity.User2;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserMapper {
    List<User2> getUserInfoById(@Param("userId") String userId, @Param("name") String name);
}

最后写一个测试方法

import com.decade.entity.User2;
import com.decade.mapper.UserMapper;
import com.decade.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
    @Test
    public void test2() {
        // 第一步:获取sqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        try {
            UserMapper userDao = sqlSession.getMapper(UserMapper.class);
            List<User2> userList = userDao.getUserInfoById("005", "刘亦菲");
            // 循环输出查询到的user信息
            userList.forEach(System.out::println);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭sqlSession
            sqlSession.close();
        }
    }
}

运行结果如下

二、生命周期和作用域

1、SqlSessionFactoryBuilder:用于创建SqlSessionFactory

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了

SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)

2、SqlSessionFactory:可以想象成数据库连接池

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在

没有任何理由丢弃它或重新创建另一个实例,可以使用单例模式实现,SqlSessionFactory 的最佳作用域是应用作用域,即Application

3、SqlSession:可以看作连接到数据库连接池的一个请求

每个线程都应该有它自己的 SqlSession 实例,它的实例不是线程安全的,不能被共享

它的最佳的作用域是请求或方法作用域

用完之后需要关闭,否则资源会被占用

到此这篇关于Mybatis结果集映射与生命周期详细介绍的文章就介绍到这了,更多相关Mybatis结果集映射内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mybatis结果集映射一对多简单入门教程

    Mybatis 一对多 简单入门 易懂 搭建数据库环境 student 表 DROP TABLE IF EXISTS `student_2`; CREATE TABLE `student_2` ( `id` int(10) NOT NULL, `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `tid` int(10) NULL DEFAULT NULL, PRIMARY KEY (`

  • Mybatis结果集自动映射的实例代码

    在使用Mybatis时,有的时候我们可以不用定义resultMap,而是直接在<select>语句上指定resultType.这个时候其实就用到了Mybatis的结果集自动映射.Mybatis的自动映射默认是开启的,有需要我们也可以将其关闭(还可以调整自动映射的策略). 1       Mybatis结果集自动映射 在使用Mybatis时,有的时候我们可以不用定义resultMap,而是直接在<select>语句上指定resultType.这个时候其实就用到了Mybatis的结果集

  • 解决mybatis映射结果集失效的问题

    在开发中可能会遇到这样的问题,使用mybatis进行结果集与实体类之间的关系映射时,可能会出现某些属性映射不上去的情况. 为了方便排查问题我们需要查看mybatis访问数据库SQL信息. 可以在配置Log4J: log4j.logger.com.xxx.dao=TRACE log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG log4j.logger.com.ibatis.common.jdbc.ScriptRunner = D

  • Mybatis结果集映射与生命周期详细介绍

    目录 一.ResultMap结果集映射 1.设计思想 2.resultMap的应用场景 二.生命周期和作用域 一.ResultMap结果集映射 1.设计思想 对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 2.resultMap的应用场景 下面这个是我的数据库表 然后这是我们对应的Java实体类User2,除了有参构造外,它还定义了一个无参构造,而且用户id字段为userId,与数据库表中的id不一致 我们在执行查询方法后可以发现,实体类中的userId和数据库表中的

  • Maven构建生命周期详细介绍

    什么是构建生命周期 构建生命周期是一组阶段的序列(sequence of phases),这些构建生命周期中的每一个由构建阶段的不同列表定义,其中构建阶段表示生命周期中的阶段. 例如,默认(default)的生命周期包括以下阶段(注意:这里是简化的阶段,用于生命周期阶段的完整列表): 验证(validate) - 验证项目是否正确,所有必要的信息可用 编译(compile) - 编译项目的源代码 测试(test) - 使用合适的单元测试框架测试编译的源代码.这些测试不应该要求代码被打包或部署 打

  • Android Activity的生命周期详细介绍

    Android Activity的生命周期详细介绍 生命周期描述的是一个类从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法.在这个过程中,会针对不同的生命阶段调用不同的的方法. Activity是Android中四大组件之一,是最常见的应用组件,也是用的最多的组件,它能够提供一个界面与用户进行交互.Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:onCreate  onDestory  onStart  onStop  onRes

  • React State与生命周期详细介绍

    目录 一.State 1.1 类组件中的State 1.2 函数组件中的State 二.React生命周期 2.1 挂载 2.2 更新 2.3 卸载 2.4 函数式组件useEffect 三.总结 一.State 在React当中,当你更新组件的state,然后新的state就会重新渲染到页面中.在这个时候不需要你操作任何DOM.这和vue中组件的data中的数据是相似的. 1.1 类组件中的State <!DOCTYPE html> <html lang="en"&

  • Flutter有无状态类与State及生命周期详细介绍

    目录 无状态类 有状态类 状态 State生命周期 Flutter中的生命周期类似于Vue.React中的生命周期一样,有初始化.状态更新.停用.销毁等. 在React中,组件分为函数式组件和类式组件,它们的区别就是一个无状态.一个有状态.那么在Flutter中亦是如此,它有两种类,一种是无状态类,一种是有状态类.其生命周期的使用就是有状态类的特定用法. 无状态类 无状态类内部有build方法,在表面上看 每次数据更新都会执行build方法.但实际上,在组件树中,当每次数据发生变更时,无状态类都

  • 微信小程序(五)页面生命周期详细介绍

    这里只要熟悉页面的基本生命周期即可,业务在指定生命周期函数内书写. 以下是官网给出的生命周期函数方法和状态图 上面的生周期函数图对于做Android 或者IOS的来书理解起来应该不是难事,具体怎么掌握只有慢慢尝试和摸索 代码处理: 这里的代码主需要对使用创建项目时index目录下文件处理下就行,至于跳转后的页面用的还是logs不需要更改!下面贴下代码注释也比较详细 index.wxml <!--index.wxml--> <view class="container"

  • Android Service类与生命周期详细介绍

    Android  Service类与生命周期 Service是Android四大组件与Activity最相似的组件,都代表可执行的程序,区别在于Service一直在后台运行且没有用户界面. 1.Service的类图和生命周期 先来看看Service的类图: 接下来看看Service的生命周期: 2.开发Service (1)开发Service需要两步: 第1步:定义子类,继承Service 第2步:在AndroidManifest.xml文件中配置Service (2)创建Service pub

  • Android  Service类与生命周期详细介绍

    Android  Service类与生命周期 Service是Android四大组件与Activity最相似的组件,都代表可执行的程序,区别在于Service一直在后台运行且没有用户界面. 1.Service的类图和生命周期 先来看看Service的类图: 接下来看看Service的生命周期: 2.开发Service (1)开发Service需要两步: 第1步:定义子类,继承Service 第2步:在AndroidManifest.xml文件中配置Service (2)创建Service pub

  • Spring Bean的生命周期详细介绍

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring容器.这里,我们讲的也是 ApplicationContext中Bean的生命周期.而实际上BeanFactory也是差不多的,只不过处理器需要手动注册. 一.生命周期流程图: Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,这其中包含了一系列关

  • jsp 生命周期详细介绍

    jsp 生命周期 理解JSP底层功能的关键就是去理解它们所遵守的生命周期. JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet. 以下是JSP生命周期中所走过的几个阶段: 编译阶段:servlet容器编译servlet源文件,生成servlet类 初始化阶段:加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法 执行阶段:调用与JSP对应的servlet实例的服务方法 销毁阶段:调用与JSP对应的s

随机推荐