MyBatis(1)-- MyBatis介绍
一、MyBatis优点
- 不屏蔽SQL,意味着可以更为精确地定位SQL语句,可以对其进行优化和改造,这有利于互联网系统性能的提高,符合互联网需要性能优化的特点。
- 提供强大、灵活的映射机制,方便Java开发者使用。提供动态SQL的功能,允许我们根据不同条件组装SQL,这个功能远比其他工具或者Java编码的可读性和可维护性高得多,满足各种应用系统的同时也满足了需求经常变化的互联网应用的要求。
- 在MyBatis中,提供了使用Mapper的接口编程,只要一个接口和一个XML就能创建映射器,进一步简化我们的工作,使得很多框架API在MyBatis中消失,开发者能更集中于业务逻辑。
二、MyBatis核心组件

- SqlSessionFactoryBuilder(构造器):它会根据配置或者代码来生成SqlSessionFactory,采用的是分步构建的Builder模式
- SqlSessionFactory(工厂接口):依靠它来生成SqlSession,使用的是工厂模式。
- SqlSession(会话):一个既可以发送SQL执行返回结果,也可以获取Mapper的接口。一般使用MyBatis提供的SQL Mapper接口编程技术,能提高代码的可读性和可维护性。
- SQL Mapper(映射器):由一个Java接口和XML文件(或注解)构成,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果。
三、MyBatis运行流程图

四、搭建MyBatis开发环境
1.新建MySQL表
mysql> select * from t_role;
+----+-------------+--------+
| id | role_name | note |
+----+-------------+--------+
| 1 | role_name_1 | note_1 |
+----+-------------+--------+
1 row in set (0.00 sec)
2.文件布局

