01-mybatis-快速入门、代理、CRUD练习

news2024/11/17 23:34:35

文章目录

  • Mybatis
  • Mybatis入门案例
    • 1、创建User表,添加数据
    • 2、创建模块,搭建框架
      • 2.1 创建模块
        • 注意:完善项目目录
      • 2.2 导入坐标
      • 2.3 编写 MyBatis 核心配置文件
      • 2.4 编写sql映射文件
      • 2.5 编码
    • 3、解决SQL映射文件的警告提示
  • Mapper代理开发
    • 1、定义同名接口
    • 2、设置namespace 并修改核心配置mapper
    • 3、Mapper 接口中定义方法
    • 4、编码
  • MyBatis 核心配置文件
  • Mybatis练习
    • 1,配置文件实现CRUD
      • 1.1 环境准备

Mybatis

官网:https://mybatis.org/mybatis-3/zh/index.html (支持中文)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Mybatis入门案例

1、创建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、创建模块,搭建框架

2.1 创建模块

在这里插入图片描述
我的jdk比较高,是17,添加一下编译版本的配置

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

在这里插入图片描述

注意:完善项目目录

(不要纠结创建项目选择哪个骨架,不管哪个骨架,自己会创建各种缺失的目录才是王道)
缺少resources目录,右键main和test->new->Directory->双击唯一提示的那个
在这里插入图片描述
在这里插入图片描述
最后项目结构如下即可
在这里插入图片描述

最最后的项目结构先贴出来下:
在这里插入图片描述

2.2 导入坐标

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13</version>
      <scope>test</scope>
    </dependency>

    <!-- mybatis 依赖 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.5</version>
    </dependency>

    <!--mysql 驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.32</version>
    </dependency>

    <!-- 添加slf4j日志api -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.20</version>
    </dependency>
    <!-- 添加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>
		
	<!-- alt+enter 自动导入的 你敢信 新版IDEA太强了 -->
	<dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
      <scope>compile</scope>
    </dependency>

第一次导入,需要时间下载默认jar包,不要着急,等一会儿。(必要时也可以手动刷新)
在这里插入图片描述

将logback.xml复制到src/main/resources目录
作用: 看彩色日志信息的
logback.xml内容如下

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

    <logger name="cn.whu" 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>

在这里插入图片描述

2.3 编写 MyBatis 核心配置文件

核心配置文件作用: 替换连接信息 解决硬编码问题

右键main/resources-》new->File-》名称为:mybatis-config.xml
[官网去复制内容,再修改]

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"/>
                <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--加载sql映射文件--> <!--同在resources根目录下,导入就很方便-->
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

2.4 编写sql映射文件

命名规则:哪张表的就: 表名Mapper.xml
右键main/resources-》new->File-》名称为:mybatis-config.xml
[官网去复制内容,再修改]

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">
    <select id="selectAll" resultType="cn.whu.pojo.User">
        select * from tb_user
    </select>
</mapper>

再去核心配置文件里加入对此映射文件的配置

<mappers>
    <!--加载sql映射文件--> <!--同在resource根目录下,导入就很方便-->
    <mapper resource="UserMapper.xml"/>
</mappers>

2.5 编码

  • 1. 定义POJO类

创建类: cn.whu.pojo.User

User.java

// alt + 鼠标左键 整列编辑
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    private Integer id;
    private String username;
    private String password;
    private String gender;
    private String addr;
}

之前忘记写lombok的依赖(坐标)了,我按alt+enter 竟然能自动导入,帮你在pom.xml里自动加上 dependency

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

    1. mybatis核心测试类

创建类: cn.whu.demo.MybatisDemo

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

MybatisDemo.java

   public static void main(String[] args) throws IOException {
        //1. 加载mybatis的核心配置文件,获取 SqlSessionFactory
        String resource = "mybatis-config.xml";//就在resources根目录下 写个名称就行了 maven结构多好呀
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2. 获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3. 执行sql
        List<User> users = sqlSession.selectList("test.selectAll");//参数: "命名空间.id"
        //直接返回的就是 List<User>  也就是自动封装了结果集  也太爽了吧

        System.out.println(users);

        //4. 释放资源
        sqlSession.close();
    }

在这里插入图片描述

3、解决SQL映射文件的警告提示

产生原因:Idea和数据库没有建立连接,不识别表信息
解决方式:在Idea中配置MySQL数据库连接
解决后好处: IDEA的xml里写sql语句有提示了
(第一次连接可能提示你下载一些文件,下载就行了~)

在这里插入图片描述
在这里插入图片描述
IDEA有强大的写sql的能力,写sql语句甚至比navicat还要方便

