Mybatis(1)

news2024/9/23 14:25:10

一. Mybatis概述

原本是Apache的一个开源项目叫iBatis,2010年迁移到Google Code旗下,改名为Mybatis

  1. Mybatis是一款优秀的持久层框架,是对JDBC的封装
  2. Mybatis几乎避免了JDBC所有的手动设置参数以及手动获取结果的操作
  3. Mybatis可以使用注解或XML文件来配置和映射,将数据库中的数据映射成java中的一个对象

二. Mybatis环境搭建

1.创建一张表和表对应的实体类

因为mybatis可以帮我们将数据库中的数据直接封装到一个java对象中,所以我们需要在数据库中创建一张对象表,在java程序中创建一个实体类,以便于mybatis可以将数据封装到对应的实体类产生的对象中

注意:数据库中有哪些数据,实体类中就有哪些属性,并且要生成get和set方法

CREATE TABLE admin(
id INT PRIMARY KEY AUTO_INCREMENT,
account VARCHAR(20) UNIQUE NOT NULL,
PASSWORD VARCHAR(32) NOT NULL,
gender CHAR(1)
)


public class Admin {
    private int id;
    private String account;
    private String password;
    private String gender;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Admin{" +
                "id=" + id +
                ", account='" + account + '\'' +
                ", password='" + password + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}

 2. 导入mybatis和mysql的jar包

        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.2</version>
        </dependency>
            <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>

 3. 创建mybatis全局配置文件

在resources文件夹中创建一个.xml文件,并将下面代码复制到该文件中

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--.dtd文件是用来规定标签语法规范的-->

<configuration>

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/> <!--打印执行日志-->
    </settings>

    <!--为类型配置别名-->
    <typeAliases>
        <package name="com.ffyc.mybatis.model"/>
        <!--<typeAlias type="com.ffyc.mybatis.model.Admin" alias="admin"></typeAlias>-->
    </typeAliases>

    <environments default="development">
       <environment id="development">
           <!--
           事务管理方式:就是一次对数据库操作过程中,执行多条sql的管理
           转账:
              从A账户向B账户转钱
              A-500
              代码 异常
              B +500
               把所有的操作的都成功执行后,在提交事务,让数据库最终执行本次提交的所有sql
           -->
          <transactionManager type="JDBC"/> <!--使用jdbc事务管理-->
           <!--数据库连接池配置
               频繁的创建销毁与数据库的连接对象是比较占用时间和空间
               可以在池子中默认创建若干个连接对象,在请求使用时,直接从连接池中取出一个对象,用完再还回去
               减少创建和销毁的时间开销
           -->
          <dataSource type="POOLED">
              <!--数据库连接-->
              <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
              <property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai"/>
              <property name="username" value="root"/>
              <property name="password" value="root"/>
          </dataSource>
       </environment>
    </environments>

    <!--配置sql映射文件-->
    <mappers>
        <mapper resource="mappers/AdminMapper.xml"></mapper>
    </mappers>

</configuration>

4.定义接口

在Dao层创建一个用于和数据库交互的接口,里面定义一些需要和数据库交互的方法

package com.ffyc.mybatis.dao;

import com.ffyc.mybatis.model.Admin;

import java.util.List;

public interface AdminDao {
    Admin findAdminById(int id); //通过ID查询用户

    List<Admin> findAdmins(); //返回所有用户集合

    void savedAdmins(Admin admin); //新增用户信息
}

5. 创建sql映射文件 

在resources文件夹中,创建一个Mappers文件夹,并在该文件夹中创建一个.xml文件,用于实现上述接口中定义的方法(写sql)

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
                  <!--与接口进行绑定-->
<mapper namespace="com.ffyc.mybatis.dao.AdminDao">

