1. Mybatis基础

news2024/11/19 22:53:58

文章目录

  • 1. Mybatis 简介
  • 2. Mybatis 快速入门
  • 3. 使用 idea 写 SQL
  • 4. Mapper 代理开发
  • 5. MyBatis 核心配置文件

1. Mybatis 简介

MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发。
官方文档:https://mybatis.org/mybatis-3/zh/index.html

持久层:操作数据库的那些代码。
JavaEE三层架构:表现层(页面展示)、业务层(逻辑处理)、持久层。

框架:是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。在框架的基础之上构建软件编写更加高效、规范、通用、可扩展。

2. Mybatis 快速入门

在这里插入图片描述

(1) 用 Navicat 连接 MySQL 创建 user 表,添加数据

create database mybatis;
use mybatis;
drop table if exists tb_user;
create table tb_user(
	id int primary key auto_increment,
	username varchar(20),
	password varchar(20),
	gender char (1),
	addr varchar(30)
);
INSERT INTO tb_user VALUES(1,'zhangsan','123','男','北京');
INSERT INTO tb_user VALUES (2,'李四','234','女','天津');
INSERT INTO tb_user VALUES(3,'王五','11','男','西安');

在这里插入图片描述

(2) 创建模块,导入坐标

<dependencies>
    <!--mybatis依赖-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.6</version>
    </dependency>
    <!--要连接数据库就得需要mysql驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!--JUnit单元测试-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
        <scope>test</scope>
    </dependency>
    <!--添加slf4j日志api-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.20</version>
    </dependency>
    <!--logback:日志相关-->
    <!--添加logback-classic依赖-->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
    <!--添加logback-core依赖-->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.2.3</version>
    </dependency>
</dependencies>

