MyBatis 三个基本要素

    ➢ 核心接口和类
   ➢ MyBatis 核心配置文件(mybatis-config.xml)
   ➢ SQL 映射文件(mapper.xml)

MyBatis 核心接口和类

      说明:

      1、每个 MyBatis 的应用程序都以一个 SqlSessionFactory 对象的实例为核心,SqlSessionFactory 对象实例可以通过 SqlSessionFactoryBuilder 对象来获得。首先获取 SqlSessionFactoryBuilder 对象,可以根据 XML 配置文件或 Configuration 类的实例构建该对象。然后获取 SqlSessionFactory 对象,有了 SqlSessionFactory 对象之后,就可以进而获取 Sqlsession 实例, Sqlsession 对象中完全包含以数据库为背景的所有执行 SQL 操作的方法。可以用该实例来直接执行已映射的 SQL 语句。

      2、根据 XML 配置文件构建 SqlSessionFactory 的实例非常简单,建议使用。

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取 SqlSessionFactory 对象实例
SqlSession session = sqlSessionFactory.openSession(); //获取 SqlSession 对象实例 try {
//业务逻辑代码:如通过调用 session 对象的一系列 SQL 操作方法,对数据库表执行 CRUD 操作
int count=session.selectOne("com.mybatis.dao.UserMapper.count", 2); //方式 1
int count= session.getMapper(UserMapper.class).count(2); //方式 2:更简单,代码更安全,减少类型转换错误(推荐使用)
} finally {
session.close(); //关闭 SqlSession
} 说明:
1、UserMapper mapper = session.getMapper(UserMapper.class); //获取映射器实例 mapper
   2、映射器是你创建绑定映射语句的接口,映射器接口的实例可以从 SqlSession 中获得,映射器实例的最佳范围是方法范围。即它们应该在使用它们的方法中被请求,然后就抛弃掉。它们不需要明确地关闭。

SqlSessionFactoryBuilder

    1、SqlSessionFactoryBuilder 作用

  SqlSessionFactoryBuilder 负责构建 SqlSessionFactory,并且提供了多个 build() 方法的重载,由于方法参数 environment 和 Properties 都可以为 null,那么去除重复的,真正的重载方法其实只有如下三种:

build(Reader reader,String environment,Properties properties)
build(InputStream inputStream,String environment,Properties properties)
build(Configuration config)

  通过上述分析,发现配置信息可以以三种形式提供给 SqlSessionFactoryBuilder 的 build() 方法,分别是 InputStream(字节流)、 Reader(字符流)、 Configuration(类),由于字节流与字符流都属于读取配置文件的方式,所以从配置信息的来源就很容易想到构建一个 SqlSessionFactory 有两种方式:读取 XML 配置文件构造方式和编程构造方式。我们采用读取 XML 配置文件的方式来构造 SqlSessionFactory。

    2、SqlSessionFactoryBuilder 的生命周期和作用域

  SqlSessionFactoryBuilder 的最大特点是:用过即丢。一旦创建了 SqlSessionFactory 对象之后,这个类就不再需要存在了,因此 SqlSessionFactoryBuilder 的最佳范围就是存在于方法体内,也就是局部变量而已。即最佳范围是方法范围 (本地方法变量)。

SqlSessionFactory

    1、SqlSessionFactory 的作用

  SqlSessionFactory 简单的理解就是创建 SqlSession 实例的工厂。所有的 MyBatis 应用都是以 SqlSessionFactory 实例为中心, SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 对象来获得。有了它之后,顾名思义,就可以通过 SqlSessionFactory 提供的 openSession() 方法来获取 SqlSession 实例。

  

  说明: openSession() 方法的参数为 boolean 值时,若传入 true 表示关闭事务控制,自动提交; false 表示开启事务控制。若不传入参数,默认为 true。

openSession (boolean autoCommit)
openSession()//若不传入参数,默认为 true ,自动提交

    

    2、SqlSessionFactory 的生命周期和作用域

  SqlSessionFactory 对象一旦创建,就会在整个应用运行过程中始终存在。没有理由去销毁或再创建它,并且在应用运行中也不建议多次创建 SqlSessionFactory 。因此 SqlSessionFactory 的最佳作用域是 Application,即随着应用的生命周期一同存在。那么这种 “存在于整个应用运行期间,并且同时只存在一个对象实例” 的模式就是所谓的单例模式(指在应用运行期间有且仅有一个实例)。即 SqlSessionFactory 的最佳范围是应用范围。

  

