MyBatis 的基本使用、增删改查(一)

2023-11-19

1.ORM 、Mybatis

ORM:对象关系映射,这个通俗点讲其实就是数据库的表和实体类相互映射的关系。这个了解一下就行,不重要。

Mybatis: 基于java的持久层框架。

2.Mybatis 的入门使用

这边没有集成spring、springboot。直接用jar 写入门案例

这边使用到的jar是

mybatis的核心配置文件MyBatisConfig.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>
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.666.99.125/product"/>
                <property name="username" value="product"/>
                <property name="password" value="zhangxin"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="HeroMapper.xml"/>
    </mappers>
</configuration>

 实体类对象hero

package com.zx;

public class Hero {
    private String name;
    private String nickName;

    public Hero() {
    }

    public Hero(String name, String nickName) {
        this.name = name;
        this.nickName = nickName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    @Override
    public String toString() {
        return "Hero{" +
                "name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                '}';
    }
}

hero的mapper HeroMapper.xml

<?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">

<mapper namespace="HeroMapper">
     <select id="selectAll" resultType="com.zx.Hero">
         select * from Hero
     </select>
</mapper>

最后就是执行程序,这边就是简单介绍一下怎么使用,后面会解释每个组件怎么用的。

package com.zx;

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;
import java.util.List;

public class HeroTest {
    public static void main(String[] args) throws IOException {
        //加载配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        //获取sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //通过工厂获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取mapper.xml里的查询语句
        List<Hero> heros = sqlSession.selectList("HeroMapper.selectAll");
        //遍历数据库
        heros.forEach(c-> System.out.println(c.toString()));
        //关闭资源
        sqlSession.close();
        is.close();
    }
}

3. Mybatis的Api

3.1 Resource

这边用什么类加载器其实无所谓,知道这个原理就行,其实用java的启动类加载器也是可以的。

InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

//上面和下面其实效果是一样的,只不过Resources给我们封装好了
        ClassLoader classLoader = HeroTest.class.getClassLoader();
        InputStream resourceAsStream = classLoader.getResourceAsStream("MyBatisConfig.xml");

3.2 sqlSessionFactory

这边其实就根据配置文件建立了一个工厂,后面你要与数据库的链接,就问工厂要。

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

3.3 sqlsession

这个对象就可以理解为一个与数据库的链接。有了这个链接就可以愉快的增删改查了,sqlsession还可以管理事务,以及接口代理。

3.4 HeroMapper.xml详解、增删改

下面呢我会从增删改查的写法

3.4.1查询

带参数查询例子

   <select id="selectById" resultType="com.zx.Hero" parameterType="java.lang.String">
        select * from Hero where name = #{name}
    </select>
//获取mapper.xml里的查询语句
        Hero yauso = sqlSession.selectOne("HeroMapper.selectById", "亚索");

3.4.2 新增

这边的重点就是提交事务,其他都一样

