什么是MyBatis
在弄清楚什么是MyBatis之前,我们首先要搞清楚两个概念:什么是持久化?什么是持久层?
持久化(Persistence)
持久化是将程序数据在持久状态和瞬时状态间转换的机制。通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。
通常来说临时数据就是我们储存在内存里面的数据,而内存的数据无法永久的保存,一旦断电数据就会丢失。这些数据又非常的重要,例如我们的用户信息,订单信息等。持久化就是要将这些临时数据永久的保存下来。
而持久化的方法有很多,在通常的开发中,我们可以将其保存到数据库或是通过IO将其保存到文件内。
持久层
在Java开发中,通常会把一个项目分为持久层、业务层和表现层。
表现层基于业务层所提供的接口,实现了一定的页面展示、请求的接收与分发;而业务层又通过持久层所提供的接口,实现了一定的业务逻辑操作;而持久层则是将业务层中的一些重要数据永久的保存下来,并在需要的时候将它们读取出来,并以一定的形式返回到业务层中。
在这里额外拓展一下DAO与DAL的区别:
- DAO(Data Access Object)侧重ORM对象关系映射,DAO曾往往提供的是ORM操作。
- DAL(Data Access Layer)多用于分布式系统
- 分布式系统提供水平伸缩能力,应用层水平扩展后,会使数据库连接资源相对较少成为瓶颈,此时需要对数据库分库、分表,DAL要求支持透明分库分表,DAL层提供的往往是SQL
我个人理解则是DAO侧重于对象与持久数据关系映射,在所使用过的工具里,我觉得Django
框架对数据的操作非常符合这一个描述,我几乎不选要考虑SQL语句。而DAL侧重于灵活性,可以自定义所需要的SQL语句,当然这需要对SQL以及数据库有一定的基础。
MyBatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
在官方文档的简介中已经有了说明,MyBatis 是一款优秀的持久层框架,支持自定义 SQL、存储过程以及高级映射。且MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。这将大大地提高了我们的工作效率,同时也避免了使用 JDBC 不当导致的大量冗余的代码,不仅影响效率,也使代码整体看起来不够美观。
MyBatis的初步使用
在使用MyBatis之前,我们需要做一些准备工作。
环境搭建
在这里先列出我使用的一些主要的环境
- JDK1.8
- MySQL 8.0.12
- maven 3.6.3
- IDEA 2020.1.2
数据库的搭建:
1 | CREATE DATABASE `mybatis`; |
获取MyBatis
使用IDEA创建一个普通的maven项目,把MyBatis的依赖添加进去:
1 | <dependency> |
另外也可以从GitHub上获取到MyBatis,下载jar包并添加到项目lib中:
下面列举出我自己的Demo项目所依赖的文件供大家参考:
1 | <dependencies> |
第一个MyBatis程序
环境的工作准备好后就可以逐步来构造我们的第一个MyBatis程序了。
MyBatis的核心配置
在resource
文件夹下新建一个xml配置文件,命名为mybatis-config.xml
,并往文件内填充以下内容,并修改你的数据库连接信息:
1 |
|
编写MyBatis工具类
新建一个MyBatis工具类,以方便我们后续的使用
1 | public class MyBatisUtils { |
在这对该工具类做一点解释:
resource
的内容为我们上一个步骤所创建的核心配置文件的地址,因为我们将其放在了resource
根目录下,故只需要填入它的文件名就可以了- 通过
getResourceAsStream
方法获取到输入流,并将其作为参数传入到SqlSessionFactoryBuilder
中 - 框架内会通过
XMLConfigBuilder
解析到配置文件的内容,并生成一个Configuration
对象 - 框架最后则将
sqlSessionFactory
返回
具体代码的编写
首先编写一个实体类
1
2
3
4
5
6
7
8
public class User {
private int id;
private String name;
private String pwd;
}这里使用
lombok
偷一下懒,用它来生成一些Getter、Setter、Constructor、toString等方法,当然,在正式的项目里还是不建议大家使用的Mapper接口
1
2
3public interface UserMapper {
List<User> getUserList();
}Mapper配置文件
1
2
3
4
5
6
7
8
9
10
<mapper namespace="com.hpjpw.dao.UserMapper">
<select id="getUserList" resultType="com.hpjpw.pojo.User">
select *
from mybatis.user;
</select>
</mapper>在
mybatis-config.xml
注册Mapper配置文件1
2
3
4
5
6
7
8<configuration>
<environments default="development">
……
</environments>
<mappers>
<mapper resource="com/hpjpw/dao/UserMapper.xml"/>
</mappers>
</configuration>测试
1
2
3
4
5
6
7
8
9try (SqlSession sqlSession = MyBatisUtils.getSqlSession()) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
}输出:
1
2
3User{id=1, name='狂神', pwd='123456'}
User{id=2, name='张三', pwd='123456'}
User{id=3, name='李四', pwd='123890'}在测试中,我们使用
getMapper
方法获取到UserMapper
类的对象,并调用其getUserList
方法获取到了User的列表总结
- 在第三步的Mapper配置文件中的namespace需要与你的Mapper接口类的完整包名相同,否则有可能会出现错误
- 若跳过第四步,则框架会提示你所用到的UserMapper没有注册,且抛出异常,停止执行。
CURD
select
选择,查询语句;
- id : 就是对应的namespace中的方法名;
- resultType:Sql语句执行的返回值!
- parameterType : 参数类型!
未完待续
……
感谢
感谢BiliBili的UP主【遇见狂神说】所录制的MyBatis教程,讲解的非常细致,个人感觉比黑马的视频教程好多了,在这里安利给大家:【狂神说Java】Mybatis最新完整教程IDEA版通俗易懂。
本篇文章是基于该视频教程,结合我自己的理解,把一些重点的内容展现出来,希望可以帮助到需要的小伙伴。