(3) 编写 MyBatis 核心配置文件,替换连接信息,解决硬编码问题
(mybatis-config.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://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"/>
                <!--mybatis:数据库名-->
                <!--jdbc:mysql:///mybatis?useSSL=false"也可以-->
                <property name="url" value="jdbc:mysql://localhost/mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--加载sql映射文件-->
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

(4) 编写 SQL 映射文件,统一管理 SQL 语句,解决硬编码问题
(UserMapper.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:名称空间。不同名称空间里的同名id不冲突-->
<mapper namespace="test">
    <!--resultType:返回类型,应该是User,所以要定义一个User类-->
    <select id="selectAll" resultType="com.itheima.pojo.User">
        select * from tb_user;
    </select>
</mapper>

(5) 编码

① 定义 POJO 类

public class User {
    private Integer id;
    private String username;
    private String password;
    private String gender;
    private String addr;
    //getter、setter 方法
    //toString 方法
}

② 加载核心配置文件,获取 SqlSessionFactory 对象
③ 获取 SqlSession 对象,执行 SQL 语句
④ 释放资源

public class MybatisDemo {
    public static void main(String[] args) throws IOException {
        //加载mybatis核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //获取SqlSession对象,用它来执行SQL
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行SQL
        List<User> users = sqlSession.selectList("test.selectAll");
        System.out.println(users);
        //释放资源
        sqlSession.close();
    }
}

附:日志相关的配置文件(logback.xml)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
        CONSOLE :表示当前的日志信息是可以输出到控制台的。
    -->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%level]  %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
        </encoder>
    </appender>

    <logger name="com.itheima" level="DEBUG" additivity="false">
        <appender-ref ref="Console"/>
    </logger>


    <!--

      level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
     , 默认debug
      <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
      -->
    <root level="DEBUG">
        <appender-ref ref="Console"/>
    </root>
</configuration>

输出结果:
在这里插入图片描述

3. 使用 idea 写 SQL

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. Mapper 代理开发

目的:解决原生方式中的硬编码,简化后期执行 SQL。

(1) 定义与 SQL 映射文件同名的 Mapper 接口,并且将 Mapper 接口和 SQL 映射文件放置在同一目录下。

public interface UserMapper {
}

在项目中,由于 Java 代码和配置文件一般是分开的,所以简单地将 UserMapper 接口和 UserMapper.xml(SQL 映射文件)放在一起是不合理的。

编译 module 后发现,class 文件和 UserMapper.xml(SQL 映射文件)同在 target/classes/com/ 目录下。
在这里插入图片描述

所以编写代码时,可以在 resources 目录下也新建 com/itheima/mapper 目录,并把 UserMapper.xml 放入其中。这样编译后,class 文件就能与 UserMapper.xml 同在 mapper 目录下,也就相当于满足了 “Mapper 接口和 SQL 映射文件放置在同一目录下” 的条件。

在这里插入图片描述

注意:在 resources 中新建目录时,只能 new directory,分隔符不能用 “·”,要用 “/”:
在这里插入图片描述

既然更改了 SQL 映射文件所在目录,就要更改 MyBatis 核心配置文件中加载该文件的路径:
(mybatis-config.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://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"/>
                <!--mybatis:数据库名-->
                <!--jdbc:mysql:///mybatis?useSSL=false"也可以-->
                <property name="url" value="jdbc:mysql://localhost/mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--更改sql映射文件路径-->
        <!--注意:resource下新建的是dictionary,
        分隔符用“/”,不能用“.”-->
        <mapper resource="com/itheima/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

(2) 设置 SQL 映射文件的 namespace 属性为 Mapper 接口全限定名。
(UserMapper.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:名称空间。不同名称空间里的同名id不冲突-->
<!--设置SQL映射文件的namespace属性为Mapper接口全限定名-->
<mapper namespace="com.itheima.mapper.UserMapper">
    <!--resultType:返回类型,应该是User,所以要定义一个User类-->
    <select id="selectAll" resultType="com.itheima.pojo.User">
        select * from tb_user;
    </select>
</mapper>

(3) 在 Mapper 接口中定义方法,方法名就是 SQL 映射文件中 sql 语句的 id,并保持参数类型和返回值类型一致。
(UserMapper 接口)

public interface UserMapper {
    List<User> selectAll();
}

(4) 编码
① 通过 SqlSession 的 getMapper 方法获取 Mapper 接口的代理对象
② 调用对应方法完成 SQL 的执行

public class MybatisDemo {
    public static void main(String[] args) throws IOException {
        //加载mybatis核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //获取SqlSession对象,用它来执行SQL
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取UserMapper接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //调用对应方法完成 SQL 的执行
        List<User> users = userMapper.selectAll();
        System.out.println(users);
        //释放资源
        sqlSession.close();
    }
}

在 mybatis-config.xml 核心配置文件里,需要加载 SQL 映射文件,现在的加载方式要写 SQL 映射文件的路径,一旦映射文件变多(UserMapper.xml,OrderMapper.xml,GoodsMapper.xml…),就会很繁琐。

但是,如果用了 Mapper 代理的方式,就可以用包扫描的简单方式来加载 SQL 映射文件。

<mappers>
     <!--用包扫描的方式来加载 SQL 映射文件-->
     <!--通过接口来找,所以路径中的分隔符用"."-->
     <package name="com.itheima.mapper"/>
 </mappers>

输出结果:

在这里插入图片描述

5. MyBatis 核心配置文件

在 mybatis-config 中,environments 用于配置数据库连接环境信息。它的内部可以配置多个 environment,通过 default 属性切换不同的 environment。

<environments default="test">

    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <!--mybatis:数据库名-->
            <!--jdbc:mysql:///mybatis?useSSL=false"也可以-->
            <property name="url" value="jdbc:mysql://localhost/mybatis?useSSL=false"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </dataSource>
    </environment>
    
    <environment id="test">
        <!--...-->
    </environment>
    
</environments>

在 UserMapper.xml 中,select 语句的 resultType 原本是 com.itheima.pojo.User,可以进行简化,方法是:
先在 mybatis-config.xml 中设置类型别名,相当于给 pojo下面的所有实体类都取了别名。别名默认是类名,不区分大小写,使用时可以不带所在包的名称。

在这里插入图片描述

下面是一些为常见的 Java 类型内建的类型别名,都是不区分大小写的。
注意,为了应对原始类型的命名重复,采取了特殊的命名风格。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在 mybatis 核心配置文件(mybatis-config.xml)中,各个标签要遵守的前后顺序:

在这里插入图片描述

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

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

相关文章

GoogLeNet——网络实战

文章目录摘要&#x1f407;1 项目结构&#x1f407;2 划分训练集和测试集&#x1f407;3 计算mean和Standard&#x1f407;3.1 标准化的作用&#x1f407;3.2 归一化的作用&#x1f407;4 训练&#x1f407;4.1 导入项目使用的库&#x1f407;4.2 设置随机因子&#x1f407;4.3…

Java单例模式演示与理解

目录单例模式1、饿汉式2、懒汉式3、DSL懒汉式&#xff08;双重锁懒汉模式&#xff09;静态内部类懒汉式单例模式的如何破坏4、使用枚举类单例模式 为什么使用单例模式&#xff1f; 单例模式确保一个类在内存中只会有同一个实例对象存在。不管声明获取实例对象多少次都是内存中…

2023年网络安全八大预测!

随着创新技术的不断兴起&#xff0c;以及网络犯罪的日益专业化&#xff0c;网络安全攻击风险仍在持续增长。可以预见&#xff0c;2023年的网络安全形势依然严峻&#xff0c;需要国家不断完善网络安全政策和法规&#xff0c;网络安全企业积极创新网络安全防护技术。瑞数信息作为…

Allegro如何导出和导入器件模型Signal_Model操作指导

Allegro如何导出和导入器件模型Signal_Model操作指导 在用Allegro做PCB设计的时候,通常需要给器件加上Signal_Model,在做等长的时候用到的非常频繁。 Allegro除了可以给器件添加模型,还支持从一块加好模型的BRD导入到另外一块BRD中, 如下图,需要把R7002的Signal_Model导入…

剪报浏览器:可以自己设计网页的浏览器

总的功能就是一句话“不同网站的精华内容裁剪下来&#xff0c;合并到一处浏览”把自己关注的网页版块从不同网站上裁剪下来放在一个页面里&#xff0c;一次刷新就可以看到不同网站的最新内容&#xff0c;而不用逐个打开网站去看&#xff0c;提高了上网的效率。关键特征汇聚浏览…

排序算法(带动图)

0、算法概述0.1 算法分类十种常见排序算法可以分为两大类&#xff1a;比较类排序&#xff1a;通过比较来决定元素间的相对次序&#xff0c;由于其时间复杂度不能突破O(nlogn)&#xff0c;因此也称为非线性时间比较类排序。非比较类排序&#xff1a;不通过比较来决定元素间的相对…

【数据结构初阶】第七篇——二叉树的顺序结构及实现(堆的向下,向上调整算法)

二叉树的顺序结构 堆的概念及结构 堆的向下调整算法 堆的向上调整算法 堆的实现 初始化堆 销毁堆 打印堆 堆的插入 堆的删除 获取堆顶的数据 获取堆的数据个数 堆的判空 建堆的时间复杂度 二叉树的顺序结构 普通二叉树是不适合用数组来存储的,因为可能会导致大量…

为nginx配置好看的错误提示页面

前言 nginx默认错误页面确实有些丑哈&#xff0c;leeader让我换一个样式 &#xff0c;我就来喽&#xff01; 为nginx配置好看的错误提示页面前言1 找异常页原始页2 win上替换3 再linux服务器上替换4 不生效解决办法样式显示不正确6 错误页源码1 找异常页 原始页 nginx默认错误…

2个月快速通过PMP证书的经验

01 PMP证书是什么&#xff1f; 指的是项目管理专业人士资格认证。它是由美国项目管理协会&#xff08;Project Management Institute(简称PMI)&#xff09;发起的&#xff0c;严格评估项目管理人员知识技能是否具有高品质的资格认证考试。其目的是为了给项目管理人员提供统一的…

初学者的Metasploit教程 - 从基础到高级

Metasploit是使用最广泛的渗透测试工具之一&#xff0c;是一个非常强大的多合一工具&#xff0c;用于执行渗透测试的不同步骤。 文章目录前言安装Metasploit在 Linux 上安装 Metasploit了解 Metasploit 的版本并更新渗透测试的基础知识1. 信息收集/侦察2. 漏洞分析3.渗透4. 渗透…

OSCP_VULHUB_Hack the Kioptrix Level-1.2

文章目录前言渗透方法论&#xff08;方法一&#xff09;渗透方法论&#xff08;方法二&#xff09;第一种sqlmap扫描&提取数据库和用户凭证ssh登录使用 SUID 位和 SUDO 二进制文件利用目标第二种方法searchsploit LotusCMS前言 Kioptrix 的 CTF 挑战&#xff1a;Level1.2 …

Linux搭建Hyperledger Fabric区块链框架 - Hyperledger Fabric 概念

企业选型的区块链底层技术 Hyperledger Fabric 概念 2015年&#xff0c;Linux基金会启动了Hyperledger项目&#xff0c;目标是发展跨行业的区块链技术。 Hyperledger Fabric是Hyperledger中的一个区块链项目&#xff0c;包含一个账本&#xff0c;使用智能合约并且是一个通过所…

上海亚商投顾:三大指数均涨约1% 两市近4300股飘红

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数早盘冲高回落&#xff0c;午后又震荡走强&#xff0c;深成指、创业板指均涨超1.2%。人工智能概念掀涨停潮&a…

Pytorch实战笔记(3)——BERT实现情感分析

本文展示的是使用 Pytorch 构建一个 BERT 来实现情感分析。本文的架构是第一章详细介绍 BERT&#xff0c;其中包括 Self-attention&#xff0c;Transformer 的 Encoder&#xff0c;BERT 的输入与输出&#xff0c;以及 BERT 的预训练和微调方式&#xff1b;第二章是核心代码部分…

机器视觉_HALCON_HDevelop用户指南_4.HDevelop开发程序

文章目录四、HDevelop编程4.1. 新建一个新程序4.2. 输入一个算子4.3. 指定参数4.4. 获取帮助4.5. 添加其他程序4.6. 理解图像显示4.7. 检查变量4.8. 利用灰度直方图改进阈值4.9. 编辑代码行4.10. 重新执行程序4.11. 保存程序4.12. 选择特征区域4.13. 打开图形窗口4.14. 循环遍历…

Swig工具在win10上使用

SWIG 是一种软件开发工具&#xff0c;它将 C 和 C 编写的程序与各种高级编程语言连接起来。这里我们用它来将 C/C 转换成 Java。 一、Swig安装 1、下载 官网&#xff1a;SWIG官网下载 源码链接 GitHub&#xff1a;https://github.com/swig/swig.git 这两个地址可能会出现无…

STM32单片机智能蓝牙APP加油站火灾预警安防防控报警监控系统MQ2DHT11

实践制作DIY- GC0122-智能蓝牙APP加油站火灾预警 一、功能说明&#xff1a; 基于STM32单片机设计-智能蓝牙APP加油站火灾预警 功能介绍&#xff1a; 基于STM32F103C系列最小系统&#xff0c;MQ-2烟雾传感器&#xff0c;火焰传感器&#xff08;不能直视阳光会受到阳光干扰&…

Cesium 渐变长方体实现-Shader

position获取: 1.1 在cesium中,可通过vec4 p = czm_computePosition();获取 模型坐标中相对于眼睛的位置矩阵 1.2 vec4 eyePosition = czm_modelViewRelativeToEye * p; // position in eye coordinates 获取eyePosition 1.3 v_positionEC = czm_inverseModelView * eyePo…

Python流程控制详解

和其它编程语言一样&#xff0c;Python流程控制可分为 3 大结构&#xff1a;顺序结构、选择&#xff08;分支&#xff09;结构和循环结构。 Python对缩进的要求&#xff08;重点&#xff09; Python 是一门非常独特的编程语言&#xff0c;它通过缩进来识别代码块&#xff0c;…

ConditionalOnBean详解及ConditionalOn××总结

ConditionalOnBean详解 为什么学习ConditionalOnBean 在学习 Springboot 自动装配的时候遇到 Bean 装配和 Bean 配置需要条件判断的场景时&#xff0c;查阅了相关内容了解到 Conditional 和 ConditionalOnBean 注解&#xff0c;深入学习之后受益匪浅。 ConditionalOnBean测试…