01_01_Mybatis的介绍与快速入门

news2024/11/28 19:16:13

一、数据持久层框架的发展历程

1、JDBC

JDBC

  • JDBC(Java Data Base Connection),是一种用于执行SQL语句的Java API,为多种关系型数据库提供了统一访问的方式,它由一组用Java语言编写的类和接口组成。JDBC提供了一种规范,可以其基础上构建更高级的工具和接口,使开发人员能够编写数据库应用程序。
  • 特点:
    • 优点:快捷、高效(运行期);
    • 缺点:代码量大、繁琐、不支持数据库跨平台(编辑期);
  • 核心API:
    • DriverManager:连接数据库
    • Connection:连接数据库的抽象
    • Statement:执行SQL
    • ResultSet:执行后的数据结果集

2、DBUtils

  • DBUtils是Java编程中数据库操作的实用小工具,小巧简单实用;
  • DBUtils封装了对JDBC的操作,简化了JDBC的操作过程,减少了冗余代码的编写;
  • DBUtils三个核心的功能:
    • QueryRunner中提供了对sql语句操作的API;
    • ResultSetHandle接口,用于定义查询操作后,如何封装结果集;
    • 它是一个工具类,定义了关闭资源与事务处理的方法;

3、Hibernate

  • Hibernate是由Gavin King于2001年创建的开源的ORM框架。
  • Hibernate将Java类映射到数据库表中,从Java数据类型映射到SQL数据类型中。
  • Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象。
  • 特点:
    • 优点:
      • Hibernate使用XML文件来处理映射Java类到数据库表中,并且不需要再编写任何其它代码;
      • 为在数据库中直接检索和存储Java对象提供了简单的API;
      • 如果数据库中的表结构有变化,只需要更新XML文件即可;
    • 缺点:
      • Hibernate的完全封装导致无法使用数据的一些功能;
      • Hibernate对代码的耦合度太高;
      • Hibernate在进行批量数据操作时,需要大量的内存空间且执行过程中涉及到的对象太多;

4、JDBCTemplate

  • JdbcTemplate针对数据查询提供了多个重载的模版方法,你可以根据需要选择不同的模版方法。如果查询的很简单,仅仅只是调用对应的方法,传入相应的sql语句以及涉及到的参数,既可以获取一个单一的结果;
  • 特点:
    • 优点:高效、内嵌在Spring框架中,支持基于AOP的声明式事务;
    • 缺点:必须与Spring框架结合使用,不支持数据库跨平台,默认没有缓存;

二、初识Mybatis

1、什么是Mybatis

  • MyBatis 是一款优秀的半自动化持久层ORM框架,它支持自定义SQL语句、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的XML文件或者注解的方式来配置和完成对象关系映射(具体指:类与数据库表的关系、类属性与表字段的关系)。
  • 特点
    • 优点:
      • 简化了JDBC的开发,封装了繁杂冗余的JDBC操作,提高了开发的效率;
      • 是一款简单易学的持久层框架;
      • 将SQL从Java代码中分离了出来,降低了代码依赖的耦合度,且SQL可重用;
      • 提供了XML标签,支持编写动态SQL;
      • 提供了映射标签,支持对象与数据库的ORM关系映射;
      • 支持缓存、数据库连接池等等;
    • 缺点:
      • SQL语句编写的工作量较大,且对开发人员编写SQL的能力要求较高;
      • 对数据库的移植性较差;

2、Mybatis的核心组件

核心组件图

三、快速搭建入门

1、导入相关依赖

	<dependencies>
        <!--Mybatis的核心jar包 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.9</version>
        </dependency>
        <!-- MySQL的依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
         <!--jUnit测试单元的依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

2、创建对应的数据库表

