Mybatis入门到入坟 一站式基础及进阶——囊括面试点与初学基础框架分析——从0到1 不会私我 我手把手教你

Posted 猿小付

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis入门到入坟 一站式基础及进阶——囊括面试点与初学基础框架分析——从0到1 不会私我 我手把手教你相关的知识,希望对你有一定的参考价值。

📖本篇内容:Mybatis入门到入坟一站式基础——囊括面试点与初学基础、框架分析

📆 最近更新:2022年1月11日 MySQL的最全常用SQL语句 —— 一文可以快速熟悉、回忆sql语句

🙊个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 关爱程序猿,从你我做起

本文目录

Mybatis入门到入坟一站式基础

写在前面

哇咔咔,小付又来了哦~今天给大家整理的是关于SSM中Mybatis框架的入门到入坟的基础夯实学习资料, 这次是小付二刷的经历过往,耗时也不算太多,更加坚固了基础知识的掌握的同时,也深刻理解了,Mybatis部分底层源码实现的工作流程,感谢各位支持,但我希望这篇文章能带给你们更多的是知识的查缺补漏,以及对框架的熟练掌握,加油xdm,冲冲冲~!

1、什么是Mybatis

Mybatis介绍

Mybatis介绍

Mybatis是一款优秀的持久化框架:

  • 它支持定制化 SQL、存储过程以及高级映射。
  • MyBatis 避免了几乎所有的JDBC 代码手动设置参数以及获取结果集
  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录

ORM是什么?

orm是什么?

ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。

Mybatis的优缺点

优点:

  • 基于SQL语句进行编程,较为灵活,可以定制化SQL语句
  • 因为SQL写在了xml文件当中,解除了数据持久化与代码程序的耦合性便于管理
  • 相较于JDBC降低了代码冗余的同时,也不用手动关闭连接,从而浪费资源
  • 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护
  • 能够与Spring很好的集成,都属于非侵入式框架。

缺点:

  • SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求,你会体验到写高中作文的感受。
  • SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

Hibernate 和 MyBatis 的区别

共同点:

  • 都对JDBC进行了封装,同时都是持久化层开发的框架,都用于DAO层的开发

不同点:

  • 映射关系
    • MyBatis 是一个半自动映射的框架,配置Java对象与sql语句执行结果的对应关系,多表关联关系配置简单
    • Hibernate 是一个全表映射的框架,配置Java对象与数据库表的对应关系,多表关联关系配置复杂
  • 开发难易程度以及使用场景
    • Hibernate是重量级框架,学习起来较为困难,适合于需求相对稳定的中小型项目,办公等小型系统。
    • Mybatis是轻量级的框架,学习起来较为轻松,适合于需求变化频繁,大型项目,例如电子商务系统。

2、快速入门使用Mybatis

步骤1:搭建Mybatis的环境

步骤1:搭建Mybatis的环境

添加驱动包(mybatis.jar与mysql.jar)

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>
    </dependencies>

步骤2:快速创建一个数据库并且包含一张表作为测试

步骤2:快速创建一个数据库并且包含一张表作为测试

CREATE DATABASE `mybatis`;

USE `mybatis`;

