首页 > 其他分享 >Mybatis学习笔记

Mybatis学习笔记

时间:2024-11-04 22:16:08浏览次数:3  
标签:xml java 映射 笔记 学习 mybatis sql Mybatis

博主主页:【南鸢1.0】

本文专栏:JAVA | SSM

目录

一、Mybatis框架

1.Mybatis是什么

2.Mybatis架构图

3. Mybatis提供的功能

4.为什么需要Mybatis

二、Mybatis程序

(一)分析思路

(二)创建一个数据库并建一张表

(三) 创建一个普通的Maven项目并删除src目录创建一个模块(子工程)

(四)更改Maven版本为3.6.3 ,不要使用IDEA自带的版本

(五)导入相关依赖

(六)编写Mybatis核心配置文件

(七)MybatisX-Generator

(八).编写Mybatis工具类

(九)添加核心配置文件mybatis-config中的mapper

(十)测试代码

三、mybatis和Hibernate的本质区别与应用场景



常用的J2EE开发框架:

  • J2EE是一套针对企业级分布式应用的计算环境。它定义了动态Web页面功能(Servlet和Jsp)、商业组件(EJB)、异步消息传输机制(JMS)、名称和目录定位服务(JNDI)、数据库访(JDBC)、与子系统的连接器(JCA)和安全服务等。

MyBatis 框架: MyBatis 是一个优秀的基于 java 的持久层框架,内部封装了 jdbc,开发者只需要关注 sql 语句 本身,而不需要处理加载驱动、创建连接、创建 statement、关闭连接,资源等繁杂的过程。 MyBatis 通过 xml 或注解两种方式将要执行的各种 sql 语句配置起来,并通过 java 对象和 sql 的 动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。


Spring 框架: Spring 框架为了解决软件开发的复杂性而创建的。Spring 使用的是基本的 JavaBean 来完成以前 非常复杂的企业级开发。Spring 解决了业务对象,功能模块之间的耦合,不仅在 javase,web 中使用, 大部分 Java 应用都可以从 Spring 中受益。 Spring 是一个轻量级控制反转(IoC)和面向切面(AOP)的容器。


SpringMVC 框架: Spring MVC 属于 SpringFrameWork 3.0 版本加入的一个模块,为 Spring 框架提供了构建 Web 应用程序的能力。现在可以 Spring 框架提供的 SpringMVC 模块实现 web 应用开发,在 web 项目中 可以无缝使用 Spring 和 Spring MVC 框架。

一、Mybatis框架

1.Mybatis是什么

        MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。 

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

  Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

2.Mybatis架构图

(1)、mybatis配置

SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

 (2)、通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

 (3)、由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

 (4)、mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

 (5)、Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。

 (6)、Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

 (7)、Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

3. Mybatis提供的功能
  • 提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建这些对象了。
  • 提供了执行sql语句的能力,不用你执行sql。
  • 提供了循环sql,把sql的结果转为java对象、集合的能力
// 这是以前使用JDBC时获取到的数据库查询结果,此时需要使用循环来获取到查询的结果,并将这个结果写入到一个List集合中,很麻烦。
// 此时使用MyBatis框架,他会把这些sql语句当做是一个个的对象,在底层对自动帮我们完成这个循环,我们获取到的是一个装满sql对象的List集合。
while (rs.next()) {
        Student stu = new Student();
        stu.setId(rs.getInt("id"));
        stu.setName(rs.getString("name"));
        stu.setAge(rs.getInt("age"));
        //从数据库取出数据转为 Student 对象,封装到 List 集合
        stuList.add(stu);
      }
  • 提供了关闭资源的能力,不用你关闭Connection, Statement, ResultSet。
4.为什么需要Mybatis
  • Mybatis就是帮助程序猿将数据存入数据库中 , 和从数据库中取数据 .
  • 传统的jdbc操作 , 有很多重复代码块 .比如 : 数据取出时的封装 , 数据库的建立连接等等… , 通过框架可以减少重复代码,提高开发效率 .
  • MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping) -->对象关系映射
  • 所有的事情,不用Mybatis依旧可以做到,只是用了它,所有实现会更加简单!技术没有高低之分,只有使用这个技术的人有高低之别
  • MyBatis的优点

- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件就可以了,易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。 - 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。 - 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。 - 提供xml标签,支持编写动态sql。 - …最重要的一点,使用的人多!公司需要!

二、Mybatis程序

(一)分析思路

思路流程:搭建环境->导入Mybatis->编写代码->测试