CREATE TABLE `emp` (
  `eid` int(11) NOT NULL AUTO_INCREMENT,
  `e_name` varchar(50) DEFAULT NULL,
  `e_mail` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `salary` decimal(10,2) DEFAULT NULL,
  `did` int(11) DEFAULT NULL,
  PRIMARY KEY (`eid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='员工表';

3、创建POJO实体类对象

public class Emp implements Serializable {
    private Integer eId;
    private String eName;
    private String eMail;
    private Double salary;
    private Integer did;
	//相关get和set方法
	//声明构造方法
	//重写toString()方法
 }

4、创建对应的Mapper接口

public interface EmpMapper {

    Emp selectEmpById(Integer id);

    int insertEmp(Emp emp);

    @Select("select * from emp where e_name=#{ename}")
    Emp selectEmpByName(String ename);
}

5、编写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>

    <!--配置外部属性资源文件,通过 ${} 来进行引用-->
    <properties resource="db.properties">
        <!--也可以在内部自定义属性-->
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/trs-db?useUnicode=true&amp;characterEncoding=utf8&amp;tinyInt1isBit=false&amp;useSSL=false&amp;serverTimezone=GMT%2B8&amp;allowMultiQueries=true&amp;zeroDateTimeBehavior=convertToNull"/>
        <property name="username" value="root"/>
        <property name="password" value="rootxq"/>
    </properties>

    <!--配置数据源连接信息-->
    <environments default="development">
        <environment id="development">
            <!--事务管理器:type 设置事务管理类型
                            (1)JDBC:使用JDBC的事务管理方式
                            (2)MANAGED:不运用事务 -->
            <transactionManager type="JDBC"/>
            <!--数据源:type 设置数据源类型
                            (1)UNPOOLED:不使用连接池
                            (2)POOLED:使用Mybatis的连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${db.driver}"/>
                <property name="url" value="${db.url}"/>
                <property name="username" value="${db.username}"/>
                <property name="password" value="${db.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--配置映射器-->
    <mappers>
        <mapper resource="mapper/DeptMapper.xml"/>
        <mapper resource="mapper/EmpMapper.xml"/>
    </mappers>
</configuration>

6、编写xml映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="org.example.mapper.EmpMapper">

    <select id="selectEmpById" resultType="org.example.pojo.Emp">
        select * from emp where eid = #{id}
    </select>
    
    <insert id="insertEmp" >
        insert into emp 
        	(eid,e_name,e_mail,salary,did) 
        	 values 
         	(#{eId},#{eName},#{eMail},#{salary},#{did})
    </insert>
</mapper>

7、编写测试类

 @Test
    public void testMybatis(){
        try {
            // 根据mybatis全局配置文件来构建SqlSessionFactory
            String config = "mybatis-config.xml";
            InputStream resourceAsStream = Resources.getResourceAsStream(config);

            //构建SqlSessionFactory(将配置文件信息和所有的mapper全部加载到Configuration中被缓存起来)
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

            //获取SqlSession对象(负责执行具体的数据库操作)
            /**
             * 给openSession设置不同的参数会给SqlSession后续的数据库操作造成不同的影响:
             * 1、boolean autoCommit:true表示开启自动提交(默认),false表示关闭自动提交(手动提交)
             * 2、Connection connection:将在当前环境配置的 DataSource 实例中获取 Connection 对象
             * 3、TransactionIsolationLevel level:事务隔离级别将会使用驱动或者数据源的默认设置
             * 4、ExecutorType executorType:执行器类型,默认 SIMPLE,预处理语句是否复用、是否批量处理更新
             *
             */
            SqlSession sqlSession = sessionFactory.openSession(true);

            //1、方式一:基于xml映射文件的原生方式(namespace + id)
            Emp emp = sqlSession.selectOne("org.example.mapper.EmpMapper.selectEmpById", 1);
            System.out.println(emp);

            //2、方式二:基于接口绑定的方式(接口 + 方法名)
            //Mybatis在底层会为接口创建一个代理对象(JDK动态代理),代理对象会实现接口中的方法,所以可以直接调用接口中的方法
            EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
            Emp empInfo = mapper.selectEmpById(1);
            System.out.println(empInfo);

            //3、方式三:基于注解的方式(接口 + 方法名)
            Emp emp3 = mapper.selectEmpByName("WEZ");
            System.out.println(emp3);


            //插入数据
            Emp emp2 = new Emp();
            emp2.seteName("WEZZ");
            emp2.seteMail("wezZ@163.com");
            emp2.setSalary(10000.0);
            emp2.setDid(1);
            mapper.insertEmp(emp2);
            System.out.println(emp2);

            logger.info("测试成功");
        } catch (IOException ioException) {
            logger.error("测试失败");
        }
    }

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

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

相关文章

meterpeter基础及永恒之蓝漏洞利用

meterpeter基础知识 meterpeter为渗透测试框架&#xff0c;主要用于后渗透模块 后渗透&#xff1a;拿到shell后进行的操作&#xff08;远程&#xff0c;权限维持&#xff0c;入侵痕迹清除&#xff0c;上机关闭杀毒软件&#xff09; msf能干什么 相当于一个漏洞库&#xff08…

时序预测 | Matlab基于Transformer多变量时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于Transformer多变量时间序列多步预测&#xff1b; 2.多变量时间序列数据集&#xff08;负荷数据集&#xff09;&#xff0c;采用前96个时刻预测的特征和负荷数据预测未来96个时刻的负荷数据&#xff1b; 3…

【大数据离线项目三:将HIve数仓中的dim进行拉宽聚合处理,PostgreSQL的使用,以及怎么将数据导出到PostgreSQL数据库中】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;今天主要和大家分享一下将HIve数仓中的dim进行拉宽聚合处理&#xff0c;PostgreSQL的使用&#xff0c;以及怎么将数据导出到PostgreSQL数据库中,希望对大家有所帮助。 &#x1f49e;&…

“论软件的可靠性评价”必过范文,软考高级,系统架构设计师论文

论文真题 软件可靠性评价是软件可靠性活动的重要组成部分,既适用于软件开发过程,也可针对最终软件系统。在软件开发过程中使用软件可靠性评价,可以使用软件可靠性模型,估计软件当前的可靠性,以确认是否可以终止测试并发布软件,同时还可以预计软件要达到相应的可靠性水平…

html做一个雷达图的软件

要实现一个在线输入数据并生成雷达图的功能&#xff0c;可以使用HTML表单和JavaScript来处理用户输入的数据。以下是一个示例代码&#xff0c;演示了如何实现这个功能&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"…

Redis进阶 - 朝生暮死之Redis过期策略

概述 Redis 是一种常用的内存数据库&#xff0c;其所有的数据结构都可以设置过期时间&#xff0c;时间一到&#xff0c;就会自动删除。你可以想象 Redis 内部有一个死神&#xff0c;时刻盯着所有设置了过期时间的 key&#xff0c;寿命一到就会立即收割。 你还可以进一步站在死神…

C/C++ vector模拟实现

模拟实现&#xff1a; 框架 namespace yx {template<class T>class vector{public:typedef T* iterator;private:iterator _start;iterator _finish;iterator _end_of_storage;}; } 这里我们声明定义不分离 reverse() 新开一个空间&#xff0c;拷贝数据&#xff0c;然…

Python-日志模块

目录 一、日志级别 二、日志配置 1、日志基本配置 2、日志配置字典&#xff08;知道咋么改就可以&#xff09; 3、日志的使用 一、日志级别 import logginglogging.debug(调试日志) logging.info(消息日志) logging.warning(警告日志) logging.error(错误日志) logging.cr…

ffmpeg音视频开发从入门到精通——ffmpeg 视频数据抽取

文章目录 FFmpeg视频处理工具使用总结环境配置主函数与参数处理打开输入文件获取流信息分配输出文件上下文猜测输出文件格式创建视频流并设置参数打开输出文件并写入头信息读取、转换并写入帧数据写入尾信息并释放资源运行程序注意事项源代码 FFmpeg视频处理工具使用总结 环境…

如何获取文件对应的路径

有时我们会把脚本文件复制到其他的路径或者电脑文件夹下&#xff0c;如果采用绝对路径的话&#xff0c;会发生找不到改文件&#xff0c;程序就会报错。那么我们如何避免这个问题呢&#xff1f;我们可以采用相对路径的方法。 可以看到&#xff0c;系统的当前路径"D:\python…

什么是距离选通型水下三维激光扫描仪?(下)

距离选通激光水下成像的发展 距离选通激光成像技术始于上世纪60年代&#xff0c;受制于高性能脉冲激光器和选通成像器件发展的制约&#xff0c;激光距离选通成像技术在随后的二十年发展缓慢&#xff0c;直到20世纪90年代&#xff0c;随着硬件技术的不断成熟&#xff0c;该技术…

VBA:demo大全

VBA常用小代码合集&#xff0c;总有一个是您用得上的~ (qq.com) 如何在各个分表创建返回总表的命令按钮&#xff1f; 今天再来给大家聊一下如何使用VBA代码&#xff0c;只需一键&#xff0c;即可在各个分表生成返回总表的按钮。 示例代码如下&#xff1a; Sub Mybutton()Dim …

房市复兴?新增贷款暴跌九成,房市接盘侠悠着点!

就在各方都认为在诸多利好政策支持下&#xff0c;房市正在复兴&#xff0c;一些分析数据似乎也显示出好转迹象&#xff0c;然而相比起这些数据&#xff0c;新增贷款或许更能证明房市的处境&#xff0c;比其他指标更具说服力。 5月份的数据显示&#xff0c;中国的新增贷款仅514亿…

Mamba: Linear-Time Sequence Modeling with Selective State Spaces论文笔记

文章目录 Mamba: Linear-Time Sequence Modeling with Selective State Spaces摘要引言 相关工作(SSMs)离散化计算线性时间不变性(LTI)结构和尺寸一般状态空间模型SSMs架构S4(补充)离散数据的连续化: 基于零阶保持技术做连续化并采样循环结构表示: 方便快速推理卷积结构表示: 方…

海报设计师的福音来了,微软联合清华北大提出Glyph-ByT5-v2,可支持多国语言图文海报生成,效果惊艳!

清华&北大&微软&利物浦大学联合提出Glyph-ByT5-v2这款工具支持多语言图文生成&#xff0c;包括英语、中文、日文、韩文、法文、德文、西班牙文、意大利文、葡萄牙文和俄文。 以下分别展示中、英、日、韩图文的视觉文本结果一起带大家感受一下。 相关链接 论文地址…

6G时代,即将来临!

日前&#xff0c;由未来移动通信论坛、紫金山实验室主办的2024全球6G技术大会在南京召开。本次大会以“创新预见6G未来”为主题&#xff0c;在大会开幕式上发布了协力推进全球6G统一标准行动的倡议和紫金山科技城加速培育以6G技术引领未来产业行动计划。 在我国已开展第五代移动…

苹果手机safari浏览器的userAgent显示为电脑的userAgent问题解决

目录 1.问题背景 2.userAgent 3.解决 1.问题背景 开发了一个H5&#xff0c;是通过生成二维码&#xff0c;扫描这个二维码后就跳到这个H5&#xff0c;所以需要判断一下扫描的设备是否为手机&#xff0c;然后由于业务逻辑还需要判断一下手机是Android、iOS还是iPad。一般前端…

Shell 编程之条件语句

Shell 编程之条件语句 一、条件测试操作test命令文件测试整数值比较字符串比较逻辑测试 二、if条件语句单分支 if 语句双分支 if 语句多分支 if 语句 三、case 分支语句case语句的结构case 语句应用示例 四、注意事项 在Shell编程中&#xff0c;条件语句是非常重要的一部分&…

Docker 下载与安装以及配置

安装yum工具 yum install -y yum-ulits配置yum源 阿里云源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Docker 17.03后为两个版本&#xff1a; 社区版&#xff08;Community Edition&#xff0c;缩写为 CE&#x…

获取时间戳是使用System.currentTimeMillis()还是使用new Date().getTime()(阿里开发规范)?

1.阿里规范 在阿里的Java开发手册中强制要求使用System.currentTimeMillis() 2.为什么(源码详解) new Date().getTime()它实际上也是调用的System.currentTimeMillis()&#xff0c;源码分析。 这个fastTime是它的成员变量&#xff0c;在new Date()的时候就被赋值了。 扩展一…