Java零基础-Mybatis篇

本文详细介绍了Java开发中Mybatis框架的作用、优势及如何学习框架以提高开发效率和代码质量。从Mybatis的基本概念和ORM思想出发,逐步讲解了Mybatis的入门配置、CRUD操作、核心配置文件解析、映射配置文件详解,以及日志、缓存、动态SQL等关键特性。此外,还探讨了Mybatis在多表查询、注解使用和逆向工程等方面的应用,是Java开发者学习Mybatis的全面指南。
摘要由CSDN通过智能技术生成

文章目录

1.JDBC不足

JDBC作为Java操作数据库的模板,如果想要对数据库进行操作,必须使用JDBC,但是在使用JDBC进行数据库操作时,重复代码多,动态SQL构建繁琐,将查询结果转化为对象,相当麻烦,开发效率低。

基于JDBC开发效率相对低的情况,市面上各个组织,对JDBC进行封装,产生各种数据库操作层解决方案:

Hibernate 重量级的ORM框架

ibatis 轻量级ORM框架 与2010-06-16 改名 mybatis

Spring JPA

Mybatis plus

Spring JDBCTemplate

以上框架都是对JDBC的封装,处理Java操作数据库数据的问题。

2.为什么要学习框架

2.1.1 提高开发效率

在Java中,框架在一定程度就是对某些功能的封装,对外暴露统一操作API,可以简化开发难度,提高开发效率。

2.1.2 提高代码的可维护性

由于框架在一定程度上说,就是模板,所有基于某个框架进行开发的项目,肯定要遵循模板规则,那么在维护时,只需要了解模板规则即可。

2.1.3 可以提高代码的健壮性

市面上相对比较流行的框架,被大多人使用,出现的问题能够及时暴露,问题也能得到较快的修复。

3.Mybatis概述

3.1 简介

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

Mybtais是一个ORM框架,轻量级的ORM框架。相对于重量级的ORM框架Hibernate而言,mybatis是一个半自动框架,而Hibernate是一个全自动框架。并且,Hibernate提出跨"平台",Hinernate的跨平台是指Hinernate可以在多种数据库下进行操作,同一套代码支持多种数据库,HQL语句,Hibernate方言,对数据库操作进行翻译,根据不同的数据,将API翻译成不同的SQL,对数据进行操作,依赖ORM思想。

Mybatis是一个半自动的框架,早期Hibernate在流行时,开发者发现Hibernate虽然功能强大,但是由于如果想使用全自动功能,将Hibernate和数据库关心进行配置,配置很繁琐,其二,Hibernate对功能进行全方面的封装,将用户的操作,转化为SQL语句,然后进行数据库操作,整个转换过程是Hibernate,开发无法控制,如果要进行SQL语句优化是没法实现的。所以,在数据库压力逐渐增大的情况下,Hibernate框架性能问题就出现了。基于这样的情况,Mybatis框架应运而生,mybatis将SQL语句的定义控制权,完全交给了开发者,并且暴露一套API,对JDBC中:事务,参数,查询结果等进行配置处理。Mybatis也是基于ORM思想.

Mybatis(半自动化):还是需要书写sql

Hibernate(全自动化):不需要写sql就能操作数据库—>HQL

3.2 ORM

ORM : Object relation mapping

对象关系映射

将数据库信息和Java中实体类进行映射

users: 1 张三 20 User: id、uName、age

4.Mybatis入门使用

在这里插入图片描述

4.1 创建数据库和表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2 创建空项目

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.3 创建Maven的java项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.4 引入Mybatis相关jar包依赖

1、导入依赖

2、书写mybatis的主配置文:连接信息 mybatis.xml

3、书写存放sql语句的局部配置文件 xxx.xml(与dao层类的类名保持一致)

4、关联主配置与局部配置

5、启动mybatis,调用核心类测试

<dependencies>
    <!--引入mybatis的依赖-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    <!--引入mysql的驱动包-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.49</version>
    </dependency>
</dependencies>

4.5 编写实体类User

package com.bjpowernode.domain;
import java.util.Date;

/**
 * @项目 code-mybatis
 * @描述 用户实体类
 * @时间 2021-07-15 22:23
 **/
public class User {
   
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private String address;
    private Date birth;

    public User(Integer id, String name, Integer age, String sex, String address, Date birth) {
   
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.address = address;
        this.birth = birth;
    }