新建查询窗口->强大的代码提示写代码->选中按左上角执行
在这里插入图片描述
代码提示太强大了:
在这里插入图片描述

选中后:ctrl+enter 也可以执行
在这里插入图片描述

想要mapper.xml里有sql提示,还得配置sql方言
在这里插入图片描述
若还是不行,则alt+enter大法-》下拉找到SQL即可
在这里插入图片描述
在这里插入图片描述

Mapper代理开发

使用 Mapper 代理方式完成入门案例

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

2、设置SQL映射文件的namespace属性为Mapper接口全限定名

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

4、编码

  1)通过 SqlSession 的 getMapper方法获取 Mapper接口的代理对象

  2)调用对应方法完成sql的执行

1、定义同名接口

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

同一目录,并不是编译时在同一目录,否则就破坏了maven代码和资源文件分开管理的规范。
同一目录:只需要在resources目录下建立和XXXMapper.java同样名称的包结构即可,也就是保持二者(除后缀名外)全路径名一样即可,这样编译后,他们其实会在同一目录下的。

注意:resources下只能new Directory,不能new package,因此也就不能用.了,得老老实实一层层新建,或者改用/ (易混淆的是显示上并没有不同,得到windows资源管理器下看他们是不是一样才行)
如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
右键clean再重新编译,去target目录下看,他们二者确实放在一起
在这里插入图片描述

2、设置namespace 并修改核心配置mapper

设置SQL映射文件的namespace属性为Mapper接口全限定名
在这里插入图片描述

<?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="cn.whu.mapper.UserMapper">
    <select id="selectAll" resultType="cn.whu.pojo.User">
        select * from tb_user;
    </select>
</mapper>


UserMapper.xml位置变了,核心mybatis-config.xml中得重新配置了
在这里插入图片描述

    <mappers>
        <!--加载sql映射文件-->
        <mapper resource="cn/whu/mapper/UserMapper.xml"/>
    </mappers>

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

    <mappers>
        <!--加载sql映射文件-->
        <package name="cn.whu.mapper"/>
    </mappers>

3、Mapper 接口中定义方法

在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致 (查询多列得用List<Type>)

在这里插入图片描述
UserMapper.java

package cn.whu.mapper;

import cn.whu.pojo.User;
import java.util.List;

public interface UserMapper {
    //注意返回的是集合 因此不能简单写User,而应该写List<User>
    List<User> selectAll();
}

4、编码

1)通过 SqlSession 的 getMapper方法获取 Mapper接口的代理对象
2)调用对应方法完成sql的执行

public static void main(String[] args) throws IOException {
        //1. 加载mybatis的核心配置文件,获取 SqlSessionFactory
        String resource = "mybatis-config.xml";//就在resources根目录下 写个名称就行了 maven结构多好呀
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2. 获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3. 执行sql
        // 不用了 不好 List<User> users = sqlSession.selectList("test.selectAll");//参数: "命名空间.id"
        //3.1 获取UserMapper接口的代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.selectAll();//mybatis帮你实现了接口方法,sql语句有,返回值有,当然能实现啦

        System.out.println(users);

        //4. 释放资源
        sqlSession.close();
    }

在这里插入图片描述

MyBatis 核心配置文件

environments: 配置数据库连接环境信息。可以配置多个environment,通过default切换不同的environments

在这里插入图片描述

Mybatis练习

目标

  • 能够使用映射配置文件实现CRUD操作
  • 能够使用注解实现CRUD操作

1,配置文件实现CRUD

在这里插入图片描述

如上图所示产品原型,里面包含了品牌数据的 查询按条件查询添加删除批量删除修改 等功能,而这些功能其实就是对数据库表中的数据进行CRUD操作。接下来我们就使用Mybatis完成品牌数据的增删改查操作。以下是我们要完成功能列表:

  • 查询
    • 查询所有数据
    • 查询详情
    • 条件查询
  • 添加
  • 修改
    • 修改全部字段
    • 修改动态字段
  • 删除
    • 删除一个
    • 批量删除

我们先将必要的环境准备一下。