(二)创建一个数据库并建一张表
CREATE DATABASE `ce`;
use `ce`;
CREATE TABLE `user`  (
  `id` int(20) primary KEY,
  `name` varchar(30) DEFAULT NULL,
  `pwd` varchar(30) DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8;
INSERT INTO `user` VALUES (1, '张三', 'zhangsa');
INSERT INTO `user` VALUES (2, '李四', 'lisi');
INSERT INTO `user` VALUES (3, '王五', 'wangwu');
select * from user;

(三) 创建一个普通的Maven项目并删除src目录创建一个模块(子工程)

删除src,创建一个模块(子工程)

(四)更改Maven版本为3.6.3 ,不要使用IDEA自带的版本

settings.xml

<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

<localRepository>D:\LeStoreDownload\maven\apache-maven-3.6.3-bin</localRepository>

<pluginGroups></pluginGroups>

<proxies></proxies> <servers></servers> <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>

<profiles> <profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile> </profiles>

</settings

注意:<localRepository>D:\LeStoreDownload\maven\apache-maven-3.6.3-bin</localRepository>里边的路径是自己maven所放位置

(五)导入相关依赖

mybatis    mysql     junit

<dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.34</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

(六)编写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.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.10.130:3306/ce"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

IDEA与mysql数据库连接

(七)MybatisX-Generator

要下载MybatisX插件

把生成的src文件拖到MyBatis-01项目中


(八).编写Mybatis工具类
package org.example.Utils;

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 java.io.IOException;
import java.io.InputStream;

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //获取SqlSession
    public static SqlSession getSession() {
        return sqlSessionFactory.openSession();
    }
}
(九)添加核心配置文件mybatis-config中的mapper

(十)测试代码
  • 测试类代码,也就是要传递到mapper中的参数代码(此时传递的id值为1)
  • 声明*@Test*之后代表这是一个测试类,*不需要使用psvm(主函数)*也可以进行运行,如果不写@Test即不声明是一个测试类,此时需要放在主函数中才可以运行。
@Test
    public void test() {
        SqlSession sqlSession = MybatisUtils.getSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user1 = mapper.selectByPrimaryKey(1L);

        System.out.println(user1);
    }

三、mybatis和Hibernate的本质区别与应用场景

hibernate:是一个标准ORM框架(对象关系映射),入门门槛较高的,不需要程序写sql,sql语句自动生成了,对sql语句进行优化、修改比较困难的。

应用场景:

     适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。

mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。

应用场景:

     适用与需求变化较多的项目,比如:互联网项目。

标签:xml,java,映射,笔记,学习,mybatis,sql,Mybatis
From: https://blog.csdn.net/qq_52143611/article/details/143470084

相关文章

  • 2024/11/4日 日志 关于JavaScript 变量、数据类型、类型转换和流程控制语句的学习
    经过两天的休憩,状态更佳,后面的笔记和学习进度也会加快JavaScript变量、数据类型、类型转换和流程控制语句点击查看代码----变量--JavaScript中用var关键字(variable的缩写)来声明变量--vartest=20;--test="张三":--·JavaScript是一门弱类型语言变量可......
  • EPS原理笔记
    EPSUE(userequipment),移动用户设备LTE(LongTermEvolution),无线接入网部分,E-UTRANEPC(systemArchitectureEvolution、EvoloedPacketCore),核心网部分,主要包括MME、S-GW、P-GW、HSS,连接Internet等外部PDN(PacketDataNetwork)3GPP定义3GPP接入是指遵循3GPP制定......
  • 大模型的上下文学习
    文章目录上下文学习的形式化定义示例设计底层机制    在GPT-3的论文中,OpenAI研究团队首次提出上下文学习(In-contextlearning,ICL)这种特殊的提示形式。目前,上下文学习已经成为使用大语言模型解决下游任务的一种主流途径。上下文学习的形式化定义   ......
  • GPB | 王向峰综述:机器学习技术驱动植物AI育种
    2024年7月,Genomics,Proteomics&Bioinformatics(GPB)在线发表了由中国农业大学王向峰教授团队撰写的题为“MachinelearningforAIbreedinginplants”的观点文章。机器学习(ML)使人工智能(AI)变得智能,ML先驱ArthurSamuel于1959年将其定义为“使计算机能够在无需明确......
  • Annu. Rev. Plant Biol(IF=21.3)| 深度学习在植物表型中的应用
    2024年7月,美国丹佛斯植物科学中心的KatherineM.Murphy等人在AnnualReviewofPlantBiology发表了题为DeepLearninginImage-BasedPlantPhenotyping的文章,综述了深度学习技术在植物表型分析中的应用。文章深入探讨了深度学习在基于图像的植物表型研究中的应用,包括其基......
  • 11.4学习日志A.A
    switch的其他用法jdk12以后的新特性一.intn=1;switch(n){case1->system.out.print1n("1");case2->system.out.print1n("2");}当case中只有一行代码可用较简便。二.intn=1;switch(n){case1,2,3:system.out.print1n("1");break;case5:system.ou......
  • 代码随想录刷题学习日记
    仅为个人记录复盘学习历程,解题思路来自代码随想录代码随想录刷题笔记总结网址:代码随想录559.n叉树的最大深度(层序遍历法)给定一个n叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。提供参数:根结点root关键思路:和二叉树的层序遍历找最......
  • 代码随想录刷题学习日记
    仅为个人记录复盘学习历程,解题思路来自代码随想录代码随想录刷题笔记总结网址:代码随想录递归函数什么时候需要返回值?什么时候不需要返回值?如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返......
  • 代码随想录刷题学习日记
    仅为个人记录复盘学习历程,解题思路来自代码随想录代码随想录刷题笔记总结网址:代码随想录654.最大二叉树给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右......
  • opencv 图像预处理(一) python笔记
    图像预处理​在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV提供了许多图像预处理的函数和方法,以下是一些常见的图像预处理操作:图像空间转换图像大小调整图像仿射变换图像翻转图像裁剪图像二值......