    <insert id="savedAdmins" parameterType="Admin">
        insert into admin(account)values (#{account})
    </insert>

    <select id="findAdminById" parameterType="int" resultType="Admin">
               select * from admin where id = #{id}
    </select>

    <!--使用别名即可
    id值 必须与对应接口中的方法名一致
    parameterType 和接口中的参数类型一致
    resultType 和接口中的返回值类型一致
    -->

    <select id="findAdmins" resultType="Admin">
        select * from admin
    </select>

</mapper>

映射文件创建完成后,一定要将映射文件导入mybatis全局配置文件中

    <!--配置sql映射文件-->
    <mappers>
        <mapper resource="mappers/AdminMapper.xml"></mapper>
    </mappers>

 6. 测试Mybatis

import com.ffyc.mybatis.model.Admin;
import com.ffyc.mybatis.util.MybatisUtil;
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.Reader;
import java.util.List;

public class Test1 {
    public static void main(String[] args) throws IOException {
        //将mybatis.xml文件读入到该文件中
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        //获取sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //创建sqlSession对象
        SqlSession sqlSession = MybatisUtil.getSqlSessionFactory();
        //为接口创建一个代理对象
        AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
        //调用我们自己的方法
        Admin admin = adminDao.findAdminById(1);
        System.out.println(admin);

        List<Admin> admins = adminDao.findAdmins();
        System.out.println(admins);

        Admin admin1 = new Admin();
        admin1.setAccount("aaaaaaaa");
        adminDao.savedAdmins(admin1);
      
        Admin admin2 = new Admin();
        admin2.setAccount("bbbbbbbbbbb");
        adminDao.savedAdmins(admin2);

        sqlSession.commit(); //提交事务
    }
}

三. Mybatis配置详解

 1. mybatis全局配置文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd"> 

<!--.dtd文件是用来规定标签语法规范的-->

上述代码是规定配置文件中能出现哪些标签,如果没有在.dtd文件中出现的标签是不能定义的,否则会报错

<configuration>

</configuration>

mybatis全局配置文件的根标签,所有配置信息都要写到该标签中

<settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/> <!--打印执行日志-->
</settings>

可以在执行时打印执行的日志,就可以具体的看到数据库的执行过程,比如创建了几个数据库连接池对象,什么时候提交的事务等

<!--为类型配置别名-->
<typeAliases>
       <!--name是定义的接口的路径,不包含接口名,这样就可以直接用接口名当返回值或参数类型-->
      <package name="com.ffyc.mybatis.model"/>

       <!--这是第二种方法,type是接口的全类名,alias是定义的别名,可以用别名当做返回值或参数类型-->
      <!--<typeAlias type="com.ffyc.mybatis.model.Admin" alias="admin"></typeAlias>-->
</typeAliases>

 可以为mapper配置文件中的类型起别名,mapper配置文件中的参数类型和返回值类型一般要写全类名,这样会很麻烦,但是我们可以利用上述方案,给类型起别名,这样在配置mapper文件时就可以将类型简写了

<environments default="development">
       <environment id="development">
           <!--
           事务管理方式:就是一次对数据库操作过程中,执行多条sql的管理
           转账:
              从A账户向B账户转钱
              A-500
              代码 异常
              B +500
               把所有的操作的都成功执行后,在提交事务,让数据库最终执行本次提交的所有sql
           -->
          <transactionManager type="JDBC"/> <!--使用jdbc事务管理-->
           <!--数据库连接池配置
               频繁的创建销毁与数据库的连接对象是比较占用时间和空间
               可以在池子中默认创建若干个连接对象,在请求使用时,直接从连接池中取出一个对象,用完再还回去
               减少创建和销毁的时间开销
           -->
          <dataSource type="POOLED">
              <!--数据库连接-->
              <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
              <property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai"/>
              <property name="username" value="root"/>
              <property name="password" value="root"/>
          </dataSource>
       </environment>
    </environments>

上述代码是设置事务的管理方式和数据库建立连接的地址,用到了数据库连接池

事务:在一次与数据库交互的过程中要执行多条sql

如果在执行时,一条sql执行了,但在执行另一条之前遇到了异常,就可能导致另一条sql没有执行,就会导致错误的发生,这就好比,A向B转账,已经扣了A 500 但没有给B加 500 所以为了解决这个问题,在mybatis中,不像之前的JDBC一样会自动提交事务,而是需要我们在所有逻辑都已经执行完,并且不会发生异常的情况下自己提交事务

注意:在于数据库的交互中,如果我们只是提交了sql数据库并不会立即执行该sql,而是当我们提交了事务数据库才会真正执行sql,在mybatis中利用sqlSession对象中的commit方法提交事务

<dataSource type="POOLED">
              <!--数据库连接-->
              <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
              <property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai"/>
              <property name="username" value="root"/>
              <property name="password" value="root"/>
          </dataSource>

这个数据库连接池就是之前定义的与数据库连接所需要的加载驱动,与哪个数据库进行连接,数据库账号和密码,可以看到利用mybatis我们只需要将这些在配置文件配置一次即可

数据库连接池:池,就是一种缓存技术,当用户量比较大时,会频繁的与数据库交互,这样程序就要不停地创建和销毁连接对象,这样会占用大量的时间和空间,为了解决这个问题,我们就利用了这么一种池化思想,提前创建一些连接对象,当用户需要连接上来时,如果池中有空闲的连接对象,就不用创建新的,而是直接将该连接对象分配给这个用户,当这个用户使用完毕时,也不用销毁,而是将标记修改为空闲即可

<!--配置sql映射文件-->
    <mappers>
        <mapper resource="mappers/AdminMapper.xml"></mapper>
    </mappers>

这段代码是将创建的sql映射文件配置到全局的mybatis配置文件中,resource后面跟的是sql映射文件的全名

2. 创建sql映射文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

和mybatis配置文件相同,这段代码同样是规定了可以定义哪些标签在这个sql映射文件中

<mapper namespace="com.ffyc.mybatis.dao.AdminDao">


</mapper>

 <mapper></mapper>标签是配置文件的根标签,所有的配置都写在该文件中,namspqce后面的是接口的全类名

    <insert id="savedAdmins" parameterType="Admin">
        insert into admin(account)values (#{account})
    </insert>

    <select id="findAdminById" parameterType="int" resultType="Admin">
               select * from admin where id = #{id}
    </select>

    <!--使用别名即可
    id值 必须与对应接口中的方法名一致
    parameterType 和接口中的参数类型一致
    resultType 和接口中的返回值类型一致
    -->

    <select id="findAdmins" resultType="Admin">
        select * from admin
    </select>

上面这几个都是为了实现接口中的方法,定义的与数据库进行交互的sql语句,利用这个可以实现与数据库的交互<select></select>标签是查询,<insert></insert>标签是插入,切记id和接口中的方法名一致,parameterType是形参类型,resultType是最终返回值的类型,这里本来是要写全类名的,但由于之前起了别名,所以这里可以直接用接口名Admin当做返回值类型

3. 定义接口

package com.ffyc.mybatis.dao;

import com.ffyc.mybatis.model.Admin;

import java.util.List;

public interface AdminDao {
    Admin findAdminById(int id);

    List<Admin> findAdmins();

    void savedAdmins(Admin admin);
}

接口中主要就是定义一些与数据库交互的方法,声明该方法的形参和返回值,以便于sql映射文件中可以设置好参数类型和返回值,这样mybatis就可以帮我们把数据封装到对象中

4. 测试mybatis

//将mybatis.xml文件读入到该文件中
Reader reader = Resources.getResourceAsReader("mybatis.xml");

将mybatis.xml文件读到类中,这样就可以在该类中使用mybatis配置文件中的信息

//获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

获取sqlSessionFactory对象主要的目的是为了获取sqlSession对象

//创建sqlSession对象
SqlSession sqlSession = MybatisUtil.getSqlSessionFactory();

根据sqlSessionFactory对象获取sqlSession对象,获得sqlSession对象主要是为了获取可以调用方法的代理对象

//为接口创建一个代理对象
AdminDao adminDao = sqlSession.getMapper(AdminDao.class);

根据sqlSession对象获得一个代理对象,根据该代理对象可以调用接口中的方法

注意:接口的代理对象并不是真正的接口的对象,因为接口/抽象类是不能产生对象的,所以这只是一个该接口的代理对象,该对象可以根据配置信息中的路径来找到该方法并通过映射文件找到该方法对应的sql来执行

四. Mybatis Dao层面向接口开发

面向接口开发方式只需要程序员编写接口,由Mybatis框架创建接口的动态代理 对象,使用sqlsession.getMapper(接口.class);获得代理对象

面向接口开发需要遵循以下规范:

1.Mapper.xml文件中的namespace与mapper接口的类路径相同.

2.Mapper接口方法名和Mapper.xml中定义的每个statement的id相同.

3.Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的 parameterType 的类型相同. 4.Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的 resultType 的类型相同.

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

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

相关文章

springboot发送邮箱功能的安全与加密配置?

springboot发送邮箱设置的步骤&#xff1f;springboot发信优势&#xff1f; 为了确保邮件发送过程的安全性和隐私保护&#xff0c;我们需要对 SpringBoot发送邮箱功能进行适当的安全与加密配置。AokSend将详细探讨如何在 SpringBoot项目中实现这些配置&#xff0c;以保障邮件传…

大模型面试题集锦:揭秘阿里24k Star项目背后的争议,非常详细收藏我这一篇就够了

今天分享两个 Github 上开源的不错的项目&#xff0c;以及阿里空 Github 项目的趣闻。 一、开源大模型面试题 大致看了以下&#xff0c;面试题分门别类&#xff0c;还是挺全的。包含 LLM 基础&#xff0c;分布式训练&#xff0c;推理&#xff0c;强化学习等。 二、Awesome Co…

记录|Git工具——下载GitHub项目

目录 前言一、Step 1. 下载Git二、Step2. 用Git Bash 下载到本地更新时间 前言 参考文章&#xff1a; 1、如何使用Git将Github项目拉到本地 2、git 安装、创建仓库、上传项目、克隆下载、常用命令 – 一篇文章总结&#xff08;适用github / gitee&#xff09; 3、Git的使用【入…

2024网页设计教程:最新趋势与实用技巧

网页是每个人访问信息的载体&#xff0c;用户点击的按钮、浏览的导航栏和网页界面的视觉性能都与网页制作有关。良好的网页设计代表了友好的使用体验。个人网页、商业网页和社交媒体平台都应该吸引人们的注意&#xff0c;并提供令人印象深刻的客户体验。本文针对网页制作新手&a…

CentOS7.6单机部署RabbitMQ消息队列——实施方案

1、前期环境准备 1.准备一台主机 IP地址主机名角色内存大小192.168.200.10 rabbitmq 消息队列 2G 2. 设置主机名 hostnamectl set-hostname 主机名suexit Ctrlr 3. 设置IP地址然后重启网卡 vim /etc/sysconfig/network-scripts/ifcfg-ens33systemctl restart network 4.…

【一图学技术】8.图解Git工作流程使用 git 解决团队协作中的冲突问题 git 进行版本控制的最佳实践Git 的高级功能

图解Git的工作流程 一、Git常见命令概述 以下是 Git 常用命令的详细作用、使用例子和使用场景&#xff1a; git add 作用&#xff1a;将工作目录中的更改添加到暂存区。暂存区是一个准备下一次提交的区域&#xff0c;它记录了你想要提交的更改。使用例子&#xff1a;git add …

【机器人】关于钉钉机器人如何进行自定义开发问答【详细清晰】

目标&#xff1a;当用户输入问题并钉钉机器人&#xff0c;钉钉机器人进行相应的回答&#xff0c;达到一种交互问答的效果 开发文档参考&#xff1a;https://open.dingtalk.com/document/orgapp/robot-overview 首先进行登录企业&#xff0c;后面如果没有进行登录&#xff0c;会…

html编写贪吃蛇页面小游戏(可以玩)

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>贪吃蛇小游戏</title><style>body {…

Hadoop,ActiveMQ,RabbitMQ,Springboot Actuator未授权访问漏洞(附带修复方法)

十.Hadoop Hadoop是⼀个由Apache基⾦会所开发的分布式系统基础架构&#xff0c;由于服务器直接在开放了Hadoop 机器 HDFS 的 50070 web 端⼝及部分默认服务端⼝&#xff0c;⿊客可以通过命令⾏操作多个⽬录下的数据&#xff0c;如进⾏删除&#xff0c;下载&#xff0c;⽬录浏览…

LSTM--概念、作用、原理、优缺点以及简单的示例代码

LSTM的概念 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的递归神经网络&#xff08;RNN&#xff09;&#xff0c;最早由Sepp Hochreiter和Jrgen Schmidhuber在1997年提出。LSTM设计的主要目的是解决标准RNN中的长时依赖问题。RNN在处理长序列时&#xff0c…

机房防静电地板和架空网络地板有哪些区别

有好些人把机房防静电地板和网络地板混为一谈&#xff0c;觉的两个就是一样的东西&#xff0c;其实呢&#xff0c;虽说都是高架活动地板&#xff0c;但它们之间的区别大着呢&#xff01;下面和宜缘机房一起来看看防静电地板和网络地板两者都有哪些区别&#xff1f; 1、使用场景…

安全基础学习-RC4加密算法

这里仅仅记录一些基础的概念。后期有需求进一步扩展。 RC4 是一种对称流加密算法&#xff0c;由罗恩里维斯特&#xff08;Ron Rivest&#xff09;于1987年设计。RC4 的设计目的是提供一种简单且高效的加密方法。尽管 RC4 曾经广泛使用&#xff0c;但它的安全性在现代已受到质疑…

精通C++ STL(七):stack和queue的介绍及使用

目录 stack stack的定义方式 stack的使用 queue queue的定义方式 queue的使用 stack stack 是一种容器适配器&#xff0c;专门用于处理后进先出的操作场景。它仅允许在容器的一端进行元素的插入和提取操作。 stack的定义方式 方式一&#xff1a; 使用默认适配器定义栈。 sta…

Linux 进程调度(三)之进程的优先级

目录 一、概述二、进程的优先级1、基础概念2、优先级的意义3、查看优先级4、PRI 和 NI5、修改优先级6、控制进程的优先级的系统调用7、调整优先级的限制 一、概述 在 Linux 中&#xff0c;每个进程都有一个优先级。优先级决定了进程在系统资源分配中的先后顺序。Linux 中的进程…

gin框架中的中断请求c.Abort()方法的作用和使用细节说明

Abort()方法的作用 在gin框架中&#xff0c;如果我们希望中断后续的挂起的请求处理链&#xff08;HandlersChain&#xff09;的请求&#xff0c; 可以使用gin.Context中的这个Abort()方法。请注意&#xff0c;这不会停止当前处理程序。假设您有一个授权中间件&#xff0c;用于…

Vue技术栈-Vue 3 项目组件入门:单文件组件 (SFC)

目录 前言 1.简介 2.安装 Vite 和 Vue 3 3.什么是.vue文件? vue 文件解析 4.什么是VUE的组件? 5.工程化vue项目如何组织这些组件? 6.Vue3关于样式( CSS )的导入方式 7.结语 前言 本篇是在上一篇Vue技术栈-Vite最新版创建一个Vue3项目的基础上的后续,先对Vite这一构…

加密狗创新解决方案助力工业自动化

面临的挑战 早在1991年&#xff0c;COPA-DATA就认识到需要一个既能提供长期保护又能灵活应对的解决方案&#xff0c;以防止软件盗版并确保客户在各种复杂的工业环境下能够顺利使用其产品。这一解决方案不仅要兼容Windows系统&#xff0c;还必须在网络连接受限的情况下&#xff…

Python绘图入门:使用 Matplotlib 绘制折线图

使用 Matplotlib 绘制折线图 数据可视化是数据分析的重要组成部分&#xff0c;通过图表&#xff0c;我们可以更直观地理解数据背后的趋势和模式。Matplotlib 是 Python 最基础也是最常用的绘图库之一&#xff0c;非常适合初学者。本文将带你从零开始&#xff0c;逐步创建和自定…

接口基础知识6:详解http request body(一篇讲完常见请求体)

课程大纲 一、定义 HTTP请求体&#xff08;HTTP Request body&#xff09;&#xff1a;HTTP请求消息的可选部分&#xff0c;仅在请求方法支持且需要发送数据时使用。 POST方法、PUT方法有请求体&#xff0c;GET和HEAD方法没有请求体。 请求头和请求体之间会有一个空行&#…

GA/T1400视图库平台Easy1400软件平台的功能介绍及其应用场景介绍

GA/T 1400标准是中国公安部制定的一系列技术规范&#xff0c;主要针对公安视频图像信息应用系统。这一标准分为多个部分&#xff0c;涵盖了通用技术要求、应用平台技术要求、数据库技术要求等。GA/T 1400视图库标准是为了统一和规范公安系统内视频监控资源的管理和应用&#xf…