Mybitis介绍和快速搭建(保姆级)

292 阅读3分钟

Mybitis介绍和快速搭建

1 什么是Mybatis

1.1 MyBatis简介

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

优点:

1、与JDBC相比,减少了50%的代码量

2、最简单的持久化框架,简单易学

3、SQL代码从程序代码中彻底分离出来,可以重用

4、提供XML标签,支持编写动态SQL

5、提供映射标签,支持对象与数据库的ORM字段关系映射,支持缓存、连接池、数据库移植....

缺点:

1、SQL语句编写工作量大,熟练度要高

2、数据库移植性比较差,如果需要切换数据库的话,SQL语句会有很大的差异

1.2 JDBC简单回顾

JDBC(Java Data Base Connection,java数据库连接)是一种用于执行 SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言 编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口, 使数据库开发人员能够编写数据库应用程序

image.png

优点:运行期:快捷、高效

缺点:编辑期:代码量大、繁琐异常处理、不支持数据库跨平台

1.2.1JDBC核心api

1.DriverManger 连接数据

2.Connection 连接数据库的抽象

3.Statement 执行Sql

4.ResultSet 数据结果集

2 快速搭建Mybatis

2.1 导入Mybatis

2.1.1.直接下载mybatis的jar包,并放置到项目的classpath路径中

jar包下载地址

2.1.2 通过maven导入,将mybatis的依赖代码置于 pom.xml 文件中

mybatis各版本依赖代码查询

还需要导入mysql-connector 的包。

mysql-connector各版本依赖代码

版本选择:官方兼容说明

Connector/J 5.1 提供与 MySQL 的所有功能的兼容性,包括 5.6、5.7 和 8.0。

Connector/J 8.0 提供与 MySQL 5.6、5.7 和 8.0 的所有功能的兼容性。

image.png

2.2 创建mybatis全局配置文件

<?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 default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/EmpMapper.xml"/>
    </mappers>
</configuration>

2.3 创建数据库表

这里因为演示就简单创建一个emp表

image.png

2.4 在java中创建emp表对应的pojo(entity)类

package com.lingyue.pojo;

/**
 * @author 和悦
 * @date 2021/10/13 22:04
 */
public class Emp {
    private Integer id;
    private String username;

    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;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", username='" + username + ''' +
                '}';
    }
}

2.5创建对应的mappper.xml

<?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.lingyue.pojo.EmpMapper">


    <select id="selectEmp" resultType="com.lingyue.pojo.Emp">
        select * from Emp where id = #{id}
    </select>
</mapper>

2.6写一个测试类测试一下sql

/**
 * @author 和悦  vx:lingyuefh
 * @date 2021/10/13 22:43
 */
public class MybatisTest {


    SqlSessionFactory sqlSessionFactory;

    /**
     * 创建sqlSessionFactory
     * @throws IOException
     */
    @BeforeAll
    public void before() {
        String resource = "mybatis.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    /**
     * 基于statementId的方式去执行sql
     * @throws IOException
     */
    @Test
    public void testMybatis()  {

        try (SqlSession session = sqlSessionFactory.openSession()) {
            Emp emp = (Emp) session.selectOne("com.lingyue.pojo.EmpMapper.selectEmp", 1);
            System.out.println("基于statementId的方式去执行sql,emp:"+emp);
        }
    }
}

image.png

2.7基于mapper接口实现

2.7.1添加mapper接口

/**
 * @author 和悦  vx:lingyuefh
 * @date 2021/10/13 22:54
 */
public interface EmpMapper {

    /**
     * 根据id查询Emp实体
     * xml方式
     * @param id
     * @return
     */
    Emp selectEmp(Integer id);
}

2.7.2修改EmpMapper.xml的namespace

修改前

<mapper namespace="com.lingyue.pojo.EmpMapper">

修改后

<mapper namespace="com.lingyue.mapper.EmpMapper">

注意:EmpMapper.xml和EmpMapper需要放在相同层级的包下

image.png

2.7.3添加mybatis的配置文件里mapper的接口(resource要删掉)

<mappers>
    <!--<mapper resource="EmpMapper.xml"/>-->
    <mapper class="com.lingyue.mapper.EmpMapper"></mapper>
</mappers>

2.7.4测试一下

/**
 * 基于接口绑定的方式(xml)
 * 方法步骤:
 *   1.新建mapper接口
 *   2.添加mapper中的对应方法
 *        注意:sql中参数要在方法中声明
 *   3.添加mybatis全局配置文件中的mapper接口
 */
@Test
public void testMybatis2(){
    try (SqlSession session = sqlSessionFactory.openSession()) {
        EmpMapper empMapper = session.getMapper(EmpMapper.class);
        Emp emp = empMapper.selectEmp(1);
        System.out.println("基于接口绑定的方式(xml),emp:"+emp);
    }
}

image.png

2.8用注解来写sql(可以和xml共存)

2.8.1注解

/**
 * @author 和悦  vx:lingyuefh
 * @date 2021/10/13 22:54
 */
public interface EmpMapper {

    /**
     * 根据id查询Emp实体
     * @param id
     * @return
     */
    @Select("SELECT * FROM emp WHERE id = #{id}")
    Emp selectEmp(Integer id);
}

2.8.2测试一下

/**
 * 基于接口绑定的方式(注解)
 */
@Test
public void testMybatis3(){
    try (SqlSession session = sqlSessionFactory.openSession()) {
        EmpMapper empMapper = session.getMapper(EmpMapper.class);
        Emp emp = empMapper.selectEmp2(1);
        System.out.println("基于接口绑定的方式(注解),emp:"+emp);
    }
}

image.png