mybatis-01 Mybatis概述与入门
mybatis-01 mybatis概述与入门
1 简介
1.1 什么是MyBatis
![](https://img2020.cnblogs.com/blog/2416903/202110/2416903-20211008140855826-632564080.png)
-
Mybatis 中文官网:https://mybatis.org/mybatis-3/zh/index.html
-
MyBatis 是一款优秀的持久层框架
-
它支持自定义 SQL、存储过程以及高级映射
-
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
-
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java pojo(Plain Old Java Objects,普通老式 Java 对象)成为数据库中的记录。
-
MyBatis 本是 apache 的一个开源项目iBatis, 2010年这个项目由 apache software foundation 迁移到了google code,并且改名为 MyBatis。2013年11月迁移到Github。
获取Mybatis
-
maven:https://mvnrepository.com/artifact/org.mybatis/mybatis
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupid>org.mybatis</groupid> <artifactid>mybatis</artifactid> <version>3.5.7</version> </dependency>
1.2 持久化
数据持久化
- 数据持久化就是将 内存中的数据模型转换为存储模型,以及将存储模型转换为内存 中的数据模型的统称
- 狭义的理解:“持久化”仅仅指把域对象永久保存到数据库中
- 广义的理解:“持久化”包括和数据库相关的各种操作
- 保存:把域对象永久保存到数据库。
- 更新:更新数据库中域对象的状态。
- 删除:从数据库中删除一个域对象。
- 加载:根据特定的 OID,把一个域对象从数据库加载到内存。
- 查询:根据特定的查询条件,把符合查询条件的一个或多个域对象从数据库加载内在存中。
为什么要持久化?
持久化技术封装了数据访问细节,为大部分业务逻辑提供面向对象的API。
- 通过持久化技术可以减少访问数据库数据次数,增加应用程序执行速度;
- 代码重用性高,能够完成大部分数据库操作;
- 松散耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码
1.3 持久层
现在暂时理解成内存与硬盘之间沟通的桥梁就行了!
1.4 为什么需要持久层
- 方便
- 传统的 JDBC 代码太过复杂
- 使用框架进行简化
- 优点
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个 jar 文件 + 配置几个 sql 映射文件;易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis 不会对应用程序或者数据库的现有设计强加任何影响。 sql 写在 xml 里,便于统一管理和优化。通过 sql 语句可以满足操作数据库的所有需求。
- 解除 sql 与程序代码的耦合:通过提供 DAO 层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql 和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的 orm(对象关系映射 Object Relational Mapping) 字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供 xml 标签,支持编写动态 sql(if、while、for等特性加持)
2 快速入门
- 搭建环境
- 导入 Mybatis
- 编写代码
- 测试
2.1 搭建环境
数据库先准备好
CREATE DATABASE mybatis;
use mybatis;
CREATE TABLE `user`(id int(20) not null,
name varchar(30) DEFAULT null,
pwd varchar(30) DEFAULT null,
PRIMARY key(id))
ENGINE=INNODB DEFAULT charset = utf8;
INSERT INTO user VALUES
(1, 'ermao', '123456'),
(2, 'sanmao', '123456'),
(3, 'simao', '123456');
创建 Maven 项目
导入依赖:
<dependencies>
<!-- mysql 驱动 -->
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
<version>5.1.46</version>
</dependency>
<!-- mybatis 依赖-->
<dependency>
<groupid>org.mybatis</groupid>
<artifactid>mybatis</artifactid>
<version>3.5.7</version>
</dependency>
<!-- junit 单元测试 -->
<dependency>
<groupid>junit</groupid>
<artifactid>junit</artifactid>
<version>4.12</version>
</dependency>
</dependencies>
2.2 配置
先在 resources 文件里面新建一个连接数据库的 xml 文件,取名为 mybatis-config.xml,注意!!!由于是 xml 文件,存储在 url 里面的&
需要通过 &
转义得到!
<!--?xml version="1.0" encoding="UTF-8" ?-->
<configuration>
<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?&useSSL=true&useUnicode=true&characterEncoding=utf8">
<property name="username" value="root">
<property name="password" value="wal14.">
</property></property></property></property></datasource>
</transactionmanager></environment>
</environments>
<mappers>
<mapper resource="com/ermao/dao/UserMapper.xml">
</mapper></mappers>
</configuration>
编写 mybatis 工具类,在这里我们通过 sqlSessionFactory 来获取 SqlSession 对象:
/**
* @author Ermao
* Date: 2021/7/17 9:23
* Mybatis 工具类
*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 获取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 命令所需的所有方法。
* 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
* @return SqlSession
*/
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
2.3 编写代码
实体类
package com.ermao.pojo;
/**
* @author Ermao
* Date: 2021/7/17 9:32
*/
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
DAO接口
public interface UserDAO {
List<user> getUserList();
}
接口实现也就是我们的 xml 文件(注意如果要写中文注释的话就把UTF-8改成UTF8,否则 xml 文件有可能会报错)一般一同放置在 dao 文件下,就像这样:
与之前的接口实现类等价。因为是 xml 文件,所以要在 pom 文件中配置以打包这个文件,否则可能会出现找不到这个 xml 文件的情况(要注意注释中的 namespacce):
<!--?xml version="1.0" encoding="UTF-8" ?--> <!--改成UTF8-->
<!--namespace 绑定一个对应的dao/mapper接口,一定要保证一致-->
<mapper namespace="com.ermao.dao.UserDAO">
<!-- id 对应接口中的方法名称-->
<select id="getUserList" resulttype="com.ermao.pojo.User">
select * from mybatis.user
</select>
</mapper>
<!-- 在pom.xml文件中-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
也可以将其放在 resources 目录下,就像这样,但是,要保证,前置限定名完全一致,这样项目在编译导出的时候就会把接口文件和 xml 文件输出到同一个文件夹下,就像这样:
可以看到接口文件和 xml 文件是完全对齐的,编译导出后会是这个样子(不好意思,编译导出失败了qwq),排查后发现忘了将 resources 设置成资源目录,可以通过右击文件夹设置:
或者是在项目设置中配置,用 ctrl + shift + alt + s 快速打开项目设置,并按照以下顺序配置:
别忘记 apply !!!
2.4 测试
@Testpublic void test01() { SqlSession sqlSession = MybatisUtils.getSqlSession(); // 可以看到这里似乎是一种代理的设计思想 UserDAO mapper = sqlSession.getMapper(UserDAO.class); List<user> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); }}
运行结果:
User{id=1, name='ermao', pwd='123456'}User{id=2, name='armao', pwd='123456'}User{id=3, name='crmao', pwd='123456'}User{id=4, name='张三', pwd='999'}User{id=5, name='李三', pwd='8888'}
大功告成!