Mybatis精讲(一)---环境配置及架构梳理
此文已独家授权给【新华前后端开发】使用。其他平台使用联系作者后再使用
简介
在数据库方面我们最常用的应该JDBC、Hibernate和Mybatis。通过JDBC方式连接数据库,我们会发现工作量是相当的复杂。我们得处理一些琐碎的关闭。然后入参出参我们都得自己管理。基于次产生了ORM(Object Relational Mapping)模型。
ORM模型
- 简单的说ORM模型就是数据库表和Java对象的映射模型。主要解决了数据库和Java对象的相互映射。我们可以操作实体对象进而操作数据库表。这样的好处是我们不需要太了解数据库。减轻了我们的学习代价。
Hibernate
- 基于ORM模型很快我们的第二主角登场了。但是由于Hibernate配置比较复杂,且操作性能上不是很好。虽然大大的弱化了我们的sql但是因为性能低下很快就被淘汰了。
Ibatis
Mybatis的前身严格意义上说应该是Ibatis,后面我们都称之为Mybatis.为了解决Hibernate的不足,Mybatis产生了相对于Hibernate的全表映射Mybatis可以说是半自动映射的框架。因为他是实体和sql结合的一个框架。
Mybatis有SQL , 实体 , 映射规则三个主要对象主成。和Hibernate相比虽然多出了sql的编写,但是正是因为sql的编写使得Mybatis变得很方便。Hibernate因为不用sql,所以他无法调用存储过程这些数据库方法。但是Mybatis不一样,Mybatis可以调用sql中的存储过程。
环境搭建
jar
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
配置
- 在上面的图示中我们可以发现,Mybatis中提供的注解或者是接口的方式来操作数据库的。所以这里我们准备一个接口。与接口对应的是xml文件。两者组成了Mybatis中的一个组件。
package com.github.zxhtom.mapper;
import com.github.zxhtom.model.Student;
import java.util.List;
public interface StudentMapper {
/**
* 获取学生列表
* @return
*/
public List<Student> getStudents();
/**
* 通过id获取学生信息
* @param id
* @return
*/
public Student getStudentByStuId(String id);
}
- 与接口对应的是xml,里面记录了真是的sql。这里注意下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.github.zxhtom.mapper.StudentMapper">
<select id="getStudents" resultType="com.github.zxhtom.model.Student">
select * from student
</select>
<select id="getStudentByStuId" resultType="com.github.zxhtom.model.Student">
select * from student where id=#{id}
</select>
</mapper>
xml方式配置
- 有了上面的接口和xml,下面我们开始配置我们的Mybatis环境。
<?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>
<!--引入外部配置文件-->
<properties resource="config.properties"></properties>
<!--定义别名-->
<typeAliases>
<package name=""/>
</typeAliases>
<!--定义数据库信息,默认使用development数据库构建环境-->
<environments default="development">
<environment id="development">
<!--jdbc事物管理-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据库连接信息-->
<dataSource type="POOLED">
<property name="driver" value="${database.driver}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/github/zxhtom/mapper/StudentMapper.xml"></mapper>
</mappers>
</configuration>
- 然后我们就可以加载这个xml环境配置,构建我们的sqlsession.
//获取mybatis-config.xml位置
InputStream inputStream = Resources.getResourceAsStream(Constant.MYBATIS);
//加载mybatis-config,并创建sqlsessionfactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建sqlsession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", 1);
//执行select语句,将resultSet映射成对象并返回
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = studentMapper.getStudents();
studentPrint(students);
代码方式配置
- 官方提供了另外一种Java对象的方式来配置环境。这种配置我们控制的力度更加细腻,但是导致的问题是我们的一些配置将会硬编码在代码里。我们这里通过Properties文件将硬编码的东西挪出去。
Map<Object, Object> properties = PropertiesUtil.getProperties("config.properties");
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver(properties.get("database.driver").toString());
dataSource.setUrl(properties.get("database.url").toString());
dataSource.setUsername(properties.get("database.username").toString());
dataSource.setPassword(properties.get("database.password").toString());
//构建数据库事物方式
TransactionFactory transactionFactory = new JdbcTransactionFactory();
//创建数据库运行环境
Environment environment = new Environment("development",transactionFactory,dataSource);
//构建Configure对象
Configuration configuration = new Configuration(environment);
//注册别名
configuration.getTypeAliasRegistry().registerAlias("stu", Student.class);
//加入一个映射器
configuration.addMapper(StudentMapper.class);
//使用sqlsessionfactoryBuilder构建sqlsessionfactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
SqlSession sqlSession = sqlSessionFactory.openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = studentMapper.getStudents();
studentPrint(students);
两种方式对比
上面我强调了我们的StudentMapper.xml和StudentMapper.java要同名而且在同一位置上。这是为什么呢。因为在Mybatis源码中默认会读取Java对象同目录下的同名的xml文件作为sql配置文件。
但是后期我们项目的展开Java和xml会越来越多,放在一起的话很乱。作为一个框架不会这么局限的。在xml配置环境方式中我们是通过Mappers-->Mapper标签来注入我们的Mapper.xml的。这里的xml路径并没有要求在同一个目录。我们这里可以随意的改。上面的那些限制是在Java代码搭建环境的方式中。因为在Java代码方式中我们只是通过java对象注册mapper接口的。在这种方式下默认就会加载同目录下的同名xml
Mybatis结构
学习的过程就是认知的过程。接下来我们来认识下Mybnatis的核心组件吧。
SqlSessionFactoryBuilder : 根据xml(mybatis-config.xml)或者Java代码(代码方式)来生成SqlSessionFactory
SqlSessionFactory : 构建SqlSession
SqlSession : 既可以发送sql执行并返回结果,也可以获取Mapper接口
SQL Mapper : Mybatis独有的组件。有Java接口和xml文件构成的一个整体。负责将xml中的sql进行解析然后传递给数据库并获取结果
源码解读xml环境加载
- 因为范畴基础课程,这里对源码的跟踪点到为止(再深我也不会)。
- 在解析mybatis-config.xml标签这一块是重点。这一块会专门介绍各个标签解析及作用。文章留言或点赞让我们看到你们对这一块的喜爱。留言点赞多的会尽快出这一篇。
映射器解读
- 上面已经说了映射器是有Java+xml组合而成的Mybatis组件。我们上面的案例也展示了两者的编写。Java实际就是一个接口定义好方法。在xml中对应的标签带上我们的sql就行了。
- 圈出来的这条sql中我们会发现和我们平时的sql不一样。#{id}是Mybatis为我们提供的入参。在提交给数据库的时候会将真正的sql填充过来。这里还有一个注意点我们写的是select * 。因为数据库字段和我们实体属性是一样的。所以Mybatis就会自动把相同字段内容映射给实体了。这就实现了自动映射了。
- 之前说了和Hibernate相比,Mybatis属于半自动。如果我们的实体和数据库字段不一样了(注意驼峰和平峰在数据库通过设置可以认为是一样的。Mybatis也提供功能可以映射的。这里我们认为是一样的),我们可以通过
resultMap
来实现数据库字段和实体字段的映射。这就是我们所谓的半自动映射
Ibatis
- 虽然我们用Mybatis。但是Ibatis之前的方法还是保留下来的。这里提一下。但是不推荐使用的方式执行sql
# 加入战队
微信公众号
Mybatis精讲(一)---环境配置及架构梳理的更多相关文章
- Mybatis精讲(二)---生命周期
目录 回顾 SqlSessionFactoryBuilder SqlSessionFactory openSessionFromDataSource Executor SqlSession Mappe ...
- mybatis精讲(三)--标签及TypeHandler使用
目录 话引 XML配置标签 概览 properties 子标签property resource 程序注入 settings 别名 TypeHandler 自定义TypeHandler EnumTyp ...
- mybatis精讲(四)--ObjectFactory
目录 前言 mybatis的ObjectFactory 源码 setProperties create instantiateClass 使用场景 # 加入战队 微信公众号 前言 ObjectFact ...
- mybatis精讲(五)--映射器组件
目录 前言 标签 select insert|update|delete 参数 resultMap cache 自定义缓存 # 加入战队 微信公众号 前言 映射器之前我们已经提到了,是mybatis特 ...
- mybatis精讲(六)--二级缓存
目录 简介 配置 源码 CachingExecutor 自定义二级缓存 # 加入战队 微信公众号 简介 上一章节我们简单了解了二级缓存的配置.今天我们详细分析下二级缓存以及为什么不建议使用二级缓存. ...
- mybatis精讲(七)--动态sql
目录 常用标签 if元素 choose元素 trim元素 forearch bind元素 在我们传统的开发中我们会通过拼接sql达到数据库的操作.java中的拼接不仅效率低下而且代码很长不易维护.而M ...
- cocos2dx - android环境配置及编译
接上一节内容:cocos2dx - 伤害实现 本节主要讲Android环境配置及编译 在第一节中setup.py的配置里,我们没有配置对应的ndk,sdk,ant的路径,在这里需要先配置好环境变量. ...
- Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲
Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台: 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...
- Tomcat环境配置部署测试环境及架构
Tomcat环境配置已经在前面介绍过了,这边就为童鞋们介绍下对于Tomcat的架构是怎么样的! Tomcat的架构包含(bin.conf.lib.logs.temp.wenapps.work)等文件夹 ...
随机推荐
- B-经济学-基尼指数
目录 基尼指数 一.基尼指数简介 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/ni ...
- 重构网页过程中的小tips
1.display为inline-block的元素可以使用virtical-align:middle来使得元素垂直居中对齐 2.在一些按钮标签或者mark标签中,如果文本内容确定不会改变长度的话,可以 ...
- PowerBI系列之入门案例动态销售报告
本文将讲解如何从零开始使用PowerBI Desktop制作一份动态销售报告.帮助大家快速入门PowerBI Desktop的操作.我们先来看一下一份动态销售报告的构成. 1.左上角放置了小黎子数据分 ...
- 使用java语言实现一个动态数组(详解)(数据结构)
废话不多说,上代码 1.从类名开始(我真是太贴心了) public class Array<E> 首先数组类需要带有泛型,这个不多说.需要注意的是在java中,数组只能存放同一个类型的. ...
- [Luogu3420][POI2005]SKA-Piggy Banks
题目描述 Byteazar the Dragon has NNN piggy banks. Each piggy bank can either be opened with its correspo ...
- docker实验--redis集群搭建
背景介绍: 我经常在做一些小项目的时候,采用了Redis来做缓存,但是都是基于单节点的,一旦redis挂了,整个项目就挂了.于是乎,想到了多节点集群的方式来使用,就开始折腾着怎么去搭建这个集群.在网上 ...
- html、css、javascript之间的关系
网页主要由三部分组成: 结构( Structure) . 表现( Presentation) 和行为( Behavior)HTML —— 结构, 决定网页的结构和内容( “是什么”)CSS —— 表现 ...
- Go中http超时问题的排查
背景 排查 推测 连接超时 疑问 http2 解决超时 并发连接数 服务端限制 真相 重试 解决办法 问题1 背景 最新有同事反馈,服务间有调用超时的现象,在业务高峰期发生的概率和次数比较高.从日志中 ...
- 小白学 Python(10):基础数据结构(列表)(下)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- LeetCode 十月份题目汇总
开源地址:点击该链接 前言 十月份共有60道题目,全部属于 Easy 难度的,所以公众号中分享出来的并不多,只是挑了一些感觉还可以的才分享了出来,这60道题目我按照不同类别进行了分类整理,所有源码以及 ...