    public User(String name, Integer age, String sex, String address, Date birth) {
   
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.address = address;
        this.birth = birth;
    }

    public User() {
   
    }

    public Integer getId() {
   
        return id;
    }

    public void setId(Integer 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;
    }

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

    public Date getBirth() {
   
        return birth;
    }

    public void setBirth(Date birth) {
   
        this.birth = birth;
    }

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

4.6 编写映射文件UserMapper接口

package com.bjpowernode.mapper;
import com.bjpowernode.domain.User;

import java.util.Map;

public interface UserMapper {
   
    /**
     * 根据ID查询 返回 Map
     * @param id
     * @return
     */
    Map<String,Object> queryById1(Integer id);

    /**
     * 根据ID查询  返回 自定义对象
     * @param id
     * @return
     */
    User queryById2(Integer id);
}

4.7 编写映射文件UserMapper.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.bjpowernode.mapper.UserMapper">
    <select id="queryById1"  resultType="java.util.Map">
        select * from user where id = 1
    </select>

    <select id="queryById2" resultType="com.bjpowernode.domain.User">
        select * from user where id = 1
    </select>
</mapper>

4.8 编写mybatis.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 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/test?useUnicode=true&useSSL=false&characterEncoding=UTF8&serverTimezone=UTC" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

4.9 编写测试类

public class Test {
   
    public static void main(String[] args) throws Exception {
   
        //1.引入配置文件
        String config =  "mybatis.xml";
        InputStream in = Resources.getResourceAsStream(config);
        //2.解析配置文件 构建 SqlSession 构建对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //3.使用构建对象构建 SqlSessionFactory 对象  创建Sql会话对象  程序和数据库进行SQL会话对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
        //4.创建一个具体的SqlSession 对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //5.进行数据库具体sql会话
        User user = sqlSession.selectOne("com.example.mapper.UserMapper.queryById2",1);
        System.out.println(user);
        //6.关闭会话
        sqlSession.close();
    }
}

4.10 执行过程简单分析

1.解析了xml 配置文件 —> configuration

  1. 将映射文件信息 解析 mappedStatements map结构 每个 mapper文件中的指令 被封装为MappedStatement

  2. SqlSession 根据传入 statement 的key 从mappedStatements 中获取到对应 MappedStatement

  3. MappedStatement 中已经定义了好了参数类型 返回结果的类型 还有原生sql

  4. 获取原生sql 参数类型 返回结果的类型 ,根据参数类型 原生sql 可以内部预处理 sql 将sql 发送给数据库

  5. 接收sql 执行的结果 ,将其封装为对应的返回类型
    在这里插入图片描述

5.Mybatis进行CRUD

5.1 方式 一:指令ID方式

根据mybatis将映射信息封装为:MappedStatement对象,存在Map中,将namespace和指令ID当做key

根据key获取对应MappedStatement对象,进行数据库操作

5.1.1 创建项目修改pom.xml引入相关依赖

在这里插入图片描述

<dependencies>
    <!--引入mybatis的依赖-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.6</version>
    </dependency>
    <!--引入mysql的驱动包-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.22</version>
    </dependency>
</dependencies>
5.1.2 复制上个项目里面的所有类和配置

在这里插入图片描述

5.1.3 SqlSessionUtils工具类
/**
 * 创建SqlSession的工具类
 */
public class SqlSessionUtils {
   
    private static final SqlSessionFactory sqlSessionFactory ;

    static {
   
        //配置文件
        String config = "mybatis.xml";
        //将配置文件转化为流对象
        InputStream in = null;

        //创建SqlSessionFactory的构建对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = null;

        try {
   
            //将配置文件转化为流对象
            in = Resources.getResourceAsStream(config);
            //创建SqlSessionFactory的构建对象
            sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        } catch (IOException e) {
   
            e.printStackTrace();
        }
        //通过配置信息 构建 SqlSessionFactory工厂
        sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
    }
    /**
     * 获取SQL会话对象
     * @return
     */
    public  static SqlSession getSession(){
   
        return  sqlSessionFactory.openSession();
    }
}
5.1.4 数据库数据操作类UserDao
package com.bjpowernode.dao;

import com.bjpowernode.domain.User;
import com.bjpowernode.utils.SqlSessionUtils;
import org.apache.ibatis.session
  • 15
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值