一、走进Mybatis
1.1 什么是框架?
1.框架是一系列的Jar包,其本质是对JDK功能的扩展
2.框架是一组程序的集合,包含了-系列的最佳实践,作用是解决某一个领域的问题
1.2 框架的形成
- 实际上是无数程序员经过无数次尝试后,总结出来的处理特定问题的特定方法
- 如果把程序员的自由发挥看到是一条通往成功的途径,最佳实践就是其中的最短路径
1.3 ORM思想
-
对象关系映射Object Relational Mapping, 简称ORM): 是一种为了解决面向对象与关系数据库存在的互不匹配的问题的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据, 将Java程序中的对象自动持久化到关系数据库中.
-
ORM 主要解决对象-关系的映射
面向对象概念 | 面向关系概念 |
---|---|
类 | 表 |
对象 | 表的行 |
属性 | 表的列、 |
二、 MyBatis概述
- MyBatis 是一款优秀的持久层框架
- 它支持定制化 SQL、存储过程以及高级映射。
- Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
- Mybatis 可以使用简单的XML或注释来配置和映射原生类型、接口和Java的POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2.1-MyBatis架构图
2.2-Mybatis核心组件
- SqISessionFactoryBuilder (构建器) : 根据配置信息或Java代码来构建- SqlSessionFactory对象。作用:创建SqlSessionFactory对象。
- SqlSessionFactory ( 会话工厂 ) :好比是DataSource ,线程安全的,在应用运行期间不要重复创建多次,建议使用单例模式。 作用: 创建SqlSession对象
- SqISession (会话) :好比是Connection ,线程不安全的,每次使用开启新的SqlSession对象,使用完毕正常关闭,默认使用DefaultSqlSession。提供操作数据库的增删改查方法,可以调用操作方法,也可以操作Mapper组件。
- Executor (执行器) :SqlSession本身不能直接操作数据库,需要Executor来完成,该接口有两个实现:缓存执行器(缺省)、基本执行器。
- MappedStatement :映射语句封装执行语句时的信息如SQL、输入参数、输出结果
- SqlSession :表示和数据库交互的会话,完成必要数据库增删改查功能。
- Executor :执行器,是MyBatis调度的核心,负责SQL语句的生成和查询缓存的维护。
- StatementHandler :语句处理器,封装了JDBC的DML、DQL 操作、参数设置。
- ParameterHandler :参数处理器,把用户传入参数转换为JDBC需要的参数值。
- ResultSetHandler :结果集处理器,把结果集中的数据封装到List集合。
- TypeHandler :类型转换器, Java类型和JDBC类型的相互转换。
- MappedStatement :映射语句对象,维护了一条< insertlupdateldelete|select>节点的封装。
- SqlSource : SQL源,根据用户传入的参数生成SQL语句,并封装到BoundSql中。
- BoundSql : SQL绑定,封装SQL语句和对应的参数信息。
- Configuration : MyBatis 全局配置对象,封装所有配置信息。
三、Mybatis入门
3.1 如何获取Mybaits?
通过Maven仓库
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
3.2 配置文件
MyBatis 自身的配置文件有两种:
- MyBatis全局配置文件/主配置文件.
起名: 一般规定 mybatis-config.xml
路径: 放在resources资源路径下
参照: mybatis文档的 ---- 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>
<!--1.配置数据库的环境-->
<environments default="development">
<!--开发环境:在以后事务管理器和连接池都是交给Spring框架来管理-->
<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?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="1111"/>
</dataSource>
</environment>
</environments>
<!--2.关联映射文件-->
<!--
注意这里的路径是mybatis-config.xml文件找到UserMapper.xml的路径
如果在java的目录下,找不到UserMapper.xml
-->
<mappers>
<mapper resource="com/sunny/dao/UserMapper.xml"/>
</mappers>
</configuration>
- 起名: 一般见名知意 XxxMapper.xml, Xxx表示模型对象
- 路径: Mapper文件应该放到Mapper接口的路径.
MyBatis映射文件/Mapper文件 - 参照 mybatis文档的 — XML映射文件章节
- 内容:
1. 编写增删改查的SQL, 把SQL存放到insert | update | delete | select元素中去
- 结果集映射: 解决表中的列和对象中属性不匹配的问题.
- 缓存配置
<?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">
<!--命名空间,类似包的概念: namespace:绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.sunny.dao.UserDao">
<!--
select元素: 专门用来做查询的SQL
-id属性: 唯一标识,用来标识某一条SQL语句
-parameterType属性: 表示执行该SQL语句需要的参数的类型(建议不写),MyBatis可以自行推断出来
-resultType属性: 把结果集中每一行数据封装成什么类型的对象
-->
<select id="getUserList" resultType="com.sunny.domain.User">
SELECT * FROM user;
</select>
<!-- #{id} 相当于在测试方法中selectOne传递过来的值 -->
<select id="getUser" resultType="com.sunny.domain.User">
SELECT * FROM user WHERE id = #{id};
</select>
</mapper>
3.3 查询操作
- UserDaoTest
public class UserDaoTest {
/**
* 查询所有用户
* @throws IOException
*/
@Test
public void queryUserListTest() throws IOException {
//1. 获得sqlSession对象
// SqlSession sqlSession = MybatisUtils.getSqlSession();
//1. 从classpath路径去加载MyBatis全局配置文件:mybatis-config.xml
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2. 创建sqlSessionFactory对象,好比是DataSource
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3. 创建sqlSession对象,好比是Connection
SqlSession sqlSession = factory.openSession();
//4. 具体操作
// 执行SQL(方式一)
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.getUserList();
// 方式二
// List<User> userList = sqlSession.selectList("com.sunny.dao.UserDao.getUserList");
for (User user : userList) {
System.out.println(user);
}
// 关闭sqlSession
sqlSession.close();
}
/**
* 查询id为1的用户
* @throws IOException
*/
@Test
public void queryOneUserTest() throws IOException {
// 加载全局配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
// 构建sqlSessionFactory工厂类对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
// 根据sqlSession类对象来创建SqlSession对象
SqlSession sqlSession = factory.openSession();
// sqlSession相当于Connection,来执行SQL语句
User user = sqlSession.selectOne("com.sunny.dao.UserDao.getUser", 1L);
System.out.println(user);
}
}
- 抽取的MybatisUtils
// sqlSessionFactory 生产 sqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 使用Mybatis的第一步: 获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 既然有了 SqlSessionFactory,顾名思义,我们就可以从中获得 SqlSession 的实例了。
// SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
链接: link.
内容很多都是转载的,自己码了一遍,这是我第一次发布的CSDN博客。