框架——MyBatis的入门案例

news2025/7/27 4:21:58
  1. 框架概述

1.1什么是框架

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交与的方法;
另一种定义认为,框架是可被应用开发者定制的应用骨架。
前者是从应用方面而后者是从目的方面给出的定义。简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。

1.2框架要解决的问题

框架要解决的最重要的一个问题是技术整合的问题,在J2EE 的 架中,有着各种各样的技术,不同的软件企业需要从J2EE 中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击。而应用是软件企业的核心,是竞争力的关键所在,因此应该将应用自身的设计和具体的 实现技术解耦
这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响。
框架一般处在低层应用平台(如J2EE)和高层业务逻辑之间的中间层

1.3软件开发的分层重要性

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

1.4分层开发下的常见框架

常见的JavaEE开发框架:

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

MyBatis

MyBatis本是apache的一个开源项目Batis,2010年这个项目由apache software foundation 迁移d到了googe code,并且改名为MyBatis。2013年11月迁移到Github。

iBATIS一词来源于"intemer和“abatis的组合,是一个基于Java的持久层框架。BATIS提供的持久层框架包括SQL Maps和DataAccess Objects (DAOs)
作为持久层的框架,还有一个封装程度更高的架就是Hibernate,但这个框架因为各种原因目前在国内的流行程度下降大多,现在公司开发也越来越少使用。目前使用SpringData来实现数据持久化也是一种趋势。

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

Spring MVC

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面,Spring 摇架提供了构建Web 应用程序的全功能MVC模块。使用 Spring 可插入的MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts仰扁挫蹦傍靶哀现在一般不用),Struts2等。

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

spring框架

Spnng挺架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松合性角度而言,绝大部分Java应用都可以从Spring中受益。
  • 目的:解决企业应用开发的复杂性

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

  • 范围:任何Java应用

Spring是一个轻量级控制反转(loC)和面向切面(AOP)的容器框架。

2.MyBatis简介

2.1什么是MyBatis?

MyBatis是一个开源轻量级的数据持久化框架,是JDBC和Hibernate的替代方案。

MyBatis 前身为IBatis,2002 年由 Clinton Begin 发布。2010 年从Apache 移到 Google并改名为 MyBatis,2013 年又迁移到了Github。

  • mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。

  • mybatis通过xml或注解的方式将要执行的各种statement 配置起来并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句最后由mybatis框架执行sql并将结果映射为iava对象并返回。

  • 采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbcapi底层访问细节,使我们不用与jdbcapi打交道,就可以完成对数据库的持久化操作。

  • MyBatis支持定制化SQL、存储过程以及高级映射,可以在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。

MyBatis 的中文官网:https://mybatis.org/mybatis-3/zh/index.html

2.2为什么要使用MyBatis?

MvBatis主要的目的就是简化]DBC操作,并且满足高并发和高响应的要求.

回顾一下DBC代码:

public class GoodsDao {
    private String jdbcdriver="com.mysql.cj.jdbc.Driver";
    private String jdbcurl="jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
    private String jdbcuser="root";
    private String jdbcpassword="root";

