首页 > 其他分享 >学习笔记-MyBatis 的使用

学习笔记-MyBatis 的使用

时间:2024-07-22 22:53:45浏览次数:11  
标签:配置文件 笔记 学习 mybatis org MyBatis import public

目录

为什么要用MyBatis ?

传统的 JDBC 七个步骤

优化 JDBC 操作

优化空间

什么是MyBatis ?

使用MyBatis

1. 引入第三方依赖

2. 修改配置

3. 创建Mapper 层 (Dao层)

4. 写 SQL 映射文件

测试

注册 Mapper 层映射文件

设置带参方法

优化 MyBatis 操作过程

Service 业务层

Controller 控制层

增删改记录注意事项

开启提交事务

自动提交

手动提交

优化 MyBatis 

一、引入第三方依赖

二、新建 mybatis-spring 配置文件

三、修改 mybatis 配置文件

四、修改 web.xml 配置文件


为什么要用MyBatis ?

传统的 JDBC 七个步骤

1. 加载驱动

2. 获取数据库连接

3. 创建SQL 语句

4. 获取可执行对象

5. 执行SQL语句

6. 获取结果集

7. 释放资源

优化 JDBC 操作

对 1,2,7 进行了优化,数据库连接工具类 ->  再次优化,创建了连接池

 3,4,5,6 做了通用的查询等方法,从数据库查询出来的记录封装为 POJO 对象,也就是ORM映射

优化空间

1. 因为数据库连接池是自己手写的,连接数量是固定的,这一点不好,如果访问数量太多,就会不够用,如果访问数量很少,就浪费了。解决办法:使用 C3P0 或者 Druid 数据库连接池技术

2. 查询获取结果集后,需要写遍历结果集,再通过 new 或者 反射创建POJO对象,封装结果集

3. SQL 硬编码,SQL 语句写在代码里,耦合度太高,如果项目上线后需要修改,需要重新打包上线

那怎么解决这些问题呢?

这就可以用到了 MyBatis

什么是MyBatis ?

MyBatis  是一个优秀的基于 Java 的持久层框架,也就是我们说的Dao层,它内部封装了 JDBC,使开发者只需要关注 SQL 语句本身,而不需要花费精力,去处理加载驱动、创建连接、创建statement等繁杂的过程。

MyBatis 中文网 官网

使用MyBatis

新建项目

1. 引入第三方依赖

打开 pom.xml 配置文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.shao</groupId>
  <artifactId>ecard-back</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>ecard-back Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.14</version>
    </dependency>

    <dependency>
      <groupId>com.mysql</groupId>
      <artifactId>mysql-connector-j</artifactId>
      <version>8.0.32</version>
    </dependency>

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>2.0.49</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.30</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId> <!--Spring 的ioc容器-->
      <version>5.3.30</version>
    </dependency>

  </dependencies>
  <build>
    <finalName>ecard-back</finalName>
  </build>
</project>

2. 修改配置

新建 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>

</configuration>

打开官网看文档怎么配置

修改配置

3. 创建Mapper 层 (Dao层)

新建一个Mapper包,创建AdminMapper接口 ,定义一个功能的名字

在 resources 包 创建一个文件夹,创建一个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="com.Mapper.AdminMapper">

</mapper>

下载 MyBatisX 插件 

4. 写 SQL 映射文件

鼠标放在波浪线上,点击 Generate statement ,选择操作类型,例如 select ,系统会自动创建配置文件的 SELECT 标签

定义 SQL 语句

测试

创建测试类

package com.Test;

import com.Mapper.AdminMapper;
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;