SQLSession

  1、SqlSession

  SqlSession 是用于执行持久化操作的对象,类似于 JDBC 中的 Connection 。它提供了面向数据库执行 SQL 命令所需的所有方法,可以通过 SqlSession 实例直接运行已映射的 SQL 语句。

    2、SqlSession 的生命周期和作用域

  正如其名, SqlSession 对应着一次数据库会话。由于数据库会话不是永久的,因此 SqlSession 的生命周期也不应该是永久的。相反,在每次访问数据库时都需要创建它(注意:并不是说在 SqlSession 里只能执行一次 SQL,是完全可以执行多次的,但是若关闭了 SqlSession ,那么就需要重新创建它)。创建 SqlSession 的地方只有一个,那就是 SqlSessionFactory 对象的 openSession()方法。

  需要注意的是:每个线程都有自己的 SqlSession 实例, SqlSession 实例不能被共享,也不是线程安全的。因此最佳的作用域范围是请求 request 范围或者方法范围。

  关闭 SqlSession 是非常重要的。必须要确保 SqlSession 在 finally 语句块中正常关闭。可以使用下面的标准方式来关闭:

SqlSession session =sqlSessionFactory.openSession();
try{
//do work
}finally{
session.close(); //关闭 SqlSession
}

  3、SqlSession 的两种使用方式

//方式 1:通过 SQLSession 实例调用 selectList、selectOne 等方法来直接执行已映射的 SQL 语句。(不需要编写 DAO 接口)

        // MyBatis 通过 mapper 文件的 namespace 和子元素的 id 来找到相应的 SQL,从而执行查询操作
userList=sqlSession.selectList("com.smbms.dao.UserMapper.getUserList"); 说明:
1、com.smbms.dao.UserMapper.getUserList=namespace+id
2、使用方式一可以不用写接口中的方法,因为方式一直接执行映射文件的 SQL 语句。
     3、执行 CRUD 操作,有参数传递时此方式不适用,应使用方式 2。 //方式 2:基于 mapper 接口方式操作数据。(官方推荐使用) //创建绑定映射语句的接口 UserMapper.java,并提供接口方法 getUserList(),该接口称为映射器。
userList=sqlSession.getMapper(UserMapper.class).getUserList(); 说明:
1、接口的方法必须与 SQL 映射文件中 SQL 语句的 id 一一对应。
2、第二种方式是通过 SQLSession 实例调用 getMapper(Mapper.class) 执行 Mapper 接口方法来实现对数据库的查询操作。
3、第一种方式是旧版本的 MyBatis 提供的操作方式,虽然现在也可以正常工作,但是第二种方式是 MyBatis 官方所推荐使用的,其表达方式也更加直白。代码更加清晰,类型安全,也不用担心易错的字符串字面值以及强制类型转换。

获取 SqlSession 的工具类(MyBatisUtil.java)

  此 MyBatisUtil.java 文件是优化后获取 SqlSession ,关闭 SqlSession 的公用工具类

package cn.mybatis.util;

import java.io.IOException;
import java.io.InputStream; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MyBatisUtil { private static SqlSessionFactory sessionFactory; static{//在静态代码块下,sessionFactory 只会被创建一次
try {
//读取 mybatis-config.xml 文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
//利用SqlSessionFactoryBuilder对象 去构建sessionFactory工厂
sessionFactory = sessionFactoryBuilder.build(in);
} catch (IOException e) {
e.printStackTrace();
}
} //创建sqlSession
public static SqlSession getSqlSession(){
//利用sessionFactory工厂对象去生产sqlSession
SqlSession sqlSession = sessionFactory.openSession(false);//false代表不会自动提交事务,true 代表自动提交事务
return sqlSession;
} //关闭sqlSession
public static void close(SqlSession sqlSession){
if(sqlSession!=null){
sqlSession.close();
}
} }

MyBatisUtil 工具类

