Mybatis简介

news2024/12/23 6:04:23

1.1 框架介绍

  • 框架是一款半成品软件,可以基于这个半成品软件继续开发,来完成我们个性化的需求!

  • 如图:
    在这里插入图片描述

1.2 框架要解决的问题

  • 框架要解决最重要的是技术整合的问题

  • 不同的软件企业需要从 J2EE 中选择不同的技术,使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击

  • 应用是软件企业的核心,是竞争力的关键所在,因此应该将应用自身的设计和具体的实现技术解耦

  • 这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响

    框架一般处在低层应用平台(如 J2EE)和高层业务逻辑之间的中间层

1.3 软件开发的分层重要性

框架的重要性在于它实现了部分功能,并且能将低层应用平台高层业务逻辑进行缓和。
为了实现软件工程中的“高内聚、低耦合”,把问题划分开来各个解决,易于控制,易于延展,易于分配资源
常见的 MVC 软件设计思想就是很好的分层思想

1.3.1 分层开发下的常见框架

1、解决数据的持久化问题的框架

在这里插入图片描述

https://mybatis.net.cn/ 中文网站
作为持久层的框架,还有一个封装程度更高的框架就是 Hibernate,
但这个框架因为各种原因目前在国内的流行程度下降太多, 现在公司开发也越来越少使用。
目前使用 Spring Data 来实现数据持久化也是一种趋势。

2、解决 WEB 层问题的 MVC 框架

通过策略接口,Spring 框架是高度可配置的,并包含多种视图技术,
例如 JSP 技术、POI。
Spring MVC 框架并不知道使用的视图,所以不会强迫开发者只使用 JSP 技术,它分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制。

它是一个典型的教科书式的mvc构架,并且是一个纯正的servlet系统。而且框架本身有代码,看起来容易理解。

3、解决技术整合问题的框架

Spring是Java EE编程领域的一个轻量级开源框架,它集成各类型的工具,通过核心的Bean factory实现了底层的类的实例化和生命周期的管理

Spring是控制反转(IOC)和面向切面(AOP)的容器框架

  • 目的:解决企业应用开发的复杂性

  • 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能

  • 范围: 任何java应用

1.4 ORM介绍

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

  • 指的是持久化数据和实体对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。

  • 如图: dao -->实体类–>数据库

在这里插入图片描述

具体映射关系:

  • 数据库的表(table) --> 类(class)
  • 记录(record,行数据) --> 对象(object)
  • 字段(field) --> 对象的属性(attribute)

1.5 原始jdbc操作(查询数据)

在这里插入图片描述

1.6 原始jdbc操作(插入数据)

在这里插入图片描述

1.7 原始jdbc操作的分析

  • 原始 JDBC 的操作问题分析

    • 频繁创建和销毁数据库的连接会造成系统资源浪费从而影响系统性能

    • sql 语句在代码中硬编码,如果要修改 sql 语句,就需要修改 java 代码,造成代码不易维护

    • 查询操作时,需要手动将结果集中的数据封装到实体对象中

    • 增删改查操作需要参数时,需要手动将实体对象的数据设置到 sql 语句的占位符

  • 原始 JDBC 的操作问题解决方案

    • 使用数据库连接池初始化连接资源

    • 将 sql 语句抽取到配置文件中

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

1.8 什么是Mybatis

mybatis 是一个优秀的基于java的持久层框架,它内部封装了jdbc,开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
采用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,不用与jdbc api 打交道,就可以完成对数据库的持久化操作。

mybatis通过xml或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement 中 sql 的动态参数进行映射生成最终执行的sql语句

最后mybatis框架执行sql并将结果映射为java对象并返回

MyBatis官网地址:http://www.mybatis.org/mybatis-3/

https://mybatis.org/mybatis-3/zh/index.html

2 Mybatis的快速入门

MyBatis案例简化步骤

1、导入pom包
2、创建mapper映射文件
3、创建config文件

准备工作:

创建数据库: 数据库名称: mybatisdb 创建数据表:


CREATE TABLE `user` (
  `id` int(30) PRIMARY KEY AUTO_INCREMENT NOT NULL,
  `username` varchar(255) DEFAULT NULL,
  `sex` varchar(10) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  `birthday` date DEFAULT NULL
)

导入pom包

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.47</version>
</dependency>
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.5</version>
</dependency>
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.16</version>
</dependency

代码开发:

1、mapper映射文件编写

