Mybatis入门学习六:作用域(scope),生命周期,结果映射

21 篇文章 0 订阅
7 篇文章 0 订阅

作用域(scope)和生命周期

作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。即只有在并发的情况在才会出现问题。

Mybatis执行流程

在这里插入图片描述

SqlSessionFactoryBuilder

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

SqlSessionFactory

  • 跟数据库连接池类似。
  • SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例,它会一直存在在我们的Mybatis程序中,随时等待创建SqlSession。
  • 单例模式,静态单例模式。
  • 多次创建会浪费内存资源。

SqlSession

  • 每个线程都应该有它自己的 SqlSession 实例。

  • 一个SqlSession可以创建多个映射器,

  • 它就相当于连接到数据库连接池的一个请求,执行完它的任务之后,我们就应该将这个请求关闭。

  • 用完之后需要赶紧关闭,否则资源被占用

  • SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。

  • 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。

  • 官方推荐保证关闭的方法:

    try (SqlSession session = sqlSessionFactory.openSession()) {
      // 你的应用逻辑代码
    }
    finally {
        //关闭代码
        session.close();
    }
    

Mapper

  • 映射器是一些绑定映射语句的接口。
  • 映射器接口的实例是从 SqlSession 中获得的。
  • 方法作用域,用完即可丢弃。
  • 执行具体CRDU操作的东西。

resultMap结果集映射

最直白的作用就是,当我们pojo类的属性与数据库中字段名称不一致,Mybatis无法自动做映射的时候,我们就需要手动将字段跟属性进行映射。简单的用法

<resultMap id="userResultMap" type="User">
  <id property="id" column="user_id" />
    <!-- column数据库中字段,property实体类中的属性 -->
  <result property="username" column="user_name"/>
  <result property="password" column="hashed_password"/>
</resultMap>
<select resultMap = "userResultMap" resultType="User">......</select>

当我们的实体类对象中包含了其他实体类对象的时候,即数据库中存在外键的时候,的用法,

实体类

class A {
    int a1; B b;
    ...
}
class B {
    int b1;
}
select A.a_1,B.b_1 From a as A left jion B as b on A.a_1 = B.b_1
<resultMap id = "AJionB" type = "A">
    <result property="a_1" column="a1"/>
    <association property="b" javaType="B">
    	<result property="b1" column="b_1"/>
  	</association>
</resultMap>

注解版本:

@Select("SELECT b.b_id, b.b_name,b.b_imagepath,b.b_author,b.b_date,"
			+ "b.b_borrowed,b.b_state,m.m_name,m.m_id  FROM Library_ManagementSystem.t_bookinfo b "
			+ "LEFT JOIN Library_ManagementSystem.t_major m ON b.b_major = m.m_id "
			+ "WHERE b_name LIKE CONCAT('%',#{content},'%') ORDER BY b_borrowed DESC")
	@Results
	({	
		@Result(property="bId",column="b_id"),
		@Result(property="bMajor.mName",column="m_name"),
		@Result(property="bMajor.mId",column="m_id"),
		@Result(property="bName",column="b_name"),
		@Result(property="bBrief",column="b_brief"),
		@Result(property="bImagepath",column="b_imagepath"),
		@Result(property="bAuthor",column="b_author"),
		@Result(property="bDate",column="b_date"),
		@Result(property="bState",column="b_state"),
		@Result(property="bBorrowed",column="b_borrowed")

	})
	public List<BookInfo> Getsearchbookallinfo(String  content);

上面介绍的只是简单的用法,更加复杂的版本的将在后续版本稍加详细的记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值