01_01_Mybatis的介绍与快速入门

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

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("测试失败");
        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端路线指导(4):前端春招秋招经验分享

春招/秋招经验分享(前端) 哈喽大家好&#xff0c;我是小粉&#xff0c;双一流本科&#xff0c;自学前端一年&#xff0c;收获腾讯&#xff0c;字节等多家大厂offer&#xff0c;一半以上ssp~ 今天给大家分享一下我的春招&#xff08;暑期实习&#xff09;、秋招经历&#xff0c;…

“论多源数据集成及应用”必过范文,软考高级,系统架构设计师论文

论文真题 在如今信息爆炸的时代,企业、组织和个人面临着大量的数据。这些数据来自不同的渠道和资源,包括传感器、社交媒体、销售记录等,它们各自具有不同的数据格式、分布和存储方式。因此如何收集、整理和清洗数据,以建立一个一致、完整的数据集尤为重要。多源数据集成可…

云邮件推送服务如何配置?有哪些优势特点?

云邮件推送的性能怎么优化&#xff1f;如何选择邮件推送服务&#xff1f; 云邮件推送服务是一种基于云计算的邮件发送解决方案&#xff0c;能够帮助企业和个人高效地发送大规模邮件。AokSend将详细介绍如何配置云邮件推送服务&#xff0c;以便你能够充分利用其优势。 云邮件推…

航行在水域:使用数据湖构建生产级 RAG 应用程序

在 2024 年年中&#xff0c;创建一个令人印象深刻和兴奋的 AI 演示可能很容易。需要一个强大的开发人员&#xff0c;一些聪明的提示实验&#xff0c;以及一些对强大基础模型的API调用&#xff0c;你通常可以在一个下午建立一个定制的AI机器人。添加一个像 langchain 或 llamain…

【会议征稿,JPCS出版】第三届电力系统与能源技术国际学术会议(ICPSET 2024,7月5-7)

第三届电力系统与能源技术国际学术会议&#xff08;ICPSET 2024&#xff09;将于2024年7月5-7日在杭州举办。由浙江水利水电学院电机产业学院主办&#xff0c;AEIC学术交流中心承办&#xff0c;湖州市南浔创新研究院、南浔区科技局&#xff08;科协&#xff09;协办 。会议主要…

云安全下的等级保护2.0解决方案

云安全解决方案 知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 ​

操作系统实验二:存储管理(分析XV6分页存储地址变换)

目录 一、实验目的 二、具体任务安排 1.理解XV6内核源码 2.修改XV6内核源码 一、实验目的 分析XV6教学系统分页存储地址变换的实现 二、具体任务安排 1.理解XV6内核源码 &#xff08;1&#xff09;阅读学习通资料中的XV6 guide book第一、第二章或自行查阅相关资料&a…

基于51单片机计步器—无线蓝牙APP上传

基于51单片机计步器设计 &#xff08;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 本设计由STC89C52单片机最小系统ADXL345加速度传感器lcd1602液晶电路蓝牙模块电路呼吸灯电路电源电路组成。 1.通过ADXL345检测步数&#xff0…

嵌入式web 服务器boa的编译和移植

编译环境&#xff1a;虚拟机 ubuntu 18.04 目标开发板&#xff1a;飞凌OKA40i-C开发板&#xff0c; Linux3.10 操作系统 开发板本身已经移植了boa服务器&#xff0c;但是在使用过程中发现POST方法传输大文件时对数据量有限制&#xff0c;超过1M字节就无法传输&#xff0c;这是…

iMazing3软件下载-详细安装教程视频

​值得肯定的是智能备份&#xff1a;iMazing为使用者提供了免费的备份服务&#xff0c;并且支持两种连接方式&#xff1a;USB数据线连接备份和Wi-Fi无线连接&#xff0c;所备份的文件不会被覆盖。我们必须承认iMazing软件特色&#xff1a;使用你的 iOS 设备像外部驱动器。基本上…

诺瓦星云入职认知能力SHL测验Verify职业性格问卷OPQ可搜索带解析求职题库

欢迎您开启诺瓦星云的求职旅程 恭喜您进入测评环节&#xff0c;接下来您需要作答两个测验&#xff0c;分别是职业性格问卷OPQ和认知能力测验Verify&#xff0c;总共用时大约1小时&#xff0c;祝您作答顺利! 【华东同舟求职】由资深各行业从业者建立的一站式人才服务网络平台&a…

LSTM架构的演进:LSTM、xLSTM、LSTM+Transformer

文章目录 1. LSTM2. xLSTM2.1 理论介绍2.2 代码实现 3. LSTMTransformer 1. LSTM 传统的 LSTM (长短期记忆网络) 的计算公式涉及几个关键部分&#xff1a;输入门、遗忘门、输出门和单元状态。 2. xLSTM xLSTM之所以称之为xLSTM就是因为它将LSTM扩展为多个LSTM的变体&#xff…

HackTheBox-Linux基础

Linux 结构 历史 许多事件导致了第一个 Linux 内核的创建&#xff0c;并最终创建了 Linux 操作系统 &#xff08;OS&#xff09;&#xff0c;从 1970 年 Ken Thompson 和 Dennis Ritchie&#xff08;当时都在 AT&T 工作&#xff09;发布 Unix 操作系统开始。伯克利软件发行…

Vue-内容渲染,属性渲染指令

内容渲染 在Vue中渲染元素&#xff0c;用双花括号{{}}的语法进行插值&#xff0c;称之为插值表达式 双花括号会渲染hi里面的值 <body><div id"app">{{hi}}</div> <script>const vm{data(){return{hi:hello world}}}const appVue.createAp…

【Java】已解决java.nio.channels.OverlappingFileLockException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.nio.channels.OverlappingFileLockException异常 在Java的NIO&#xff08;New I/O&#xff09;编程中&#xff0c;java.nio.channels.OverlappingFileLockException是一…

LQR 控制算法应用分析

参考 Optimization Based Control 从基础到复杂地介绍最优控制理论 麻省理工大学机器人算法第八章 LQR 大概说了 lqr 的推导过程&#xff0c;主页有更多算法介绍 wiki LQR 控制器 LQR 多种公式说明 Formulas for discrete time LQR, LQG, LEQG and minimax LQG optimal con…

C语言程序设计-2 程序的灵魂—算法

【例 2.1】求 12345。 最原始方法&#xff1a; 步骤 1&#xff1a;先求 12&#xff0c;得到结果 2。 步骤 2&#xff1a;将步骤 1 得到的乘积 2 乘以 3&#xff0c;得到结果 6。 步骤 3&#xff1a;将 6 再乘以 4&#xff0c;得 24。 步骤 4&#xff1a;将 24 再乘以 5&#xf…

grafana 通过自定义API获取数据

一、安装插件 安装infinity插件 二、配置数据源 三、配置图表 1、数据 这边提供一个go的demo package mainimport ("math/rand""net/http""time""github.com/gin-gonic/gin" )func main() {router : gin.Default()rand.Seed(time.…

Redis数据过期、淘汰策略

数据过期策略&#xff1a; 惰性删除&#xff1a; 设置该key过期时间后&#xff0c;我们不去管它&#xff0c;当需要该key时&#xff0c;我们在检查其是否过期&#xff0c;如果过期&#xff0c;我们就删掉它&#xff0c;反之返回该key。 这种方式对cpu友好&#xff08;只在用…