<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD约束-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.zxy.mapper">
<!--    查询数据源信息-->
    <select id="dbs" resultType="string">
        show databases
    </select><select id="showUser" resultType="map">
        select * from user
    </select><insert id="save" parameterType="map">
        insert into user values(#{id},#{username},#{sex},#{address},#{birthday})
    </insert>
</mapper>

2、Mybatis配置类编写:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd"><!--configuration 核心根标签-->
<configuration>
      <!--引入数据库连接的配置文件-->
    <properties resource="jdbc.properties"/>
    
    <!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个-->
    <environments default="mysql">
        <!--environment配置数据库环境  id属性唯一标识-->
        <environment id="mysql">
            <!-- transactionManager事务管理。  type属性,采用JDBC默认的事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!-- dataSource数据源信息   type属性 连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
<!--    告诉mybatis 映射文件的位置-->
    <mappers>
        <!-- mapper 引入指定的映射配置文件   resource属性指定映射配置文件的名称 -->
        <mapper resource="cn/zxy/mapper/helloDbMapper.xml"/>
    </mappers>
</configuration>

3、测试类编写

@Test
public void dbMapperTest() throws Exception {
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
    SqlSession session = factory.openSession();
    
    //数据源
    List<String> dbs = session.selectList("dbs");
    System.out.println("数据源信息"+dbs);//数据添加
    Map<String,Object> map=new HashMap<>();
    map.put("id","3");
    map.put("username","周五");
    map.put("sex","男");
    map.put("address","郑州");
    map.put("birthday","2023-01-10");
    int save = session.insert("save", map);
    System.out.println(save);
    session.commit();//查询所有
    List<Map<String,Object>> showUser = session.selectList("showUser");
    System.out.println(showUser);}

MyBatis快速尝试

MyBatis开发步骤:

  1. 添加MyBatis的jar包

  2. 编写User实体类

  3. 编写持久层接口 IUserDao

  4. 编写持久层接口的映射文件IUserDao.xml

  5. 编写核心文件MyBatisConfig.xml

  6. 编写测试类

2.1 环境搭建

2.2 实现流程

2.1.1 编写User实体

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String username;
    private Integer sex;
    private String address;
    private Date birthday;
}

2.1.2 编写持久层接口 IUserDao

public interface IUserDao {    
/*    查询所有     */    
public List<User> findAll();
}

2.1.3 编写持久层接口的映射文件IUserDao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD约束-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
    mapper:核心根标签
    namespace属性:名称空间
-->
<mapper namespace="cn.zxy.dao.IUserDao">
    <!--
       select:查询功能的标签
       id属性:唯一标识
       resultType属性:指定结果映射对象类型
       parameterType属性:指定参数映射对象类型
   -->
    <select id="findAll" resultType="cn.zxy.pojo.User">
        select * from user
    </select>
</mapper>

2.1.4 编写MyBatis核心文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd"><!--configuration 核心根标签-->
<configuration>
    <!--引入数据库连接的配置文件-->
    <properties resource="jdbc.properties"/><!-- 给bean实体类配置别名-->
    <typeAliases>
        <typeAlias type="cn.zxy.pojo.User" alias="user"/>
<!--    <package name="cn.zxy.pojo"/>-->
    </typeAliases><!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个-->
    <environments default="mysql">
        <!--environment配置数据库环境  id属性唯一标识-->
        <environment id="mysql">
            <!-- transactionManager事务管理。  type属性,采用JDBC默认的事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!-- dataSource数据源信息   type属性 连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
<!--    告诉mybatis 映射文件的位置-->
    <mappers>
        <!-- mapper 引入指定的映射配置文件   resource属性指定映射配置文件的名称 -->
       <mapper resource="cn/zxy/dao/IUserDao.xml"></mapper>
    </mappers>
</configuration>

2.3 编写测试代码

  @Test
    public void findAllTets() throws Exception {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        
        //2.创建sqlSessionFactory 的构建者对象
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        
        //3.使用构建者创建sqlSessionFactory
        SqlSessionFactory factory = builder.build(in);
        
        //4.使用sqlSessionFactory 生产sqlSession对象
        SqlSession session = factory.openSession();
        
        //5.使用sqlsession 创建dao接口代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        
        //6.使用代理对象执行查询所有方法
        List<User> users = userDao.findAll();
        for (User user : users) {
            System.out.println(user);
        }
        //7.释放资源
        in.close();
        session.close();
    }

2.4 入门小结:

mybatis 只需要编写 Dao 接口并且按照 Mybatis 要求,编写两个配置文件, 就可以实现功能。
远比之前的 jdbc 方便多了。(使用注解之后, 将变得更为简单,只需要编写一个 mybatis 配置文件就够了) 。
但是,这里面包含了许多细节,比如
为什么会有工厂对象(SqlSessionFactory) ?
为什么有了工厂之后还要有构建者对象(SqlSessionFactoryBuilder)?
为什么 IUserDao.xml 在创建时有位置和文件名的要求等等。