MyBatis 的基本要素—核心对象的更多相关文章

  1. Mybatis的基本要素--核心对象

    大家好啊,今天呢来说下Mybatis的核心对象,也就是说基本三要素. >核心接口和类. >Mybatis核心配置文件(mybatis-config.xml) >SQL映射文件 一.下 ...

  2. mybatis的两个核心对象SqlSessionFactory和SqlSession对象

    mybatis的两个核心对象SqlSessionFactory和SqlSession对象 参见:https://www.cnblogs.com/wxdestiny/p/9743686.html

  3. MyBatis的2个核心对象:SqlSessionFactory、SqlSession

    SqlSessionFactory SqlSessionFactory是单个数据库映射关系经过编译后的内存镜像,主要作用是创建SqlSession. InputStream inputStream = ...

  4. MyBatis 的基本要素—核心配置文件

    MyBatis 核心配置文件( mybatis-config.xml),该文件配置了 MyBatis 的一些全局信息,包含数据库连接信息和 MyBatis 运行时所需的各种特性,以及设置和影响 MyB ...

  5. 【MyBatis系列5】MyBatis4大核心对象SqlSessionFactoryBuiler,SqlSessionFactory,SqlSession,Mapper

    前言 前几篇篇我们简单讲解了MyBatis的简单用法,以及一对一和一对多以及多对多的相关动态sql查询标签的使用,也提到了嵌套查询引发了N+1问题,以及延迟加载相关功能,本篇文章将会从MyBatis底 ...

  6. MyBatis核心对象之StatementHandler

    MyBatis核心对象之StatementHandler StatementHandler ResultHandler ParameterHandler Executor org.apache.iba ...

  7. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  8. ASP.NET Core的路由[2]:路由系统的核心对象——Router

    ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路由参数的形式解析出来供后续请求处理流 ...

  9. Asp.Net WebApi核心对象解析(上篇)

    生活需要自己慢慢去体验和思考,对于知识也是如此.匆匆忙忙的生活,让人不知道自己一天到晚都在干些什么,似乎每天都在忙,但又好似不知道自己到底在忙些什么.不过也无所谓,只要我们知道最后想要什么就行.不管怎 ...

随机推荐

  1. YTU 2625: B 构造函数和析构函数

    2625: B 构造函数和析构函数 时间限制: 1 Sec  内存限制: 128 MB 提交: 772  解决: 513 题目描述 在建立类对象时系统自动该类的构造函数完成对象的初始化工作, 当类对象 ...

  2. mysqldump 导出数据表,和数据

    目录 导出数据库表与数据 导出数据表数据 导出多个表数据 只导出数据 只导出创建表的数据 导出数据库表与数据 mysqldump -uroot -p caomall>tmp.sql 导出数据表数 ...

  3. MPMoviePlayerController属性方法简介

    属性 说明 @property (nonatomic, copy) NSURL *contentURL 播放媒体URL,这个URL可以是本地路径,也可以是网络路径 @property (nonatom ...

  4. 基于Spark的GBDT + LR模型实现

    目录 基于Spark的GBDT + LR模型实现 数据预处理部分 GBDT模型部分(省略调参部分) GBDT与LR混合部分 基于Spark的GBDT + LR模型实现 测试数据来源http://arc ...

  5. java静态方法和实例化方法的区别(copy)

    [资料来源] http://blog.csdn.net/biaobiaoqi/article/details/6732117 方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法 ...

  6. UVaLive 6834 Shopping (贪心)

    题意:给定 n 个商店,然后有 m个限制,去 c 之前必须先去d,问你从0到n+1,最短路程是多少. 析:我们我们要到c,必须要先到d,那么举个例子,2 5, 3 7,如果我们先到5再到2,再到7再到 ...

  7. map的遍历方式(使用Junit测试)

    package cn.sdut.lah; import java.util.HashMap; import java.util.Iterator; import java.util.Map; impo ...

  8. sublime text2 配置php本地环境时遇到的错误。

    首先,将PHP加到电脑的环境变量中如图(D:\PHPEnv\PHP5是我PHP的安装目录): 第二步:添加编译系统配置 第三步:配置详情: { "cmd": ["php. ...

  9. Linux环境下修改MySQL数据库对表名大小写不敏感

    Linux系统中MySQL对数据库名称和表名是大小写敏感的,这就导致了一些麻烦,虽然已经建立了表和数据,但因为大小写导致无法找到表. MySQL数据库对表名大小写不敏感的设置方法如下: 1.查看MyS ...

  10. windows 中常用的 cmd 命令汇总

    查看系统基本信息: cmd -> systeminfo 或 run -> dxdiag 查询主板出厂日期: cmd -> wmic bios get releasedate 关闭本地 ...