持久层框架(Mybatis)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 持久层框架(Mybatis)


持久层框架

工具和框架

工具:
JDBC -> DbUtils(QueyRunner) -> JdbcTemplate:
功能简单,SQL语句编写在Java代码中,这是硬编码,高耦合。
框架:
框架是整体解决方案。
如何进行事务控制,如何实现查询缓存。框架考虑的就很多。

Jdbc工具

Hibernate

全自动全映射Orm(Object Relation Mapping) 框架,旨在消除Sql,只要告诉它javaBean和对应的数据库中的表,就可以完成映射,但是这样也有他自己的问题,不能优化Sql,无法定制Sql

我们希望sql语句能够交给开发人员来编写,我们还希望Sql不失去灵活性。

Mybatis

Sql与java代码分离,SQL是开发人员控制,只需要掌握好Sql就行了。
Mysql是一个半自动的轻量级的Orm框架

Mybatis开发步骤

基本开发步骤

1、引入Mybatis开发依赖jar包,和mysql数据库驱动包
2、创建Mybatis核心配置文件
3、创建MybatisSQL文件,并将SQL文件注册到核心配置文件中
4、根据Mybatis核心配置文件创建SqlSessionFactory对象
5、Mysql通过SqlSessionFactory.openSession()来获取SqlSession对象
6、Mysql通过sqlSession.selectOne(“命名空间.唯一标识”, 参数);执行SQL并接收处理数据库的返回值。

Mybatis开发实例

1、基本开发实例
(1)添加maven依赖
(2)编写Mybatis核心配置文件
(3)编写SQL文件
(4)整合SQL文件和核心配置文件
(5)创建SqlSessionFactory对象
(6)获取SqlSession对象,SqlSession.method(namespace.id,param)
(7)释放资源
2、函数式接口
(1)添加maven依赖
(2)编写Mybatis核心配置文件
(3)编写SQL文件
(4)整合SQL文件和核心配置文件
(5)创建SqlSessionFactory对象
(6)获取SqlSession对象,SqlSession.getMapper( 编写Mapper接口,通过全限定类名.方法名 绑定 Mapper.xml文件,param)
(7)释放资源
公共部分:
(1)(2)(3)(4)

基本开发实例

  • 依赖文件
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.dashu</groupId>
    <artifactId>mybatis</artifactId>
    <version>V1.0.1</version>
    <dependencies>
        <!--引入druid数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.8</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.37</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>
  • Sql文件
<?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.dashu.mybatis.EmployeeMapper">
    <!--
    id:唯一标识
    resultType:返回值类型
    #{id}:从传递过来的参数中取出id值。这个参数就是id
    -->
    <select id="selectEmp" resultType="com.dashu.bean.Employee">
         select id,last_name lastName,gender,email from tbl_employee where id = #{id}
    </select>
</mapper>
  • 核心配置文件
<?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="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--在类路径下直接写配置文件名-->
        <!--将我们写好的Mapper文件注册到核心配置文件当中-->
        <mapper resource="EmployeeMapper.xml"/>
    </mappers>
</configuration>
package com.dashu.application;
import com.dashu.bean.Employee;
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;
/**
 * @Auther: DaShu
 * @Date: 2021/7/22 21:56
 * @Description:
 */
public class MybatisTest {
    @Test
    public void testOne() throws IOException {
        //创建SqlSessionFactory对象,
        String path = "mybatis-config.xml";//全局配置文件。
        InputStream resourceAsStream = Resources.getResourceAsStream(path);
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获取SqlSession实例,能执行已经映射的SQL语句。
        SqlSession sqlSession = sessionFactory.openSession();
        try {
          //第一个参数:明名空间+id
            Employee employee = sqlSession.selectOne("com.dashu.mybatis.EmployeeMapper.selectEmp", 1);
            System.out.println(employee.toString());//Employee{id=1, lastName='null', email='tom@guigu.com', gender='0'}
            /**
             * 为什么last_name没有值?
             * 因为这个字段和数据库中字段不一致,所以不知道赋值给谁,所以就是null;
             * 解决办法:
             *      (1)起别名。
             * 解决之后:
             *      (1)Employee{id=1, lastName='tom', email='tom@guigu.com', gender='0'}
             * */
        }finally {
            sqlSession.close();//释放资源
        }
    }
}

接口式编程

  • Sql文件
<?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.dashu.mapper.EmployeeMapper">
    <!--
    id:唯一标识
    resultType:返回值类型
    #{id}:从传递过来的参数中取出id值。这个参数就是id
    -->
    <select id="getEmpById" resultType="com.dashu.bean.Employee">
         select id,last_name lastName,gender,email from tbl_employee where id = #{id}
    </select>
</mapper>
  • 函数式接口
package com.dashu.mapper;
import com.dashu.bean.Employee;
import org.apache.ibatis.annotations.Mapper;
/**
 * @Auther: DaShu
 * @Date: 2021/7/23 18:46
 * @Description:
 */
@Mapper
public interface EmployeeMapper {
    public Employee getEmpById(Integer id);
}
  • 实现逻辑