3 基于注解的 mybatis快速入门

3.1 创建mapper接口并添加注解

/*
      用户操作持久层
 */
public interface IUserMapper {
    //查询所有user
    @Select("select * from user")
    public List<User> findAll();
}

3.2 修改持久层接口的映射文件UserMapper.xml地址

<mappers>
    <!-- mapper 引入指定的映射配置文件   resource属性指定映射配置文件的名称 -->
   <mapper resource="cn/zxy/dao/IUserDao.xml"></mapper>
    <!-- class属性指定映射类的名称位置-->
   <mapper class="cn.zxy.mapper.IUserMapper"></mapper>
</mappers>

3.3 创建测试类

@Test
public void annmapperTest() throws Exception {
    //1.读取配置文件
    InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
    //创建sqlsession
    SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
    SqlSessionFactory factory = builder.build(in);
    SqlSession session = factory.openSession();
    IUserMapper mapper = session.getMapper(IUserMapper.class);
    List<User> user = mapper.findAll();
    for (User user1 : user) {
        System.out.println("usermapper="+user1);
    }
}

4 知识小结

  • 框架是一款半成品软件,可以基于框架继续开发,从而完成一些个性化的需求

  • ORM 对象关系映射,数据和实体对象的映射

  • MyBatis 是一个优秀的基于 Java 的持久层框架,它内部封装了 JDBC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/772715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(备份+恢复篇)

深入探索和分析MySQL数据库的数据备份和恢复实战开发指南 MySQL数据库备份全量备份全量备份应用场景 增量备份binlogbinlog主要作用binlog的作用主要有两个方面 开启binlog日志功能要开启MySQL的binlog日志步骤 mysqlbinlogmysqlbinlog的使用案例 全量备份与增量备份结合按天全…

TKDE论文,跑的改的,GPSCVULDETECTOR

Combining Graph Neural Networks With Expert Knowledge for Smart Contract Vulnerability Detection 论文代码GitHub https://github.com/Messi-Q/GPSCVulDetectorpaper https://ieeexplore.ieee.org/abstract/document/9477066/参考IJCAI 21中AME的数据集 https://gith…

huggingface新作品:快速和简便的训练模型

AutoTrain Advanced是一个用于训练和部署最先进的机器学习模型的工具。它旨在提供更快速、更简便的方式来进行模型训练和部署。 安装 您可以通过PIP安装AutoTrain-Advanced的Python包。请注意&#xff0c;为了使AutoTrain Advanced正常工作&#xff0c;您将需要python > 3.…

微信小程序源码反编译(wxss样式无法恢复的问题)

背景&#xff1a;从微信小程序源码上线后&#xff0c;网上一直有大神写程序来反编微信小程序的源码&#xff0c;不过现在来看基本都不能用了&#xff0c;有的能用也不能获取样式wxss文件&#xff0c;经过我的不懈努力&#xff0c;找到一些办法&#xff0c;接下来我会一步步讲。…

HarmonyOS课程体验官招募(第四期),寻找乐于分享,精益求精的伙伴

华为开发者联盟HarmonyOS课程体验官&#xff08;第四期&#xff09;活动&#xff0c;开始招募啦&#xff01; 如果你精益求精、乐于分享&#xff1b;如果你愿意为学堂课程优化改进出谋划策&#xff0c;那就快来加入我们吧&#xff01;学堂期待与你共同成长、一起进步&#xff0…

大模型开发(八):基于思维链(CoT)的进阶提示工程

全文共8000余字&#xff0c;预计阅读时间约16~27分钟 | 满满干货&#xff08;附复现代码&#xff09;&#xff0c;建议收藏&#xff01; 本文目标&#xff1a;介绍提示工程基础类方法、思维链提示方法和LtM的提示方法&#xff0c;并复现解决论文中四个经典推理问题。 代码下载…

JimuReport积木报表 v1.5.9版本发布—免费的可视化报表

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

中睿天下与北京理工大学网络攻防溯源联合实验室揭牌仪式成功举行

7月17日&#xff0c;中睿天下和北理工共建网络攻防溯源联合实验室揭牌仪式暨“网络安全攻防对抗实战”暑期课程开幕式在北京理工大学举行。中睿天下联合创始人魏海宇、创新实验室负责人朱鲲鹏、北京理工大学网络空间安全学院副院长嵩天、副院长张延军、副院长刘莲及部分师生代表…

