学习笔记-MyBatis 的使用

目录

为什么要用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 层的实例了

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值