public SqlSessionFactory getSqlSessionFactory() throws IOException {
        //获取SqlsessionFactory对象;
        String path = "mybatis-config.xml";//全局配置文件。
        InputStream resourceAsStream = Resources.getResourceAsStream(path);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        return sqlSessionFactory;
    }
    @Test
    public void testTwo() throws IOException {
        SqlSession sqlSession = null;
        try {
            //获取SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
            //获取SessionFactory对象
            sqlSession = sqlSessionFactory.openSession();
            //获取接口的实现类对象,调用接口的方法。
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
            Employee employee = mapper.getEmpById(1);
            System.out.println(employee);
        } catch (IOException e) {
            e.printStackTrace();
            sqlSession.close();
        }
    }
  • 函数式接口总结

1、函数式接口的函数中Mybatis会为接口创建实现类对象,这是一种代理对象,方法的真正的执行者是代理对象。
2、函数式接口的编写方式是使用的最多的,我们使用这个也是最多的。
3、SqlSession代表和数据库的一次会话,使用这个SqlSession的原生Api还是使用getMapper,这个对象都代表和数据库的一次会话,用完必须关闭,里边有一个getConnection()方法
4、SqlSession和Connection对象一样,都是非线程安全的,非线程安全的话不能把他编写成成员变量,这样的话多线程条件下,不能公用,每次使用都应该获取新的对象。
5、Mapper接口没有实现类,Mybatis会为这个接口生成一个代理对象,这个sqlSession.getMapper(Employee.class)返回的是接口的代理对象,这个代理对象一定是把xml文件和接口绑定起来了的对象。
6、两个重要的配置文件,Mybatis全局配置文件,包含数据库连接池信息,事务管理器信息等系统运行环境,SQL映射文件,这个是必须要有的,里边有每一个SQL语句映射信息,在这个文件中每一个SQL语句,唯一标识和返回的结果和参数都会在SQL语句 中有体现,Mybatis就是通过这类映射文件将SQL抽取出来访问数据库。

Mybatis核心配置文件

引入dtd约束

1、Mybatis配置文件在文档声明处,引入了一个dtd约束文件,他就是用来约束Mybatis核心配置文件中的标签语法规则的。
2、有了约束文件之后,就有提示了,联网的时候文件可以自动导入,没有网络的时候需要和文件下载绑定一下。全局配置文件有一个dtd,sql文件有一个dtd。

Properties标签

1、Properties标签用来引入外部properties类型配置文件的配置。
2、resource:引入类路径下的配置文件,源码包是类路径的开始,就是java包下,编译之后就是classes目录下,我们的Sp项目也是如此。
3、url:引入互联网或者磁盘中的配置文件
4、引入properteis文件之后,通过${key}就可以获取相应的值。
5、Spring整合Mybatis之后,这个连接池配置操作直接交给了Spring来做,非常方便,所有这个标签基本不用了。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
Java 数据库连接 Maven
后端框架学习-----mybatis(使用mybatis框架遇到的问题)
这篇文章总结了在使用MyBatis框架时可能遇到的几个常见问题及其解决方法,包括配置文件注册、接口绑定、方法名匹配、返回类型匹配、Maven资源导出、时区设置和字符编码问题。
|
2月前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
持久层框架MyBatisPlus
50 1
持久层框架MyBatisPlus
|
3月前
|
缓存 Cloud Native 安全
探索阿里巴巴新型ORM框架:超越MybatisPlus?
【10月更文挑战第9天】在Java开发领域,Mybatis及其增强工具MybatisPlus长期占据着ORM(对象关系映射)技术的主导地位。然而,随着技术的发展,阿里巴巴集团推出了一种新型ORM框架,旨在提供更高效、更简洁的开发体验。本文将对这一新型ORM框架进行探索,分析其特性,并与MybatisPlus进行比较。
79 0
|
5月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
5月前
|
Java 数据库连接 mybatis
mybatis框架图
文章介绍了MyBatis框架的起源、发展和其作为持久层框架的功能,提供了MyBatis的框架图以帮助理解其结构和组件。
mybatis框架图
|
5月前
|
安全 Java 数据库连接
后端框架的学习----mybatis框架(3、配置解析)
这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
后端框架的学习----mybatis框架(3、配置解析)
|
5月前
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
5月前
|
Java 数据库连接 测试技术
后端框架的学习----mybatis框架(8、lombok)
这篇文章介绍了如何在MyBatis框架中使用lombok库来简化Java实体类的编写,包括在IDEA中安装Lombok插件、在项目中导入lombok依赖以及在实体类上使用Lombok提供的注解。
|
5月前
|
Java 数据库连接 数据库
后端框架的学习----mybatis框架(6、日志)
这篇文章介绍了如何在MyBatis框架中使用日志功能,包括配置MyBatis的日志实现、使用log4j作为日志工具,以及如何通过配置文件控制日志级别和输出格式。
|
6月前
|
Java 数据库连接 Spring
搭建 spring boot + mybatis plus 项目框架并进行调试
搭建 spring boot + mybatis plus 项目框架并进行调试
110 4