c++qt 学习笔记,与注意事项

目录 1 构建一个简单的应用 1.1 创建工程 1.2 widget.h文件修改 1.3 widget.cpp文件修改 1.4 生成可执行exe文件 2 内置部件总结 2.1 输入部件类 2.1.1 普通按钮QPushButton示例 2.1.2 工具按钮QToolButton 2.1.3 单选按钮QRadioButton 2.1.4 复选按钮 2.1.5 con…

Unity - Stencil Test 开关,无法通过脚本或是 shader lab 开关来控制

查看过 shader lab 文档: ShaderLab command: Stencil&#xff0c;没有看到 stencil test 关闭的功能&#xff0c;我真的无语。。。 只能开&#xff0c;不能关&#xff0c;意思一个 shader lab 一旦编写了 stencil { } 的内容&#xff0c;就必须开启。。。 好 low 的设计 在网…

【C语言】深剖数据在内存中的存储

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在回炉重造C语言&#xff08;2023暑假&#xff09; ✈️专栏&#xff1a;【C语言航路】 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你…

密码学学习笔记(十六 ):Schnorr签名算法

交互式零知识证明 零知识证明(ZKP)就是不会将证据泄露给验证者的知识证明。Schnorr身份认证识别协议是一个交互式ZKP&#xff0c;它满足了完备性、可靠性、零知识性。所谓的交互式ZKP方案通常包含3个步骤&#xff08;承诺、挑战和证明&#xff09;&#xff0c;在文献中通常被称…

传奇新手小白架设单机给玩家充值元宝教程

阿杰今天和大家说说架设的单机如何给玩家和给自已充值元宝的教程 相信有很多玩家都架设过单机吧&#xff0c;架设容易&#xff0c;但是还有一些搞不明白&#xff0c;就是版本里面需 要充值点和积分回馈点才能领取的&#xff0c;那么这些怎么设置呢&#xff1f;今天就教大家两种…

【Express.js】evp-express-cli

evp-express-cli evp-express-cli 是笔者结合自己的实践经验编写的一款 express 手脚架&#xff0c;以一种比较合适的流程构建的 express 架构。 文档 安装用法 命令新建项目运行模板 验证数据库RedisAuthRabbitMQSocketIONacos 开发工具 BabelEsintJestPkgPM2 资源配置日志异…

【Docker】详解docker安装及使用

详解docker安装及使用 1. 安装docker2. Docker镜像操作3. Docker容器操作4.知识点总结4.1 docker镜像操作4.2 docker容器操作4.3 docker run启动过程 参见docker基础知识点详解 1. 安装docker 目前 Docker 只能支持 64 位系统。 systemctl stop firewalld.service setenforce…

Docker 应用容器引擎 (一)

Docker 应用容器引擎 Docker是什么 是一个开源的应用容器引擎&#xff0c;基于GO语言开发并遵循了apache2.0协议开源 是在linux容器里运行应用的开源工具 是一种轻量级的“虚拟机” Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的…

NOTA WL12,新型双功能整合剂,正电子发射断层扫描 (PET) 显像剂

&#xff08;文章资料汇总来源于&#xff1a;陕西新研博美生物科技有限公司小编MISSwu&#xff09;​ NOTA-WL12试剂 | 基础知识概述&#xff08;部分&#xff09; 英文名称&#xff1a;NOTA-WL12 CAS号&#xff1a;N/A 分子式&#xff1a;N/A 分子量&#xff1a;N/A 规格标准…

【Linux】Docker 基本管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Docker 基本管理 Docker 概述Docker 核心概念Docker 安装部署Docker 镜像操作Docker 容器操作 Docker 概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵…

如何在Windows 10中启用或禁用缩略图预览

文件资源管理器可以在 Windows 10 中显示文件和文件夹的缩略图或图标。 本教程将向你展示如何在文件资源管理器中为你的帐户、所有用户或Windows 10 中的特定用户启用或禁用缩略图预览。 缩略图预览仅在打开并且选择了中等图标、大图标或超大图标文件夹视图布局时显示。 如果缩…

【T1】T1飞跃版红字反冲,提示单据已生成了凭证,不能红冲。但是联查凭证不存在。

【问题描述】 T1飞跃专业版&#xff0c;在经营历程中操作【红字反冲】的时候&#xff0c; 提示&#xff1a;单据已生成了凭证&#xff0c;不能红冲。 但是选中单据&#xff0c;点击联查凭证的时候&#xff0c;又提示【单据没有凭证】。 【解决方法】 针对账套库执行下述语句&…