MyBatis 的基本要素—核心对象
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 的基本要素—核心对象的更多相关文章
- Mybatis的基本要素--核心对象
大家好啊,今天呢来说下Mybatis的核心对象,也就是说基本三要素. >核心接口和类. >Mybatis核心配置文件(mybatis-config.xml) >SQL映射文件 一.下 ...
- mybatis的两个核心对象SqlSessionFactory和SqlSession对象
mybatis的两个核心对象SqlSessionFactory和SqlSession对象 参见:https://www.cnblogs.com/wxdestiny/p/9743686.html
- MyBatis的2个核心对象:SqlSessionFactory、SqlSession
SqlSessionFactory SqlSessionFactory是单个数据库映射关系经过编译后的内存镜像,主要作用是创建SqlSession. InputStream inputStream = ...
- MyBatis 的基本要素—核心配置文件
MyBatis 核心配置文件( mybatis-config.xml),该文件配置了 MyBatis 的一些全局信息,包含数据库连接信息和 MyBatis 运行时所需的各种特性,以及设置和影响 MyB ...
- 【MyBatis系列5】MyBatis4大核心对象SqlSessionFactoryBuiler,SqlSessionFactory,SqlSession,Mapper
前言 前几篇篇我们简单讲解了MyBatis的简单用法,以及一对一和一对多以及多对多的相关动态sql查询标签的使用,也提到了嵌套查询引发了N+1问题,以及延迟加载相关功能,本篇文章将会从MyBatis底 ...
- MyBatis核心对象之StatementHandler
MyBatis核心对象之StatementHandler StatementHandler ResultHandler ParameterHandler Executor org.apache.iba ...
- Asp.Net WebApi核心对象解析(下篇)
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- ASP.NET Core的路由[2]:路由系统的核心对象——Router
ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路由参数的形式解析出来供后续请求处理流 ...
- Asp.Net WebApi核心对象解析(上篇)
生活需要自己慢慢去体验和思考,对于知识也是如此.匆匆忙忙的生活,让人不知道自己一天到晚都在干些什么,似乎每天都在忙,但又好似不知道自己到底在忙些什么.不过也无所谓,只要我们知道最后想要什么就行.不管怎 ...
随机推荐
- git如何避免每次pull或者push的时候都要输入用户名和密码?
git config --global credential.helper store 这个命令则是在你的本地生成一个账号密码的本子似的东东,这样就不用每次都输入了(但是还得输入一次) 这个指令对于w ...
- oracle游标的定义使用
oracle游标的定义使用 2008-02-23 15:12:57| 分类: oracle|字号 订阅 游标中定义的参数只要定义类型,不用定义长度,精度等: 游标使用一: declarecursor ...
- [Codeforces 1037D] Valid BFS?
[题目链接] http://codeforces.com/problemset/problem/1037/D [算法] 首先求出每个点的父节点 , 每棵子树的大小 然后判断BFS序是否合法即可 时间复 ...
- 洛谷 P2822 [ NOIP 2017 ] 组合数问题 —— 数学
题目:https://www.luogu.org/problemnew/show/P2822 阶乘太大,算不了: 但 k 只有 8 个质因子嘛,暴力60分: #include<iostream& ...
- bzoj1085骑士精神(搜索)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1893 Solved: 1051 Description ...
- Django day 33 vue中使用element-ui的使用,课程的相关介绍,vue绑定图片,课程列表接口,课程详情页面
一:vue中使用element-ui的使用, 二:课程的相关介绍, 三:vue绑定图片, 四:课程列表接口, 五:课程详情页面
- JPA中关联关系(OneToOne、OneToMany、ManyToMany,ManyToOne)映射代码片段
在使用Hibernate的时候我们常常会在类里边配置各种的关联关系,但是这个并不是很好配置,配置不当会出现各种各样的问题,下面具体来看一下: 首先我们来看User类里边有一个IdentityCard类 ...
- c++ isdigit函数
函数名:isdigit 函数所需头文件:#include<cstdio> 函数格式:isdigit(字符) 函数作用:判断括号内是否为1~9的数字. 例:isdigit(4) 就是true ...
- c语言 error C4996: 'strupr': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name
问题: 在使用visual studio 2013,进行调试执行代码时,出现如下错误: error C4996: 'strupr': The POSIX name for this item is d ...
- linux rpm 安装
1.rpm 安装rpm -ivh package_name-i:install的意思-v:查看更详细的安装信息-h:以安装信息栏显示安装进度rpm -ivh package_name --test 2 ...