 <insert id="newHero" parameterType="com.zx.Hero">
        INSERT into Hero VALUE (#{name},#{nickName})
    </insert>
sqlSession.insert("HeroMapper.newHero",new Hero("劫","儿童劫"));
        sqlSession.commit();

3.4.3 修改

//通过工厂获取sqlSession,这边我开启了自动提交事务的功能
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        sqlSession.update("HeroMapper.updateHero",new Hero("劫1","儿童劫"));
   <update id="updateHero" parameterType="com.zx.Hero">
        update Hero set name = #{name} where nickName=#{nickName}
    </update>

3.4.4 删除

我这边开启了自动提交事务,如果你不是自动提交的话请手动commit

  <delete id="deleteHero" parameterType="com.zx.Hero">
        delete from Hero where name = #{name}
    </delete>
        sqlSession.delete("HeroMapper.deleteHero",new Hero("劫1",null));

3.5 核心配置文件详解

3.5.1 用配置文件管理数据库的链接信息

这个常规操作没什么可说的。

配置文件信息如下显示

 3.6 起别名

起了别名之后,我们映射的xml可以这样配置,就可以不用写那么长的类了,简洁一点

  这边mybatis给我们起好了一些别名,可以直接使用

3.7 集成Log4j配置文件

核心配置文件里面配置log4j的设置

 log4j的配置文件

log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.ConversionPattern=%5p [%t] - %m%n

3.Mybatis进阶

3.1 接口代理

符合mybatis的四个规则就可以使用接口代理功能

  1. 名称空间必须与Dao的全类名一致
  2. 配置文件的id 必须和接口方法名称一致
  3. 配置文件的parameterType 和 接口方法的入参一致
  4. 配置文件的resultType和接口方法的返回值一致

下面会用图演示一下

实现类的代码

package com.zx.Service.Impl;

import com.zx.Hero;
import com.zx.Mapper.HeroMapper;
import com.zx.Service.HeroService;
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;
import java.util.List;

public class HeroServiceImpl implements HeroService {
    public List<Hero> selectAll(){
        //加载配置文件
        InputStream is = null;
        SqlSessionFactory sqlSessionFactory = null;
        //通过工厂获取sqlSession
        SqlSession sqlSession = null;
        //遍历数据库
        List<Hero> heros = null;
        try {
            is = Resources.getResourceAsStream("MyBatisConfig.xml");
            //获取sqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

            sqlSession = sqlSessionFactory.openSession(true);
            //这边是核心的部分,这边拿到HeroMapper的class
            HeroMapper heroMapper = sqlSession.getMapper(HeroMapper.class);
            heros = heroMapper.selectAll();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(sqlSession!=null){
                //关闭资源
                sqlSession.close();
            }
            try {
                if(is!=null){
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        heros.forEach(c-> System.out.println(c.toString()));
        return heros;
    };
}

源码解析一下 使用的是动态代理模式,这边感兴趣的同学可以深入了解一下

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis 的基本使用、增删改查(一) 的相关文章

随机推荐

  • OkHttp工具类在微服高并发场景中问题实践总结

    OkHttp工具类在微服高并发场景中问题实践总结 问题场景 我的应用是一个中间业务应用XXApp 一个交易请求进来需要依赖下游应用 采用http协议通讯方式 需要调用3 4次下游请求 老XXApp在生产上有大量Close wait问题 可以
  • 怎么用python画sin函数图像_如何使用python的matplotlib模块画正弦函数图像

    python是一个很有趣的语言 可以在命令行窗口运行 python中有很多功能强大的模块 这篇经验告诉你 如何利用python的matplotlib模块 绘制正弦函数y sin x 的图像 工具 原料 windows系统电脑一台 pytho
  • Android 实战项目分享(一)用Android Studio绘制贝塞尔曲线的艺术之旅

    一 项目概述 欢迎来到创意之源 我们精心打造的绘图应用程序将带你进入一个充满艺术和技术的奇妙世界 通过使用Android Studio 我们实现了绘制贝塞尔曲线的功能 让你能够轻松创作出令人惊叹的艺术作品 不论你是热爱绘画的大学生还是渴望学
  • SyntaxError: can't assign to operator

    变量名不能有
  • 计算机图像视频处理

    计算机图像视频处理 计算机视觉概论 计算机视觉概念 计算机图像处理 也即数字图像处理 Digital Image Processing 是指将图像信号转换成数字信号并利用计算机对其进行处理的过程 是通过计算机对图像进行去除噪声 增强 复原
  • CVPR 2018

    感谢阅读腾讯 AI Lab 微信号第 32 篇文章 CVPR 2018上涌现出非常多的优秀论文 腾讯 AI Lab 对其中精华文章归类与摘要 根据受关注程度 对生成对抗网络 视频分析与理解和三维视觉三大类论文进行综述 第一部分 生成对抗网络
  • 强网杯 2019]随便注 【SQL注入】四种解法

    题目简介 题目名称 强网杯 2019 随便注 1 题目平台 BUUCTF 题目类型 Web 考察知识点 SQL注入 解题步骤 方法一 首先启动并访问靶机 有一个输入框 随便输入1 or 1 1 测试一下是否存在sql注入 提交后提示erro
  • 前端八股文-Nodejs介绍,组成,架构和依赖,特点,运行环境安装,包和NPM,NPM包的版本管理,V8 引擎 和 libuv 库,BFF 中间层,服务端渲染,

    01 Node js介绍 前言 Node 的重要性已经不言而喻 很多互联网公司都已经有大量的高性能系统运行在 Node 之上 Node 凭借其单线程 异步等举措实现了极高的性能基准 此外 目前最为流行的 Web 开发模式是前后端分离的形式
  • 一文搞定Mysql+Navicat16长期免费直连数据库安装教程

    一 Mysql安装包的下载 这里下载的是mysql8版本 第一个安装包比较小 第二个安装包比较大 因为包含调试工具 我这里下载的是第一个 二 解压并配置安装目录 这里浏览器默认的下载路径是TempEdgeDownload 把解压后的文件夹移
  • Bison解析sql

    Bison文件组成 主要分为3部分 1 序言 Prologue 声明全局标识符 定义数据类型 变量和宏 包含头文件 等 声明 declarations 声明终结符 非终结符 运算符的优先级 符号语义值的各种类型 2 语法 Grammar r
  • 3500+人工智能公司“大阅兵”,地表最强AI人才都去了哪里

    图片来源 由无界AI生成 作者 Lightspeed 编译 椎名 编辑 Zuri 人人都想拥有属于自己的生成式AI工具 但是全球只有极少人 能够真正构建出大型语言模型 新的AI应用基础设施和支持技术 这不但需要一套新的 特殊的技术能力 更需
  • 非线性拟合lsqcurvefit、nlinfit

    问题 有些时候我们需要拟合一些非线性的表达式 比如 我们知道一个表达式的式子是y A sin x exp x B log x 现在我们手里面有x与y对应的一大把数据 我们如何根据x y的值找出最佳的A B值 则我们现在借助Matlab的函数
  • Java学习

    Java之AJAX概念和实现方式 开发工具与关键技术 MyEclipse 10 java 作者 刘东标 撰写时间 2019 06 12 1 概念 Asynchronous JavaScript And XML 异步的JavaScript和X
  • 睿智的seq2seq模型2——利用seq2seq模型实现英文到法文的翻译

    睿智的seq2seq模型2 利用seq2seq模型实现英文到法文的翻译 学习前言 seq2seq简要介绍 英文翻译到法文的思路 1 对英文进行特征提取 2 将提取到的特征传入到decoder 3 将 t 作为起始符预测第一个字母 4 逐个字
  • 计算资源合并模式——云计算架构常用设计模式

    背景 云计算的解决方案中 最初设计可能有意遵循关注点分离的设计原则 把操作分解为独立的计算单元以便可以单独托管和部署 然而 虽然这种策略可以帮助简化解决方案的逻辑实现 但是在同一个应用程序中要部署大量的计算单元 这会增加运行时的托管成本 并
  • 性能测试大致分为以下六种

    性能测试大致分为以下六种 第一种是Benchmark 标杆测试 又叫基准测试 主要是测试一些基础数据 给进一步建立性能模型提供依据 一般测试人员按照1并发用户来执行脚本 校验脚本正确与否 为之后的压力测试和负载测试做准备 第二种是Load
  • 传奇修改数据库后服务器异常,DBserver提示物品数据库加载错误的解决方法

    DBserver exe程序是传奇服务端 什么是传奇服务端 中负责人物数据库处理的重要程序 也是我们运行服务端时第一个启动的程序 但由于现在的数据库名不统一还有服务端路径的不同 经常在运行时提示 Exception 物品数据库加载错误 在我
  • centos7 RTNETLINK answers: File exists 解决办法

    首先说一下本人遇到的问题 我是通过克隆虚拟机安装的服务器 已将 etc sysconfig network scripts ifcfg eno16777736 的UUID这一行删除 因为每张网卡的mac地址是不一样的 所以UUID也是不一样
  • 全卷积神经网络( FCN ):语义分割深度模型先驱

    语义分割 简单地说 分割就是抠图 语义分割 是像素级别地给物体分类 现在ps已经集成了很多自动分割的功能 摄像头采集到车前景象 通过模型分析 我们可以自动筛选出地面 交通线 人行道 行人 建筑 树 以及其他基础设施 在上图 我们可以看到地面
  • MyBatis 的基本使用、增删改查(一)

    1 ORM Mybatis ORM 对象关系映射 这个通俗点讲其实就是数据库的表和实体类相互映射的关系 这个了解一下就行 不重要 Mybatis 基于java的持久层框架 2 Mybatis 的入门使用 这边没有集成spring sprin