    private Connection con=null;
    private PreparedStatement pstm=null;
    private ResultSet rs=null;
    private int row=0;

public Goods FindById(int gid){
        Goods goods=new Goods();
        try {
            //1.加载驱动
            Class.forName(jdbcdriver);
            //2.获取数据库连接
            con=DriverManager.getConnection(jdbcurl,jdbcuser,jdbcpassword);
            //3.编写sql语句
            String sql="select * from t_goods where gid=?";
            //4.预处理对象
            pstm=con.prepareStatement(sql);
            //传参
            pstm.setObject(1,gid);
            //5.执行sql语句
            rs=pstm.executeQuery();
            if (rs.next()){
                //把当前数据行中的数据取出来,存储到Goods对象中
                goods.setGid(rs.getInt("gid"));
                goods.setGname(rs.getString("gname"));
                goods.setPrice(rs.getDouble("price"));
                goods.setMark(rs.getString("mark"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (pstm!=null){
                    pstm.close();
                }
                if (con!=null){
                    con.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return goods;
    }
}

分析以上JDBC存在的问题:

  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题.

  1. sql 语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

  1. 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语的where条件不一定可能多也可能少,修改sql还要修改代码,系统不易维护。

  1. 对结果集解析存在硬编码(查询列名),sl 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。

再次回顾mybatis特点:

  1. mybatis 内部封装了jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载动、创建连接、创建 statement等繁杂的过程。

  1. mybatis 通过 ml或注解的方式将要执行的各种statement 配置起来,并通过 ava对象和statement 中sal 的动态参数进行射生成最终执行的sql语句,最后由mybatis框架执行sgl并将结果映射为java对象并返回。

  1. 采用ORM 思想解决了实体和数据库映射的问题,对 dbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。

3.MyBatis的入门案例

下面我们来用一个入门的案例,了解一下MyBatis的基本操作步骤和使用方法。

查询、增加、删除案例

3.1创建测试的数据库

-- 判断存在即删除数据库
drop database if exists mydb;
-- 创建数据库
create database mydb;
-- 使用数据库
use mydb;

drop table if exists t_user;
-- 创建表
create table t_user(
uid int primary key auto_increment,
username varchar(20),
password varchar(20),
phone varchar(11),
address varchar(50)
);


insert into t_user(username,password,phone,address) values('张三','666','18965423548','南阳');
insert into t_user(username,password,phone,address) values('李四','333','18754263548','许昌');
insert into t_user(username,password,phone,address) values('小美','123','18565234759','信阳');

select * from t_user where username=? and password=?;
select * from t_user;

3.2创建一个Java项目并导入mybatis框架的jar包

在项目中创建一个lib文件夹放入mybatis框架的jar包,并导入项目中。

3.3创建跟表对应的实体类。

在src中创建com.chen.bean包,然后创建User实体类。
package com.zhao.bean;

public class User {
    private Integer uid;
    private String username;
    private String password;
    private String phone;
    private String address;

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    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;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "uid=" + uid +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", phone='" + phone + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

3.4创建针对表操作的接口类。

在src中创建com.chen.dao包,然后创建UserDao的接口,然后在接口中定义针对数据库的增删
改查等操作。
package com.zhao.dao;

import com.zhao.bean.User;

import java.util.List;

public interface UserDao {
    /**
     * 查询所有用户信息
     */
    List<User> selectAll();
     
    int add(User user);

    int delete(int uid);


}

3.5在接口的包中创建对应的mapper映射配置文件。

在dao接口的同目录下创建跟接口名字一样的配置文件。
<?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是映射的dao接口-->
<mapper namespace="com.zhao.dao.UserDao">
    <!--通过select标签进行查询
        id:映射接口的方法名
        parameterType:指定参数的类型(如果集合类型只需指定集合元素的类型即可)
        resultType:指定返回的类型-->
    <select id="selectAll" resultType="com.zhao.bean.User">
        select * from t_user;
    </select>

    <insert id="add" parameterType="com.zhao.bean.User">
        insert into t_user(username,password,phone,address) values(#{username},#{password},#{phone},#{address});
    </insert>
</mapper>

3.6在src目录中创建mybatis框架的核心配置文件。

在src中创建一个文件,命名为SqlMapConfig.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>
    <!--配置环境信息===就是配置连接数据库的参数
        default:指定配置的环境信息的ID,表示默认连接该环境
        -->
    <environments default="mysql">
        <environment id="mysql">
            <!-- 配置事务的处理方式:模式使用JDBC的事务处理-->
            <transactionManager type="jdbc"></transactionManager>
            <!-- 数据源的默认type设置pooled,表示使用连接池-->
            <dataSource type="pooled">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
        <environment id="oracle">
            <transactionManager type=""></transactionManager>
            <dataSource type=""></dataSource>
        </environment>
    </environments>

    <!--mapper配置文件-->
    <mappers>
        <mapper class="com.zhao.dao.UserDao"/>


    </mappers>
</configuration>

3.7在测试类中进行测试

使用mybatis框架需要按照框架的步骤进行。
package com.zhao.test;


import com.zhao.bean.User;
import com.zhao.dao.UserDao;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;


public class UserTest {
    //1.加载核心配置文件的字节输入流
    InputStream stream = null;
    //2.创建SalSessionFactory的构建对象--框架使用的是构建者模式
    SqlSessionFactoryBuilder builder = null;
    //3.通过构建对象加载配置文件的输入流获取SqlSessionFactory
    SqlSessionFactory factory = null;
    //4.通过工厂对象获取SqlSession对象--执行jabc的
    SqlSession sqlSession = null;
    //5.通过SqlSession对象获取接口对应的代理对象
    UserDao userDao = null;
    

    @Before
    public void init() throws IOException {
        //1.加载核心配置文件的字节输入流
        stream = Resources.getResourceAsStream("mybatis.xml");
        //2.创建SalSessionFactory的构建对象--框架使用的是构建者模式
        builder = new SqlSessionFactoryBuilder();
        //3.通过构建对象加载配置文件的输入流获取SqlSessionFactory
        factory = builder.build(stream);
        //4.通过工厂对象获取SqlSession对象--执行jabc的
        sqlSession = factory.openSession();
        //5.通过SqlSession对象获取接口对应的代理对象
        userDao = sqlSession.getMapper(UserDao.class);
    }


    @After
    public void distroy() throws IOException {
        sqlSession.commit();
        sqlSession.close();
        stream.close();
    }
}

查询:

 @Test
    public void testSelectAll() throws IOException {
        //6.通过代理对象执行查询方法
        List<User> userList = userDao.selectAll();
        //7.遍历集合
        for (User user : userList) {
            System.out.println(user);
        }
    }
查询运行结果如下:
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
User{uid=1, username='张三', password='666', phone='18965423548', address='南阳'}
User{uid=2, username='李四', password='333', phone='18754263548', address='许昌'}
User{uid=3, username='小美', password='123', phone='18565234759', address='信阳'}
User{uid=4, username='mybatis', password='333', phone='111', address='来来来'}
User{uid=5, username='mybatis', password='333', phone='111', address='来来来'}
Process finished with exit code 0

增加

@Test
    public void testAdd() throws IOException {

        //定义user对象,封装数据
        User user = new User();
        user.setUsername("mybatis");
        user.setPassword("333");
        user.setPhone("111");
        user.setAddress("来来来");

        int n = userDao.add(user);
        if (n > 0) {
            System.out.println("success");
        } else {
            System.out.println("error");
        }
    }
增加运行结果:
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
success
Process finished with exit code 0

数据库添加成功

删除

@Test
    public void testDelete() throws IOException {
        int n = userDao.delete(4);
        if (n > 0) {
            System.out.println("删除成功");
        }
    }

删除运行结果:

log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
删除成功
Process finished with exit code 0

数据库删除成功:

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

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

相关文章

关基系统国产化全面落地,ZoomEye Pro支持信创资产识别

信创产业发展的核心动力是IT底层架构的独立自主&#xff0c;为了尽快推进关键信息基础设施系统的国产化替代&#xff0c;一方面国家不断推出相关政策&#xff0c;协调各方资源&#xff0c;提供强有力的政策支撑&#xff0c;另一方面也在各关基行业有序推进重要信息基础设施的国…

第四章:面向对象编程

第四章&#xff1a;面向对象编程 4.1&#xff1a;面向过程与面向对象 面向过程(POP)与面向对象(OOP) 二者都是一种思想&#xff0c;面向对象是相对于面向过程而言的。面向过程&#xff0c;强调的是功能行为&#xff0c;以函数为最小单位&#xff0c;考虑怎么做。面向对象&…

2024秋招BAT核心算法 | 详解图论

图论入门与最短路径算法 图的基本概念 由节点和边组成的集合 图的一些概念&#xff1a; ①有向边&#xff08;有向图&#xff09;&#xff0c;无向边&#xff08;无向图&#xff09;&#xff0c;权值 ②节点&#xff08;度&#xff09;&#xff0c;对应无向图&#xff0c;…

抓狂!谷歌账号又又登录异常?给你支招解决

最近&#xff0c;就有很多朋友向东哥反馈说&#xff0c;谷歌账号登录异常了&#xff0c;明明账号密码都是对的&#xff0c;愣是登不上去&#xff0c;严重影响工作进度&#xff0c;很是捉急。所以东哥今天就总结了一份谷歌账号登录异常的解决方案&#xff0c;希望能帮助到大家&a…

CAS详解

CAS详解一 简介二 CAS底层原理2.1.AtomicInteger内部的重要参数2.2.AtomicInteger.getAndIncrement()分析2.2.1.getAndIncrement()方法分析2.2.2.举例分析三 CAS缺点四 CAS会导致"ABA问题"4.1.AtomicReference 原⼦引⽤。4.2.ABA问题的解决(AtomicStampedReference 类…

Eslint、Stylelint、Prettier、lint-staged、husky、commitlint【前端代码校验规则】

一、Eslint yarn add typescript-eslint/eslint-plugin typescript-eslint/parser eslint eslint-config-prettier eslint-config-standard-with-typescript eslint-plugin-import eslint-plugin-n eslint-plugin-prettier eslint-plugin-promise eslint-plugin-react eslint-…

实验四:搜索

实验四&#xff1a;搜索 1.填格子 题目描述 有一个由数字 0、1 组成的方阵中&#xff0c;存在一任意形状的封闭区域&#xff0c;封闭区域由数字1 包围构成&#xff0c;每个节点只能走上下左右 4 个方向。现要求把封闭区域内的所有空间都填写成2 输入要求 每组测试数据第一…

Provisioning Edge Inference as a Service via Online Learning 阅读笔记

通过在线学习提供边缘推理服务 一、论文研究背景、动机和主要贡献 研究背景 趋势&#xff1a;机器学习模型训练从中央云服务器逐步转移到边缘服务器 好处&#xff1a; 与云相比&#xff1a;a.低延迟 b.保护用户隐私&#xff08;数据不会上传到云&#xff09;与on-device相…

如何理解元数据、数据元、元模型、数据字典、数据模型这五个的关系?如何进行数据治理呢?数据治理该从哪方面入手呢?

如何理解元数据、数据元、元模型、数据字典、数据模型这五个的关系&#xff1f;如何进行数据治理呢&#xff1f;数据治理该从哪方面入手呢&#xff1f;导读一、数据元二、元数据三、数据模型四、数据字典五、元模型导读 请问元数据、数据元、数据字典、数据模型及元模型的区别…

数仓治理之数据梳理

目录 1.定义 2.用途作用 3.实施方法 3.1自上而下 3.1.1数据域梳理 3.1.2数据主题梳理 3.1.3 数据实体梳理 3.1.4设计数据模型 3.1.5优点 3.1.5缺点 3.2自下而上 3.2.1需求分析 3.2.2展现 3.2.3分析逻辑 3.2.4数据建模 3.2.5优点 3.2.6缺点 1.定义 “数据梳理”即对…

SpringBoot 如何保证接口安全?

为什么要保证接口安全对于互联网来说&#xff0c;只要你系统的接口暴露在外网&#xff0c;就避免不了接口安全问题。 如果你的接口在外网裸奔&#xff0c;只要让黑客知道接口的地址和参数就可以调用&#xff0c;那简直就是灾难。举个例子&#xff1a;你的网站用户注册的时候&am…

【云原生kubernetes】k8s数据存储之Volume使用详解

目录 一、什么是Volume 二、k8s中的Volume 三、k8s中常见的Volume类型 四、Volume 之 EmptyDir 4.1 EmptyDir 特点 4.2 EmptyDir 实现文件共享 4.2.1 关于busybox 4.3 操作步骤 4.3.1 创建配置模板文件yaml 4.3.2 创建Pod 4.3.3 访问nginx使其产生访问日志 4.3.4 …

I.MX6ULL_Linux_系统篇(27) 系统烧录工具

前面我们已经移植好了 uboot 和 linux kernle&#xff0c;制作好了根文件系统。但是我们移植都是通过网络来测试的&#xff0c;在实际的产品开发中肯定不可能通过网络来运行&#xff0c;因此我们需要将 uboot、 linux kernel、 .dtb(设备树)和 rootfs 这四个文件烧写到板子上的…

Nginx学习 (2) —— 虚拟主机配置

文章目录虚拟主机原理域名解析与泛域名解析&#xff08;实践&#xff09;配置文件中ServerName的匹配规则技术架构多用户二级域名短网址虚拟主机原理 为什么需要虚拟主机&#xff1a; 当一台主机充当服务器给用户提供资源的时候&#xff0c;并不是一直都有很大的用户量&#…

数据库面试题总结——DBA面试battle指南

目录 前言 数据库复制 oracle和pg的同步原理 mysql的同步原理 mysql的GTID 主从架构如何保证数据不丢失 oracle的保护模式 pg的日志传输模​​​​​​​式 mysql同步模式 从库只读 oracle的只读 pg的只读 mysql的只读 索引结构和寻迹 B树索引 索引寻迹 绑定执…

nacos源码入门

nacos官方文档地址&#xff1a;nacos官方文档 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 简单来说&#xff0c;nacos就是一个注册中心、配置中心&#xff0…

灯具照明行业MES系统,助力企业实现数字化转型

灯具照明行业在制造领域&#xff0c;是典型的高科技离散生产制造模式&#xff0c;大部分企业都设置&#xff1a;电源组件、光源组件、或光电一体组件 &#xff0c;工艺以SMT、DIP等。 灯罩主要采用吸塑工艺及模具加工&#xff1b;其它金属的面盖、灯体、灯盒基本都是采用压铸、…

传送点遍历分析

由于《天涯明月刀》的地图较大&#xff0c;所以每个地图中会分布很多的传送点&#xff0c;而这些传送点都可以在访问过地图之后以“御风神行”这类技能进行传送。为了能够很好的利用这类技能&#xff0c;提高外挂的效率&#xff0c;传送点的遍历是必不可少的。 首先找一个可以…

代码随想录算法训练营第七天|454.四数相加II 、 383. 赎金信 、 15. 三数之和 、18. 四数之和

454.四数相加II 454.四数相加II介绍给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a;思路因为是存放在数组里不同位置的元素&#xff0c;因此不需要考虑去重的操作&#xff0c;而…

深度学习算法简要总结系列

今天突发奇想&#xff0c;准备一个总结系列&#xff0c;以备面试只需&#xff0c;嘿嘿&#xff0c;忘了就回来看看&#xff0c;以框架流程为主&#xff0c;不涉及细节、 点云 pointnet 代码仓库 https://github.com/yanx27/Pointnet_Pointnet2_pytorch 参考博客 论文阅读笔记 …