1.1 Mybatis 简介

文档介绍 mybatis – MyBatis 3 | 简介

说人话就是MyBatis是一个优秀的基于ORM的半自动轻量级持久层框架,它对jdbc的操作数据库的过程进行封装, 使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建 statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

原始的jdbc开发有一系列问题:

1、数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能

2、 sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变java 代码。

3、查询操作时,需要手动将结果集中的数据手动封装到实体中。

Mybatis的出现就是为了解决这些问题:

1、 使用数据库连接池初始化连接资源 。

2、将sql语句抽取到xml配置文件中 。

2、使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射。

1.2 了解ORM思想

ORM(Object Relational Mapping)对象关系映射。

mybatis采用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作 。

O(对象模型): 实体对象,即我们在程序中根据数据库表结构建立的一个个实体javaBean 。

R(关系型数据库的数据结构): 关系数据库领域的Relational(建立的数据库表) 。

M(映射): 从R(数据库)到O(对象模型)的映射,可通过XML文件映。

实现:

(1)让实体类和数据库表进行一一对应关系 先让实体类和数据库表对应 再让实体类属性和表里面字段对应 。

(2)不需要直接操作数据库表,直接操作表对应的实体类对象。

1.3 步骤分析

1、创建数据库及user表

2、创建maven工程,导入依赖(MySQL驱动、mybatis、junit)

3、编写User实体类

4、编写User接口

5、 编写UserMapper.xml映射配置文件(ORM思想)

6、编写SqlMapConfig.xml核心配置文件 数据库环境配置 映射关系配置的引入(引入映射配置文件的路径)

7、编写测试代码

​ 1.加载核心配置文件

​ 2.获取sqlSessionFactory工厂对象

​ 3.获取sqlSession会话对象

​ 4.执行sql

​ 5.打印结果

​ 6.释放资源

2.1 代码实现

2.1.1、创建user数据表

CREATE DATABASE `mybatis_db`;
USE `mybatis_db`;
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性别',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'小离
','2021-10-18 00:00:00','男','湖北武汉'),(2,'小红','2021-10-18 00:00:00','女','湖北武汉');

2.1.2 导入Maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.itxiaoli</groupId>
    <artifactId>mybatis_quickstart</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--指定编码和版本-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>


    <dependencies>
        <!--mybatis坐标-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
        </dependency>
        <!--mysql驱动坐标-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--单元测试坐标-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>
</project>

2.1.3 编写User实体类

package cn.itxiaoli.domain;

import java.util.Date;

/**
 * @Author XiaoLi
 * @Date 2021/10/18 0:57
 */
public class User {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

2.1.4 编写UserDao接口

package cn.itxiaoli.dao;

import cn.itxiaoli.domain.User;

import java.util.List;

/**
 * @Author XiaoLi
 * @Date 2021/10/18 2:15
 */
public interface UserDao {
    /**
     * 查询所有信息
     * @return List<User>
     * */
    List<User> findAll();
}

2.1.5 编写UserMapper映射文件

<?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属性:在Mybatis全局范围内找到一个具体的Mapper配置 -->
    <!--namespace是用于绑定Dao接口的,即面向接口编程。当你的namespace绑定接口后,就可以不用写接口实现类,Mybatis会通过该绑定自动找到对应要执行的SQL语句-->
<mapper namespace="cn.itxiaoli.dao.UserDao">
    <!-- 编写具体的SQL语句,使用id属性唯一的标记一条SQL语句 -->
    <!-- resultType属性:返回结果类型(自动映射封装)指定封装查询结果的Java实体类的全限定名 -->
    <select id="findAll" resultType="cn.itxiaoli.domain.User">
        select * from  user
    </select>
</mapper>

2.1.6 编写 SqlMapConfig.xml 配置文件

<?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>
    <!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 -->
    <environments default="development">
        <!-- environment表示配置Mybatis的一个具体的环境 -->
        <environment id="development">
              <!-- Mybatis的内置的事务管理器 -->
            <transactionManager type="jdbc"/>
              <!-- 使用连接池 -->
            <dataSource type="POOLED">
                <!-- 建立数据库连接的具体信息 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!-- useSSL=false MySQL在高版本需要指明是否进行SSL连接  -->
                <property name="url" value="jdbc:mysql://192.168.113.1:3306/mybatis_db?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    
    <!--加载映射配置-->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>
1. 其中,事务管理器(transactionManager)类型有两种:
    - JDBC:
        这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
    - MANAGED:
        这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。
        例如:mybatis与spring整合后,事务交给spring容器管理。
2. 其中,数据源(dataSource)常用类型有三种:
    - UNPOOLED:
        这个数据源的实现只是每次被请求时打开和关闭连接。
    - POOLED:
        这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。
    - JNDI :
        这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据
源,然后放置一个 JNDI 上下文的数据源引用

2.1.7 根据文档编写测试类(MybatisTest)

package cn.itxiaoli.test;

import cn.itxiaoli.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @Author XiaoLi
 * @Date 2021/10/18 1:33
 */

public class MybatisTest {
    @Test
    public void test() throws IOException {
        // 加载核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        // 获取SqlSessionFactory工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        // 获取SqlSession会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 执行sql sqlSession.selectList()方法的参数为 sqlSession.selectList("namespace.id")
        List<User> users = sqlSession.selectList("cn.itxiaoli.dao.UserDao.findAll");
        // 遍历打印
        for (User u : users) {
            System.out.println(u);
        }
        // 释放资源
        sqlSession.close();
    }
}

2.1.8 总体结构

2.1.9效果

版权属于:it小离

本文链接: https://www.itxiaoli.cn/archives/MybatisDetail.html

版权声明:本站文章采用 署名-非商业性使用-相同方式共享 4.0

最后修改:2021 年 10 月 20 日 02 : 00 AM
如果觉得我的文章对你有用,请随意赞赏