CREATE TABLE `user`(
	`id` INT(64) NOT NULL PRIMARY KEY,
	`username` VARCHAR(30) DEFAULT NULL,
	`password` VARCHAR(30) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO user(`id`,`username`,`password`) VALUES(101,'Alascanfu','123456'),
(102,'root','root'),
(103,'admin','admin');

步骤3:创建配置文件 mybatis-config.xml进行配置

步骤3:创建配置文件 mybatis-config.xml进行配置

配置文件需要配置:

  • 指定数据库的相关信息(url,username,password,driver)
  • 框架可以根据配置文件自动获取连接
  • 指定事务管理对象

mybatis-config.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="$driver"/>
                <property name="url" value="$url"/>
                <property name="username" value="$username"/>
                <property name="password" value="$password"/>
            </dataSource>
        </environment>
        
        <environment id="otherDevelopment">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="$driver"/>
                <property name="url" value="$url"/>
                <property name="username" value="$username"/>
                <property name="password" value="$password"/>
            </dataSource>
        </environment>
    </environments>
<!--    指定mapper文件的路径-->
    <mappers>
        <mapper resource="com.alascanfu.pojo.mapper.UserMapper.xml"/>
    </mappers>

</configuration>

步骤4:创建一个MybatisUtils工具类 获取SqlSession

步骤4:创建一个MybatisUtils工具类 获取SqlSession

/**
 * 功能描述
 * sqlSessionFactory ----> sqlSession
 * Mybatis的工具类 用来获取sqlSession
 * @author Alascanfu
 * @date 2022/1/9
 */
public class MybatisUtils 
    private static InputStream inputStream;
    private static SqlSessionFactory sqlSessionFactory;
    //利用静态代码块直接在初始化时加载
    static 
        try 
            String resource = "mybatis-config.xml";
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
         catch (IOException e) 
            e.printStackTrace();
        
    
    
    /**
     * 功能描述
     * 获取sqlSession
     * @date 2022/1/9
     * @author Alascanfu
     */
    public static SqlSession getSqlSession()
        return sqlSessionFactory.openSession();
    
    
    /**
     * 功能描述
     * 关闭流与断开SqlSession连接
     * @date 2022/1/9
     * @author Alascanfu
     */
    public static void closeSqlSession()
        try 
            inputStream.close();
            getSqlSession().close();
         catch (IOException e) 
            e.printStackTrace();
        
    


步骤5:创建实体类与接口类

步骤5:创建实体类与接口类

User.java

public class User 
    private int id ;
    private String username;
    private String password;
    
    public User() 
    
    
    public User(int id, String username, String password) 
        this.id = id;
        this.username = username;
        this.password = password;
    
    
    public int getId() 
        return id;
    
    
    public void setId(int id) 
        this.id = id;
    
    
    public String getUsername() 
        return username;
    
    
    public void setUsername(String username) 
        this.username = username;
    
    
    public String getPassword() 
        return password;
    
    
    public void setPassword(String password) 
        this.password = password;
    
    
    @Override
    public String toString() 
        return "User" +
            "id=" + id +
            ", username='" + username + '\\'' +
            ", password='" + password + '\\'' +
            '';
    

接口UserMapper.java

public interface UserMapper 
    List<User> getUserList();


编写一个Mapper配置文件,来代替了之前JDBC中的UserDaoImpl的接口实现类

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">
<!--namespace 绑定一个对应的Mapper接口-->
<mapper namespace="com.alascanfu.pojo.mapper.UserMapper">
    <select id="getUserList" resultType="com.alascanfu.pojo.User">
        select * from user
    </select>
</mapper>

步骤6:测试

步骤6:测试

UserMapperTest.java

public class UserMapperTest 
    @Test
    public void test()
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        List<User> userList =
            mapper.getUserList();
        for (User user : userList) 
            System.out.println(user);
        
        
        sqlSession.close();
    

运行结果:

Userid=101, username='Alascanfu', password='123456'
Userid=102, username='root', password='root'
Userid=103, username='admin', password='admin'

Process finished with exit code 0

如果测试类进行测试的时候可能会报错

要先进行配置好maven的过滤环境

否则在测试的时候就会找不到咱们设置好的xml文件

<?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">
    <parent>
        <artifactId>mybatis-01-test</artifactId>
        <groupId>com.alascanfu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-02-HelloMybatis</artifactId>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- 配置好过滤Maven配置文件-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

</project>

3、Mybatis实现CRUD操作——以及简单操作

步骤1:需要合理设计好对应了映射类,属性命名最好=列名

步骤1:需要合理设计好对应了映射类,属性命名最好=列名

步骤2:在Mapper接口中,定义对应的方法,增删改的返回值为int(代表的是操作修改的行),而查询则对应返回类型即可。

步骤2:在Mapper接口中,定义对应的方法,增删改的返回值为int(代表的是操作修改的行),而查询则对应返回类型即可。

public interface UserMapper 
    //获取表中的所有User
    List<User> getUserList();
    //插入一个用户
    int insertUser(User user);
    //根据id来删除一个用户
    int deleteUserById(int id);
    //根据id来修改用户
    int updateUserById(User user);
    //查询对应id的用户信息
    User queryUserById(int id);

步骤3:当在Mapper接口中,创建好方法后,就要去Mapper的配置文件当中设置对应方法的SQL语句了。

步骤3:当在Mapper接口中,创建好方法后,就要去Mapper的配置文件当中设置对应方法的SQL语句了。

其中mapper中对应的标签名称 也就是翻译过来的 SQL映射语句

insert 插入

delete 删除

update 更新

select 查询

标签内的属性:

  • parameterType:参数的类型
  • resultType:返回值类型
<?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.alascanfu.pojo.mapper.UserMapper">

<!-- 增加一个用户 这里的参数类型一定要写对应位置的返回类型 以免出错-->
    <insert id="insertUser" parameterType="com.alascanfu.pojo.User">
        insert into user (id,username,password) values(#id,#username,#password)
    </insert>
<!-- 删除一个用户 -->
    <delete id="deleteUserById" parameterType="int">
        delete from USER where id = #id
    </delete>
    
<!-- 根据id更新用户信息 -->    
    <update id="updateUserById" parameterType="com.alascanfu.pojo.User">
        update user set username = #username,password=#password where id = #id
    </update>

<!-- 查询所有用户信息 -->
    <select id="getUserList" resultType="com.alascanfu.pojo.User">
        SELECT * FROM USER
    </select>
<!-- 根据用户id查询用户信息 -->    
    <select id="queryUserById" resultType="com.alascanfu.pojo.User">
        select * from user where id = #id
    </select>

</mapper>

注意内容:

#属性值(参数名称)

步骤4:连接数据库进行测试

步骤4:连接数据库进行测试

public class Test 
    //用于测试查询所有的用户信息
    @org.junit.Test
    public void test()
        SqlSession sqlSession = MybatisUtils.getSqlSession(以上是关于Mybatis入门到入坟 一站式基础及进阶——囊括面试点与初学基础框架分析——从0到1 不会私我 我手把手教你的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2从入门到入坟 | 基础入门篇:「Spring Boot 2从入门到入坟」系列教程介绍

Spring Boot 2从入门到入坟 | 基础入门篇:「Spring Boot 2从入门到入坟」系列教程介绍

我从入门到入坟 Python 后总结的基础教程

我从入门到入坟 Python 后总结的基础教程

Spring Boot 2从入门到入坟 | 基础入门篇:Spring Boot的大时代背景

Java从入门到入坟系列学习路线目录索引(持续更新中~~~)