3.SQLSessionFactory(工厂接口)
构建SQLSessionFactory有两种方法:使用XML构建SqlSessionFactory;使用Java代码构建SqlSessionFactory
(1)使用XML构建SqlSessionFactory
MyBatis基础配置文件mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases><!-- 别名 -->
<typeAlias alias="role" type="com.mybatis.pojo.Role"/>
</typeAliases>
<!-- 数据库环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_test?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="bjtungirc"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件 -->
<mappers>
<mapper resource="com/mybatis/mapper/RoleMapper.xml"/>
<mapper class="com.mybatis.mapper.RoleMapper2"/>
</mappers>
</configuration>
基础配置文件的作用是配置一些最基本的上下文参数和运行环境。
- <typeAliases>元素定义了一个别名role,它代表着com.mybatis.pojo.Role这个类。这样定义后,就可以在MyBatis上下文中使用别名role去代替全限定名com.mybatis.pojo.Role了。
- <environments>用来定义数据库环境。<transactionManager>配置事务管理器为JDBC方式,<dataSource>用来配置数据库,其中type="POOLED"代表采用MyBatis内部提供的连接池方式。
- <mapper>元素代表引入的那些映射器。
有了基础配置文件,就可以用一段很简短的代码生成SqlSessionFactory了。
即首先读取mybatis-config.xml,然后通过SqlSessionFactoryBuilder的build方法启用创建SqlSessionFactory。
采用XML创建的形式,信息在配置文件中,有利于我们日后的维护和修改,避免了重新编译代码,因此推荐这种方式创建SqlSessionFactory。
// 使用XML构建SQLSessionFactory
public static SqlSessionFactory getSqlSessionFactory() {
synchronized (LOCK) {
if (sqlSessionFactory != null) {
return sqlSessionFactory;
}
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
return null;
}
return sqlSessionFactory;
}
}
(2)使用Java代码构建SqlSessionFactory
使用Java代码创建SqlSessionFactory的代码冗长,如果发生系统修改,那么有可能需要重新编译代码带能继续,所以这不是一个很好的方式。除非有特殊的需求,比如在配置文件中,需要配置加密过的数据库用户名和密码,需要我们在生成SqlSessionFactory前解密为明文的时候,才会考虑使用这种方式。
// 使用代码创建SQLSessionFactory
public static SqlSessionFactory getSqlSessionFactory2() {
synchronized (LOCK) {
// 数据库连接池信息
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("bjtungirc");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis_test?useSSL=false");
dataSource.setDefaultAutoCommit(false);
// 采用MyBatis的JDBC事务方式
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
// 创建Configuration对象
Configuration configuration = new Configuration(environment);
// 注册一个MyBatis上下文别名
configuration.getTypeAliasRegistry().registerAlias("role", Role.class);
// 加入一个映射器
configuration.addMapper(RoleMapper.class);
configuration.addMapper(RoleMapper2.class);
// 使用SQLSessionFactoryBuilder构建sqlSessionFactory
sqlSessionFactory =
new SqlSessionFactoryBuilder().build(configuration);
return sqlSessionFactory;
}
}
(3)SqlSessionFactory作为一个单例
SqlSessionFactory可以被认为是一个数据库连接池,它的作用是创建SqlSession接口对象。因为MyBatis的本质就是Java对数据库的操作,所以SqlSessionFactory的生命周期存在于整个MyBatis的应用之中,所以一旦创建了SqlSessionFactory,就要长期保存它,直至不再使用MyBatis应用,所以可以认为SqlSessionFactory的生命周期就等同于MyBatis的应用周期。
由于SqlSessionFactory是一个对数据库的连接池,所以它占据着数据库的连接资源,如果创建多个SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机的情况,所以在一般的应用中往往希望SqlSessionFactory作为一个单例,让它在应用中被共享。
package com.mybatis.utils;
public class SqlSessionFactoryUtils { private final static Class<SqlSessionFactoryUtils> LOCK = SqlSessionFactoryUtils.class; private static SqlSessionFactory sqlSessionFactory = null; private SqlSessionFactoryUtils() {
} // 使用XML构建SQLSessionFactory
public static SqlSessionFactory getSqlSessionFactory() {
synchronized (LOCK) {
...
return sqlSessionFactory;
}
} // 使用代码创建SQLSessionFactory
public static SqlSessionFactory getSqlSessionFactory2() {
synchronized (LOCK) {
// 数据库连接池信息
...return sqlSessionFactory;
}
} public static SqlSession openSqlSession() {
if (sqlSessionFactory == null) {
getSqlSessionFactory();
}
return sqlSessionFactory.openSession();
}
}
SqlSessionFactoryUtils的构造方法中加入了private关键字,使得其他代码不能通过new的方式来创建它。同时加入synchronized关键字加锁,主要是为了防止在多线程中多次实例化SqlSessionFactory对象,从而保证SqlSessionFactory的唯一性。而openSqlSession方法使用迭代来创建SqlSession对象。
4.SQLSession(会话)
在MyBatis中有两个实现类,DefaultSqlSession和SqlSessionManager。其中DefaultSqlSession是单线程使用的,而SqlSessionManager是在多线程环境下使用。SqlSession的作用类似于一个JDBC中的Connection对象,代表着一个连接资源的启用。它的作用有三个:获取Mapper接口--发送SQL给数据库--控制数据库事务
private static void testRoleMapper() {
Logger log = Logger.getLogger(Main.class);
SqlSession sqlSession = null;
try {
sqlSession = SqlSessionFactoryUtils.openSqlSession();
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1L);
log.info(role.getRoleName());
} finally {
// 在finally语句中确保资源被顺利关闭
if (sqlSession != null) {
sqlSession.close();
}
}
}
有了映射器就可以通过SqlSession发送SQL了,有两种方式:一种是通过SqlSession直接发送,另外一种是通过SqlSession获取Mapper接口再发送。
(1)使用SqlSession直接发送
Role role = (role)sqlSession.selectOne("com.mybatis.mapper.RoleMapper.getRole", 1L);
selectOne方法表示使用查询并且只返回一个对象,而参数则是一个String对象和一个Object对象。
(2)使用SqlSession获取Mapper接口再发送
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1L);
通过SqlSession的getMapper方法来获取一个Mapper接口,就可以调用它的方法了。
使用Mapper接口编程可以消除SqlSession带来的功能性代码,提高可读性,更能体现业务的逻辑,因此推荐这种方式。
5.SQL Mapper(映射器)
映射器是MyBatis中最重要、最复杂的组件,它由一个接口和对应的XML文件(或注解组成)。可以配置下列内容:
- 描述映射规则
- 提供SQL语句,并可以配置SQL参数类型、返回类型、缓存刷新等信息
- 配置缓存
- 提供动态SQL
实现映射器有两种方式,即XML文件形式和注解形式。首先定义一个POJO,
package com.mybatis.pojo;
public class Role {
private Long id;
private String roleName;
private String note;
/** setter and getter **
}
映射器的主要作用就是将SQL查询到的结果映射为一个POJO,或者将POJO的数据插入到数据库中,并定义一些关于缓存等的重要内容。
而映射器的只是一个接口类,为什么不是实现类,这是因为MyBatis运用了动态代理技术使得接口能够运行起来,MyBatis会为这个接口生成一个代理对象,代理对象回去处理相关的逻辑。
(1)使用XML实现映射器
使用XML实现映射器分为两个部分:接口+XML.
package com.mybatis.mapper;import com.mybatis.pojo.Role;
public interface RoleMapper {public Role getRole(Long id);
}
在使用XML方式创建SqlSessionFactory的配置文件mybatis-config.xml中使用下面的代码引入一个XML文件,
<mapper resource="com/mybatis/mapper/RoleMapper.xml"/>
在使用Java代码创建SqlSessionFactory的时候,使用下面的语句注册一个mapper
configuration.addMapper(RoleMapper.class);
RoleMapper.xml
<?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.mybatis.mapper.RoleMapper"> <select id="getRole" parameterType="long" resultType="role">
select id,
role_name as roleName, note from t_role where id = #{id}
</select> </mapper>
其中namespace所对应的是一个接口的全限定名,<select>元素表明这是一条查询语句,而属性id标识了这条SQL,parameterType="long"说明传递给SQL的是一个long型的参数,而resultType="role"说明返回的是一个role类型的返回值,这里的role是mybatis-config.xml中配置的别名,语句中的#{id}表示传递进去的参数。
(2)使用注解实现映射器
package com.mybatis.mapper;
import org.apache.ibatis.annotations.Select;
import com.mybatis.pojo.Role;
public interface RoleMapper2 {
@Select("select id, role_name as roleName, note from t_role where id=#{id}")
public Role getRole(Long id);
}
在使用XML方式创建SqlSessionFactory的配置文件mybatis-config.xml中使用下面的代码引入一个Class文件,
<mapper class="com.mybatis.mapper.RoleMapper2"/>
在使用Java代码创建SqlSessionFactory的时候,使用下面的语句注册一个mapper
configuration.addMapper(RoleMapper2.class);
6.日志输出环境配置文件log4j.properties
log4j.rootLogger=DEBUG , stdout
log4j.logger.org.mybatis=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n
配置信息:日志输出级别为DEBUG,并且输出端载体是ConsoleAppender即控制台类型,且输出端载体的界面布局为自定义布局,最后一行是布局的自定义格式。
MyBatis(1)-- MyBatis介绍的更多相关文章
- MyBatis注解Annotation介绍及Demo
MyBatis注解Annotation介绍及Demo 2014-04-21 17:09:55 标签:Mybatis Annotation 注解 ResultMap SqlBuilder 原创作品,允 ...
- 一、mybatis的插件介绍
摘自:https://www.cnblogs.com/qm-article/p/11785350.html mybatis的插件机制 一.mybatis的插件介绍 关于mybatis的插件,我想大 ...
- Mybatis通用Mapper介绍和使用
Mybatis通用Mapper介绍与使用 前言 使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL. ...
- 【Mybatis】MyBatis之动态SQL(六)
MyBatis 的强大特性之一便是它的动态 SQL,本章介绍动态 SQL 查看本章,请先阅读[Mybatis]MyBatis对表执行CRUD操作(三). 本例表结构 CREATE TABLE `emp ...
- 【Mybatis】MyBatis之Sql配置文件的使用(四)
上一章[Mybatis]MyBatis对表执行CRUD操作(三),已经讲了基本操作,本章介绍Sql配置文件中常用功能 1.插入返回主键 2.参数值的获取方式 3.resultMap使用 插入返回主键 ...
- Mybatis学习---Mybatis分页插件 - PageHelper
1. Mybatis分页插件 - PageHelper说明 如果你也在用Mybatis,建议尝试该分页插件,这个一定是最方便使用的分页插件. 该插件目前支持Oracle,Mysql,MariaDB,S ...
- java 学习笔记--mybatis 三剑客(mybatis)
Java项目中使用Mybatis入门程序 wanna 关注 2017.03.23 14:33* 字数 270 阅读 1243评论 0喜欢 5 MyBatis 是支持定制化 SQL.存储过程以及高级映射 ...
- 【Mybatis】MyBatis之配置多数据源(十)
在做项目的过程中,有时候一个数据源是不够,那么就需要配置多个数据源.本例介绍mybatis多数据源配置 前言 一般项目单数据源,使用流程如下: 单个数据源绑定给sessionFactory,再在Dao ...
- spring boot集成mybatis(3) - mybatis generator 配置
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- Hello Mybatis 02 mybatis generator
接着上一篇文章通过Mybatis完成了一个User的CRUD的功能之后,这篇开始还需要建立一个Blog类,这样就可以模拟一个简单的微博平台的数据库了. 数据库准备 首先我们,还是需要在数据库中新建一个 ...
随机推荐
- jquery的api以及用法总结-数据/操作/事件
数据 .data() 在匹配元素上存储任意相关数据或返回匹配的元素集合中的第一个元素的给定名称的数据存储的值 .data(obj) 一个用于更新数据的键/值对 .data()方法允许我们再dom元素上 ...
- Java 多线程练习
题目:某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程, 并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码.线 ...
- 如何搭建基于Docker的gitlab服务器集成CI/CD实现DEVOPS(完整版)
From this lesson you will learn about 1,How to install and configure a docker based gitlab server 2, ...
- Django之使用redis缓存session,历史浏览记录,首页数据实现性能优化
Redis缓存session 配置Django缓存数据到redis中 # diango的缓存配置 CACHES = { "default": { "BACKEND&quo ...
- .Net Core与Vue.js模块化前后端分离快速开发解决方案(NetModular)
NetModular是什么? NetModular不仅仅是一个框架,它也是一整套的模块化与前后端分离的快速开发的解决方案,目标是致力于开箱即用,让开发人员完全专注于业务开发,不需要关心底层封装和实现. ...
- Knative 暂时不会捐给任何基金会 | 云原生生态周报 Vol. 22
作者 | 新胜.心贵.进超.元毅.衷源 业界要闻 谷歌:不会向任何基金会捐赠 Knative 自 Knative 项目开始以来,一直存在关于是否将 Knative 捐赠给基金会(例如 CNCF)的疑问 ...
- Thinkphp5.0终章
thinkphp5.0最终总结 前期刚开始我是跟着b站上的千峰教育的视频走的,一路上做笔记进行深化与实际操作,中间因为不会开报错,并且视频里面也没有讲到怎么弄报错,因为是新手,那种出错了却不知道错在哪 ...
- 快学Scala 第九课 (伴生对象和枚举)
Scala没有静态方法和静态字段, 你可以用object这个语法结构来达到同样的目的. 对象的构造器只有在第一次被使用时才调用. 伴生对象apply方法: 类和它的伴生对象可以互相访问私有特性,他们必 ...
- PID算法的理解及场景模拟
增量式PID算法的简化版之后的公式: △u(t)=Ae(t)-Be(t-1)+Ce(t-2) △u:PID控制器输出的下一时刻的调整量 e(t):PID控制器在当前时刻的状态变化量-给定值 e(t-1 ...
- Linux修改屏幕分辨率至2K
使用命令:cvt,与 xrandr 使用cvt命令查看分辨率配置: Modeline后边分别是 modeName 以及 详细的配置 linklee@linklee-270E5G-270E5U:~$ c ...