1.1 环境准备

  • 数据库表(tb_brand)及数据准备

    -- 删除tb_brand表
    drop table if exists tb_brand;
    -- 创建tb_brand表
    create table tb_brand
    (
        -- id 主键
        id           int primary key auto_increment,
        -- 品牌名称
        brand_name   varchar(20),
        -- 企业名称
        company_name varchar(20),
        -- 排序字段
        ordered      int,
        -- 描述信息
        description  varchar(100),
        -- 状态:0:禁用  1:启用
        status       int
    );
    -- 添加数据
    insert into tb_brand (brand_name, company_name, ordered, description, status)
    values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
           ('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
           ('小米', '小米科技有限公司', 50, 'are you ok', 1);
    
  • 实体类 Brand

    com.itheima.pojo 包下创建 Brand 实体类。

    public class Brand {
        // id 主键
        private Integer id;
        // 品牌名称
        private String brandName;
        // 企业名称
        private String companyName;
        // 排序字段
        private Integer ordered;
        // 描述信息
        private String description;
        // 状态:0:禁用  1:启用
        private Integer status;
        
        //省略 setter and getter。自己写时要补全这部分代码
    }
    
  • 编写测试用例

    测试代码需要在 test/java 目录下创建包及测试用例。项目结构如下:

    image-20210729112907106
  • 安装 MyBatisX 插件

    • MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。

    • 主要功能

      • XML映射配置文件 和 接口方法 间相互跳转
      • 根据接口方法生成 statement
    • 安装方式

      点击 file ,选择 settings ,就能看到如下图所示界面

      image-20210729113304743

      注意:安装完毕后需要重启IDEA

    • 插件效果

      image-20210729164450524

      红色头绳的表示映射配置文件,蓝色头绳的表示mapper接口。在mapper接口点击红色头绳的小鸟图标会自动跳转到对应的映射配置文件,在映射配置文件中点击蓝色头绳的小鸟图标会自动跳转到对应的mapper接口。也可以在mapper接口中定义方法,自动生成映射配置文件中的 statement ,如图所示

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bQ9Y11Xq-1677395829772)(assets/image-20210729165337223.png)]

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

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

相关文章

python下如何安装并使用matplotlib(画图模块)

在搜索命令中输入cmd&#xff0c;以管理员身份运行。 输入以下命令&#xff0c;先对pip安装工具进行升级 pip install --upgrade pip 升级完成 之后使用pip安装matplotlib pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple 也可以使用pycharm来安装matp…

《嵌入式应用开发》实验一、开发环境搭建与布局(上)

1. 搭建开发环境 去官网&#xff08;https://developer.android.google.cn/studio&#xff09;下载 Android Studio。 安装SDK&#xff08;默认Android 7.0即可&#xff09; 全局 gradle 镜像配置 在用户主目录下的 .gradle 文件夹下面新建文件 init.gradle&#xff0c;内容为…

弹性盒子布局

目录一、弹性盒子属性二、认识flex的坐标轴三、简单学习父级盒子属性三、属性说明3.1、flex-grow一、弹性盒子属性 说明&#xff1a; div的默认样式&#xff1a;display:block 块盒子 display:flex弹性盒子&#xff08;可以控制下级盒子的位置&#xff09; 当两种盒子单独出现…

springboot 虚拟线程demo

jd19支持虚拟线程&#xff0c;虚拟线程是轻量级的线程&#xff0c;它们不与操作系统线程绑定&#xff0c;而是由 JVM 来管理。它们适用于“每个请求一个线程”的编程风格&#xff0c;同时没有操作系统线程的限制。我们能够创建数以百万计的虚拟线程而不会影响吞吐。 做个 spri…

实验心理学笔记01:引论

原视频链接&#xff1a; https://www.bilibili.com/video/BV1Qt41137Kv 目录 一、实验心理学&#xff1a;定义、内容及简要历史回顾 二、实验心理学和普通心理学、认知心理学的区别 三、实验方法与非实验方法 四、实验范式 五、实验中的各种变量 六、The science of psy…

Java项目---博客系统

博客系统url : 链接 项目已上传gitee : 链接 前言 之前笔者已经使用Servlet结合MySQL实现了第一版的个人博客。在这一版的博客系统中&#xff0c;将进行以下功能的升级&#xff1a; 框架升级&#xff1a;SSM版本&#xff0c;即&#xff08;Spring SpringMVC MyBatis&…

@Import注解的原理

此注解是springboot自动注入的关键注解&#xff0c;所以拿出来单独分析一下。 启动类的run方法跟进去最终找到refresh方法&#xff1b; 这里直接看这个org.springframework.context.support.AbstractApplicationContext#refresh方法即可&#xff0c;它下面有一个方法 invoke…

Linux基础命令-fdisk管理磁盘分区表

文章目录 fdisk 命令介绍 命令格式 基本参数 1&#xff09;常用参数 2&#xff09;fdisk菜单操作说明 创建一个磁盘分区 1&#xff09;创建分区 2&#xff09;创建交换分区 参考实例 1&#xff09; 显示当前分区的信息 2&#xff09; 显示每个磁盘的分区信息 命令…