public class test {
    public static void main(String[] args) {
        // 实现使用 MyBatis 进行数据库操作
        /*
        * 1. 读取配置文件
        * 2. 创建SqlSessionFactoryBuild 工厂建造器(创建连接工厂用的)
        * 3. 创建连接工厂
        * 4.创建一个连接
        * 5.通过连接获取mapper对象,调用mapper对象的方法
        * */

        try {
            // 通过资源文件路径获取InputStream,用于构建SqlSessionFactory
            InputStream rsa = Resources.getResourceAsStream("mybatis-config.xml");
            // 创建SqlSessionFactoryBuilder实例
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            // 使用Builder模式构建SqlSessionFactory
            SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(rsa);
            // 创建一个数据库连接
            SqlSession SqlSession = sessionFactory.openSession();
            // 通过SqlSession获取AdminMapper接口的实现,用于执行SQL操作
            // 通过动态代理实现AdminMapper接口
            AdminMapper mapper = SqlSession.getMapper(AdminMapper.class);
            // 调用GetAdminCount方法
            int count = mapper.GetAdminCount();
            System.out.println("记录条数:"+count);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行报错,这是因为没有注册接口

注册 Mapper 层映射文件

在 mybatis-config.xml 配置文件注册,把 Mapper 层的映射文件注册到 mybatis 

测试成功

设置带参方法

参数两个及以上需要加上 @Param 注解

参数是集合,也需要加上注解

优化 MyBatis 操作过程

在测试类中,有些代码是需要更改的,例如 调用接口里的 GetAdminCount 方法,调用其他方法怎么办?总不能修改后再调用吧 

创建 mybatis 工具类,通过工具类动态的调用方法

package com.Util;

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;
public class mybatisUtil {
    private static SqlSession SqlSession;
    static {
        // 通过资源文件路径获取InputStream,用于构建SqlSessionFactory
        InputStream rsa = null;
        try {
            rsa = Resources.getResourceAsStream("mybatis-config.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 创建SqlSessionFactoryBuilder实例
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 使用Builder模式构建SqlSessionFactory
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(rsa);
        // 创建一个数据库连接
        SqlSession = sessionFactory.openSession();
    }
    public static <T> T getMapper(Class<T> clazz) {

        return SqlSession.getMapper(clazz);
    }
}

在业务层通过调用 mybatis 工具类,获取 Mapper 对象,再通过 Mapper 调用方法

Service 业务层

创建一个包,创建一个Service 接口,创建一个实现接口的包

创建 DTO 类 

package com.Util;

public class responseDTO {
    private int status;
    private Object data;
    private String message;
    private int count;
    public responseDTO() {
    }

    public responseDTO(int status, Object data, String message, int count) {
        this.status = status;
        this.data = data;
        this.message = message;
        this.count = count;
    }


    /**
     * 获取
     * @return statusCode
     */
    public int getStatus() {
        return status;
    }

    /**
     * 设置
     * @param status
     */
    public void setStatus(int status) {
        this.status = status;
    }

    /**
     * 获取
     * @return data
     */
    public Object getData() {
        return data;
    }

    /**
     * 设置
     * @param data
     */
    public void setData(Object data) {
        this.data = data;
    }

    /**
     * 获取
     * @return statusMsg
     */
    public String getMessage() {
        return message;
    }

    /**
     * 设置
     * @param message
     */
    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * 获取
     * @return count
     */
    public int getCount() {
        return count;
    }

    /**
     * 设置
     * @param count
     */
    public void setCount(int count) {
        this.count = count;
    }

    public String toString() {
        return "responseDTO{status = " + status + ", data = " + data + ", message = " + message + ", count = " + count + "}";
    }
}

创建 Service 接口的实现类

Controller 控制层

 1. 新建 spring.xml 配置文件

2. 修改 Tomcat 的 web.xml 配置文件

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

<display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring.xml</param-value>
    </init-param>

    <!--启动Ioc 容器-->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

 

3. 获取 Servcie 层实现类的 Bean,创建 Controller 类

通过 spring 工具类手动获取

1. 创建 spring 工具类

 2. 创建控制层

通过 @Autowired 注解自动获取

1. 控制层

package com.Controller;

import com.Service.AdminService;
import com.Util.responseDTO;
import com.alibaba.fastjson2.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/Admin")
public class AdminController {

    @Autowired
    AdminService adminService;  // 注解告诉Spring框架自动将 AdminService 接口的实现类的实例注入到该字段中,无需手动创建对象。
    @RequestMapping("/Login")
    @ResponseBody
    public String Login(String account, String password){

        // 调用业务层
        responseDTO responseDTO = adminService.Login(account, password);
        // 返回数据
        return JSON.toJSONString(responseDTO);
    }
}

@Autowired 注解告诉 Spring 框架自动将 AdminService 业务层接口的实现类 的实例注入到字段中,无需手动创建对象

当一个类使用 @Autowired 注解时,Spring的IoC容器会自动查找与注解的类型相匹配的bean,并将其注入到相应的字段、构造函数或方法参数中

配置 Tomcat 

测试

登录成功

增删改记录注意事项

Mapper 层

定义SQL语句

Service 层

控制层

提交成功

数据库没有新增记录

开启提交事务

为什么返回成功信息,数据库却没有新增记录呢?

这是因为,增删改都会涉及到数据修改,为了安全,MyBatis 默认开启了事务,但是没有设置自动提交,所以我们需要手动提交或者开启自动提交

自动提交

在mybatis 工具类修改 openSession 的参数

手动提交

在 Service 层调用工具类获取 SqlSession 开启提交事务

成功添加

优化 MyBatis 

每次新建一个 Mapper 层的映射文件都需要 在 mybatis 配置文件中注册映射文件

每次通过 工具类获取 Mapper 层的实例

那可以让它自动注册到 MyBatis 吗?

可以通过注解自动获取 Mapper 层的实例吗?

可以的,MyBatis 提供了 MyBatis 和Spring 的整合

一、引入第三方依赖
    <!-- MyBatis与Spring的集成库,用于简化MyBatis在Spring环境中的使用 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.1.2</version>
    </dependency>
<!-- Spring的JDBC抽象层,提供统一的数据库访问API,隐藏了数据库连接的细节 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.3.30</version>
    </dependency>
<!-- Druid是一个数据库连接池 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.8</version>
    </dependency>
<!-- Spring的事务管理器 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.3.30</version>
    </dependency>

二、新建 mybatis-spring 配置文件

新建数据库配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:utils="http://www.springframework.org/schema/util"

       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
    <!--配置数据库连接信息-->
    <utils:properties id="db" location="classpath:db.properties"/>

    <!--配置数据源,druid-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="#{db.driver}"/>
        <property name="url" value="#{db.url}"/>
        <property name="username" value="#{db.username}"/>
        <property name="password" value="#{db.password}"/>

    </bean>

    <!-- 配置 mybatis 的 sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--配置数据源 -->
        <property name="dataSource" ref="dataSource"/>
        <!--mybatis 配置文件位置 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!-- mapper 的配置文件-->
        <property name="mapperLocations" value="classpath:Mapper/*.xml"/>
    </bean>

    <!-- mapper 的接口配置,让 spring 接管mapper的实现类-->
    <bean id="mapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <property name="basePackage" value="com.Mapper"/>
    </bean>
</beans>

自动注册 Mapper 层的映射文件

指向 mybatis 配置文件

三、修改 mybatis 配置文件

然后就可以把数据库连接的配置和注册映射文件的配置注销掉了

可是 mybatis-spring.xml 配置文件有被读取吗?没有,

那什么时候需要读取这个配置文件呢?Web 服务器启动时加载这个配置文件

四、修改 web.xml 配置文件

然后就可以使用注解获取 Mapper 层的实例了

标签:配置文件,笔记,学习,mybatis,org,MyBatis,import,public
From: https://blog.csdn.net/LearnTech_123/article/details/140485359

相关文章

  • Java学习——多线程
    1.多线程介绍1.1什么是多线程具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能。1.2并发与并行并行:在同一时刻,有多个指令在多个CPU上同时执行。并发:在同一时刻,有多个指令在单个CPU上交替执行。高并发是什么意思:cpu2核4线程表示可并行处理4......
  • 【笔记】生成函数 · 进阶(EGF)
    写在前面本文除了例题@.1P4389付公主的背包使用OGF其她的均为EGF0约定0.1一些形象的表达收缩:指一个式子由比较复杂的形式变简单。本文中大概率就是指一个生成函数用封闭形式来表达;多项式的平移:对于任意一个多项式\(A(x)\),向左平移\(m\)位指\(\left(A(x)-\s......
  • 嵌入式学习day05
    以下几个位置不允许创建文件和文件夹/:整个linux核心目录/home这里管理家目录,会危害用户数据/mnt/hgfs这个是挂载目录,以后所有的共享和外设都是挂载在这里虚拟机网络模式1.桥接模式网络相关ping语法:ping[选项]目标IP/目标网址说明:测试网络是否畅通执行者:所......
  • C++学习笔记
    -------------------------------------------------------------------给一个无单向不循环链表的首结点l,编写程序反转链表,并返回反转后的链表首结点structllist_node{intval;structllist_node*next;};structllist_node*func(structllist_node*l){......
  • Java基础-学习笔记06
    **06访问修饰符封装继承多态**访问修饰符public公开级别,对外公开protected受保护级别,对子类和同一个包中的类公开default默认级别,无修饰符,向同一个包的类公开private私有级别,只有类本身可以访问,不对外公开修饰符可以用来修饰类中的属性,成员方法以及类只有默认......
  • 《昇思25天学习打卡营第24天|生成式-Pix2Pix实现图像转换》
    Pix2Pix实现图像转换Pix2Pix概述Pix2Pix是基于条件生成对抗网络(cGAN,ConditionGenerativeAdversarialNetworks)实现的一种深度学习图像转换模型该网络学习从输入图像到输出图像的映射,如Isola等人在Image-to-imagetranslationwithconditionaladversarialnetwor......
  • Pandas 和numpy 入门详细笔记
    1.安装和导入1.1安装pipinstallpandaspipinstallnumpy1.2导入importpandasaspdimportnumpyasnp2.数据结构2.1Series(系列)定义:一维标签化数组,可以保存任何数据类型(整数、浮点数、字符串等)。创建Series:#从列表创建s=pd.Series([10,20,30,40]......
  • MPLS-EVPN笔记详述
    目录EVPN简介:EVPN路由:基本四种EVPN路由扩展:EVPN工作流程:1.启动阶段:2.流量转发:路由次序整理:总结:EVPN基本术语:EVPN表项:EVPN支持的多种服务模式:简介:1.PortBased:简介:配置实现:2.VLANBased:简介:配置实现:3.VLANBundle:简介:配置实现:VLAN-AwareBundle:简介:M......
  • OI-Wiki 学习笔记
    算法基础\(\text{Update:2024-07-22}\)复杂度定义衡量一个算法的快慢,一定要考虑数据规模的大小。一般来说,数据规模越大,算法的用时就越长。而在算法竞赛中,我们衡量一个算法的效率时,最重要的不是看它在某个数据规模下的用时,而是看它的用时随数据规模而增长的趋势,即时间复......
  • 高速收发器:PHY层笔记(一)
    笔记:高速收发器的数据位宽通常有:2,4,8字节等;PCIE喜欢的位宽是1DW=4Byte;这里对高速收发器的设计为4Byte也就是32位宽;GT中PHY层的字对齐和掩码处理高速收发器的数据流以SOT开始(和MIPI一样),GT的SOT一般就是K码,标志了开始,其也具有EOT,标志了结束;但与MIPI有很大的不同,GT的K码可......