Loading

mybatis-01 Mybatis概述与入门

mybatis-01 mybatis概述与入门

1 简介

1.1 什么是MyBatis


  • 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


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 快速入门

  1. 搭建环境
  2. 导入 Mybatis
  3. 编写代码
  4. 测试

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 文件下,就像这样:

image-20211008134144933

与之前的接口实现类等价。因为是 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 文件输出到同一个文件夹下,就像这样:

image-20211008134651299

可以看到接口文件和 xml 文件是完全对齐的,编译导出后会是这个样子(不好意思,编译导出失败了qwq),排查后发现忘了将 resources 设置成资源目录,可以通过右击文件夹设置:

image-20211008135747287


或者是在项目设置中配置,用 ctrl + shift + alt + s 快速打开项目设置,并按照以下顺序配置:

image-20211008140017200

别忘记 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'}

大功告成!

posted @ 2021-10-08 14:10  槐下  阅读(55)  评论(0编辑  收藏  举报