关于单目标约束优化问题的讲解及实现过程

一、前沿 优化问题一直是工程领域、路径规划领域等绕不开的话题,而真正的实际问题不是只是单目标优化问题,而是涉及到高维度且带多约束的问题,其中约束包含等式约束、不等式约束或者二者都有,这给优化研究提高了难度。 在中学的时候,应该都遇到过线性规划问题,类似于如…

LeetCode 热题 C++ 200. 岛屿数量 206. 反转链表 207. 课程表 208. 实现 Trie (前缀树)

LeetCode200 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设…

虹科新闻|虹科与iX systems正式建立合作伙伴关系

近日&#xff0c;虹科与美国iXsystems公司达成战略合作&#xff0c;虹科正式成为iXsystems公司在中国区域的认证授权代理商。未来&#xff0c;虹科将携手iXsystems&#xff0c;共同致力于提供企业级存储解决方案。虹科及iXsystems双方的高层领导人员都对彼此的合作有很大的信心…

【JVM】垃圾回收

6、垃圾回收机制 6.1、对象成为垃圾的判断依据 在堆空间和元空间中&#xff0c;GC这条守护线程会对这些空间开展垃圾回收⼯作&#xff0c;那么GC如何判断这些空间的对象是否是垃圾&#xff0c;有两种算法&#xff1a; 引用计数法&#xff1a; 对象被引用&#xff0c;则计数…

搜广推 NeuralCF - 改进协同过滤+矩阵分解的思想

😄 NeuralCF:2017新加坡国立大学提出。【后文简称NCF】 😄 PNN:2016年上海交通大学提出。 文章目录 NeuralCF动机原理general NCFNCF终极版(GMF+MLP的结合)缺点优点ReferenceNeuralCF 动机 前面学了MF,可知MF在用户-物品评分矩阵的基础上做矩阵分解(用户矩阵Q和物品…

Codeforces Round #851 (Div. 2)(A~D)

A. One and Two给出一个数组&#xff0c;该数组仅由1和2组成&#xff0c;问是否有最小的k使得k位置的前缀积和后缀积相等。思路&#xff1a;计算2个数的前缀和即可&#xff0c;遍历判断。AC Code&#xff1a;#include <bits/stdc.h>typedef long long ll; const int N 1…

Maxwell系列:Maxwell采集Mysql到Kafka

目录 Apache Hadoop生态-目录汇总-持续更新 1&#xff1a;直接命令行启动(开发环境使用) 1.1&#xff1a;创建topic&#xff08;可忽略&#xff0c;默认会自动创建&#xff09; 1.2&#xff1a;命令行方式启动maxwell采集通道 1.3&#xff1a;测试流程 2&#xff1a;通过配…

taobao.top.once.token.get( 网关一次性token获取 )

&#xffe5;开放平台免费API必须用户授权聚石塔内调用 网关一次性token获取&#xff0c;对接文档: 公共参数 HTTP地址:http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 请求参数 响应参数 点击获取key和secret 请求示例 TaobaoClient client new Defa…

2023前端一面vue面试题合集

函数式组件优势和原理 函数组件的特点 函数式组件需要在声明组件是指定 functional:true不需要实例化&#xff0c;所以没有this,this通过render函数的第二个参数context来代替没有生命周期钩子函数&#xff0c;不能使用计算属性&#xff0c;watch不能通过$emit 对外暴露事件&…

【Kafka】生产者

客户端开发 生产者就是负责向kafka发送消息的应用程序。一个正常的生产逻辑的步骤为&#xff1a; 配置生产者客户端参数及创建相应的生产者实例。 构建待发送的消息。 发送消息。 关闭生产者实例。 在创建真正的生产者实例前需要配置相应的参数&#xff0c;比如需要连接的…

顺序表的构造及功能

定义顺序表是一种随机存储都结构&#xff0c;其特点是表中的元素的逻辑顺序与物理顺序相同。假设线性表L存储起始位置为L(A)&#xff0c;sizeof(ElemType)是每个数据元素所占的存储空间的大小&#xff0c;则线性表L所对应的顺序存储如下图。顺序表的优缺点优点&#xff1a;随机…

【面试题】 3 个加强理解TypeScript 的面试问题

TypeScript 作为 JavaScript 的超集&#xff0c;让 JavaScript 越来越像一门“正经的”语言。和纯粹的 JavaScript 语言相比&#xff0c;TypeScript 提供静态的类型检查&#xff0c;提供类的语法糖&#xff08;这一点是继承了 ES6 的实现&#xff09;&#xff0c;让程序更加规范…