Mybatis入门 (思路清晰、轻松上手、并配有关键点解读)

2022-12-02 15:21:06 浏览数 (1)

一、Mybatis简介

MyBatis 是一款优秀的半自动的ORC持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。


二、框架搭建(3板斧)

只需要通过如下几个步骤,即可基于Mybatis框架快速开发

  1. 添加maven依赖
  2. 添加全局配置文件
  3. 添加dao层接口和对应的xml映射文件

1板斧. 添加Maven依赖

mybatis和mysql的jar包

代码语言:javascript复制
	<dependency>
	  <groupId>org.mybatis</groupId>
	  <artifactId>mybatis</artifactId>
	  <version>3.5.3</version>
	</dependency>
	<dependency>
	  <groupId>mysql</groupId>
	  <artifactId>mysql-connector-java</artifactId>
	  <version>5.1.47</version>
	</dependency>

2板斧. 添加全局配置文件

配置文件惯例放在resources目录下,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。数据库名my-test替换成你的.

代码语言:javascript复制
	<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/my-test?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8"/>
	                <property name="username" value="root"/>
	                <property name="password" value="root"/>
	            </dataSource>
	        </environment>
	    </environments>
	    <mappers>
	        <mapper resource="com/tiangang/dao/mapper/UserMapper.xml"/>
	    </mappers>
	</configuration>

3板斧. 添加dao层代码和xml映射文件

1). java*daomapper 放dao层对外提供的方法

2). resources*daomapper 放dao层提供的方法的xml映身文件, 与1)对应

3). java*daopo 放dao层的数据实体类

编写接口

Mapper接口,就是我们在dao层提供增删改查的接口,注意是接口,为什么是接口?就是因为实现类我们是通过xml实现的动态代理类, 后面会详细说明.

代码语言:javascript复制
	public interface UserMapper {
	    User selectById(@Param("id") int id);
	}

编写接口映射文件UserMapper.xml

Mapper接口对应的xml映射文件,注意是放在resources目录下,与UserMapper.javapackage包路径相同,从而实现代码和sql语句分离。注意id="selectById接口的方法名selectById一一对应

代码语言:javascript复制
<?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.tiangang.dao.mapper.UserMapper">
    <select id="selectById" resultType="com.tiangang.dao.po.User" >
        select * from user where id = #{id}
    </select>
</mapper>

PO数据对象

PO对象是指与mysql数据库表对应的数据库对象。

代码语言:javascript复制
public class User {
    private Long id;
    private String name;
    private Integer age;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{"  
                "id="   id  
                ", name='"   name   '''  
                ", age="   age  
                '}';
    }
}

三. 调用4步走

非常细的4步来阐述一次查询的流程

代码语言:javascript复制
public class MybatisApplication {
    public static void main(String[] args) throws IOException {
        // 1. 得到SqlSessionFactory
        String resource = "mybatis-config.xml";
        Reader reader = Resources.getResourceAsReader(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        // 2. 得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            // 3. 得到具体Mapper
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 4. 执行业务代码:各种的增删改查
            User user = mapper.selectById(1);
            System.out.println(user);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }
    }
}

四、解读

1. 关键词说明(重点)

在代码中出现3个Mybatis的关键类,分别是:SqlSession、SqlSessionFactory、SqlSessionFactoryBuilder,这几个类中有个关键词我的理解如下:

  • Session 是指一次会话,即一个线程一个会话
  • Factory结尾 设计模式中的工厂模式,说明SqlSessionFactory是生产SqlSession的工厂
  • Builder结尾 设计模式中的构造者模式,说明SqlSessionFactoryBuilder是用来构造SqlSessionFactory的

2. 作用域(Scope)和生命周期(重点)

  • SqlSessionFactoryBuilder 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
  • SqlSessionFactory SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 因此 SqlSessionFactory 的最佳作用域是应用作用域(比如使用单例模式)。
  • *SqlSession 每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。

五. 程序运行结果

运行MybatisApplication.main,输出以下结果,大功告成!


六、使用环境

本文基于

  • JDK:1.8
  • Maven: 3.6.3
  • Mysql: 5.7 安装教程

mysql测试表

代码语言:javascript复制
CREATE TABLE `user`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `age` tinyint(1) UNSIGNED NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
insert into `user` VALUES (1,'天罡gg',18);

七. 完整源码下载

https://download.csdn.net/download/scm_2008/86502771


0 人点赞