Mybatis学习笔记

Mybatis

文章目录

  • Mybatis
    • 搭建环境
      • 创建Maven工程
      • 将数据库中的表转换为对应的实体类
      • 配置文件
        • 核心配置文件==mybatis-config.xml==
        • 创建Mapper接口
        • 映射文件==xxxMapper.xml==
        • log4j日志功能
    • Mybatis操纵数据库
      • 示例及要点说明
      • 获取参数的两种方式
        • ==${}==
        • ==#{}==
      • 各种类型的参数处理
        • 单个字面量参数
        • 多个字面量参数
        • map集合类型的参数
        • 实体类类型的参数
        • 通过==@Param==注解(常用)
      • Mybatis的各种查询功能
        • 查询一条数据为实体类对象
        • 查询多条数据为一个list集合
        • 查询单个数据
        • 查询一条数据为Map集合
        • 查询多条数据为Map集合
      • 特殊SQL的执行
        • 模糊查询
        • 批量删除
        • 动态设置表名
        • 添加功能获取自增的主键
      • 自定义映射resultMap
        • 多对一
        • 一对多

搭建环境

创建Maven工程

  • 打包模式更改为jar包,因为mybatis只是封装了jdbc,不需要使用Tomcat
  • pom.xml导入依赖(mybatis的核心驱动+Mysql驱动+junit测试)
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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>MyBaits</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>MyBaits</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>

    <!-- Mybatis核心 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.7</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>

    <!-- MySQL驱动 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.16</version>
    </dependency>
      
  </dependencies>

</project>

将数据库中的表转换为对应的实体类

在这里插入图片描述

User实体类
package com.zhnx.demo1.pojo;
import lombok.Data;
/**
 * ssm.t_user
 */
@Data
public class User {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String gender;
    private String email;
    public User() {
    }
    public User(Integer id, String username, String password, Integer age, String gender, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
        this.gender = gender;
        this.email = email;
    }
}

补充:使用@Data注解需要在pom.xml中配置lombok的依赖

lombok依赖
    <!-- lombok,简化实体类-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.26</version>
      <scope>compile</scope>
    </dependency>

配置文件

核心配置文件mybatis-config.xml

核心配置文件主要功能,与数据库和映射文件进行绑定

  • 存放位置:src/main/resources
mybatis-config.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>
    <!-- Mybatis 核心配置文件,标签的顺序
            properties?,settings?,typeAliases?,typeHandlers?,
            objectFactory?,objectWrapperFactory?,reflectorFactory?,
            plugins?,environments?,databaseIdProvider?,mappers?
    -->
    <!--引入properties文件,然后才可以在当前文件中使用的方式访问 -->
    <!-- ”jdbc.properties“ 的文件名 -->
    <properties resource="jdbc.properties"/>

    <!--设置类型别名 -->
    <typeAliases>
        <!-- 比较 好的方式就是以包为单位,将报下所有的类型设置成默认的类型别名,类名不区分大小写 -->
        <!-- 类所在包的全类名:com.zhnx.mybatis.pojo-->
        <package name="com.zhnx.demo1.pojo"/>
    </typeAliases>

    <!--设置连接数据库的环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 设置数据库连接的驱动 ${jdbc.driver}-->
                <property name="driver" value="${jdbc.driver}"/>
                <!-- 设置数据库的连接地址  ${jdbc.url}-->
                <property name="url" value="${jdbc.url}"/>
                <!-- 设置连接数据库的用户名  ${jdbc.username}-->
                <property name="username" value="${jdbc.username}"/>
                <!-- 设置连接数据库的密码  ${jdbc.password}-->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--引入映射文件-->
    <mappers>
<!--        <mapper resource="mappers/UserMapper.xml"/>-->
        
<!--        这种方式一定要保证mapper接口和映射文件在同一个目录下-->
        <package name="com.zhnx.demo1.mapper"/>
    </mappers>
</configuration>

创建Mapper接口

package com.zhnx.demo1.mapper;
import com.zhnx.demo1.pojo.User;

public interface UserMapper {
    /**
     * 根据用户名查询用户信息
     * @param name
     * @return
     */
    User getUserByUsername(String name);
}

映射文件xxxMapper.xml

在映射文件中写SQL语句,操作数据库

  • 一个映射文件对应一个实体类,一张表
  • mapper接口的全类名和映射文件的namespace要一致
  • Mapper接口中的方法名需要和映射文件中的SQL语句的id保持一致
UserMapper.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">

<!-- namespace = ”当前接口的全类名“ 如com.zhnx.mybatis.mapper.UserMapper-->
<mapper namespace="com.zhnx.demo1.mapper.UserMapper">

    <!--mapper接口和映射文件要保持两个一致
            1、mapper接口的全类名和映射文件的namespace一致
            2、mapper接口中的方法的方法名要和映射设文件中的sql的id保持一致-->

<!--     int insertUser();-->
    <insert id="insertUser">
        insert into t_user values (null,'admin','00000000',23,'男','admin000.qq.com');
    </insert>
    
</mapper>

log4j日志功能

在pom.xml中加入log4j的依赖

    <!-- log4j日志 -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>

Mybatis操纵数据库

示例及要点说明

eg:

1、在UserMapper接口中新增方法

public interface UserMapper{
 User selectUser();
}

2、在UserMapper.xml中配置SQL语句等

<select id="selectUser" resultType="User">
 select * from t_user where id = 1;
</select>
  • resultType:设置返回的结果类型,就是查询得到数据转换成的对应的Java类型(全类名)

    • 可以在核心配置文件中使用标签设置类型别名

    • <!--设置类型别名 -->
      <typeAliases>
          <!-- 比较 好的方式就是以包为单位,
      	将包下所有的类型设置成默认的类型别名,类名不区分大小写 -->
          <package name="com.zhnx.demo1.pojo"/>
      </typeAliases>
      
  • resultMap:自定义映射处理多对一或者一对多映射关系

获取参数的两种方式

${}

  • 字符串拼接

  • 注意添加单引号

#{}

  • 占位符赋值

  • 不需要添加单引号

  • 可以防止SQL注入

各种类型的参数处理

单个字面量参数

${}和#{}都可以,以任意键值就可以获取参数值

需要注意的是,${}需要手动添加单引号

多个字面量参数

不可以使用#{username}、#{password}的方式

因为 因为当mapper接口中的方法参数为多个时,此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1…或param1,param2…为键,以参数为值

所以,多个字面量参数的处理方式应该为==#{arg0}…或‘${arg0}’==…

map集合类型的参数

这种参数可以直接#{==map键值对的键==值}

  • eg:#{username}

实体类类型的参数

这种参数可以直接==通过实体类的属性名==获取属性值

  • eg:#{username}

通过==@Param==注解(常用)

  • User getUserByUsername(==@param(“name”)==String name);
  • 以注解的value属性值为键和Param1、Param2…为键
  • eg:#{name}

Mybatis的各种查询功能

查询一条数据为实体类对象

  • resultType=“User”

查询多条数据为一个list集合

  • resultType=“User”

查询单个数据

  • resultType=“integer/int/Int/Integer/_integer”(类型别名不区分大小写)

查询一条数据为Map集合

  • resultType=“map”

查询多条数据为Map集合

  • resultType=“map”
* 查询出来的多个Map集合统一放在list集合中  
    ** List<Map<String, Object>> getAllUserToMap();
	** 查询结果: {password=123456, sex=, 
                 id=1, age=23, username=admin
             }
* 查询出来的多个Map集合放在Map集合中(Map中嵌套Map** 使用@MapKey("id")为外层的Map集合指定键值
    ** @MapKey("id")
       Map<String, Object> getAllUserToMap();
    ** 查询结果:{
            1={password=123456, sex=, id=1, age=23, username=admin},
            2={password=123456, sex=, id=2, age=23, username=张三},
            3={password=123456, sex=, id=3, age=23, username=张三}
            }

特殊SQL的执行

模糊查询

  • LIKE ‘abc%’

    • _ LIKE ‘_${mohu}%’
    • LIKE concat(‘%’,#{mohu},‘%’)
    • LIKE “%”#{mohu}“%”
  • 具体情况根据SQL语句来判断

批量删除

  • delete from t_user where id in (${ids})

动态设置表名

  • select * from ${tableName}

添加功能获取自增的主键

//useGeneratedKeys=“true”
//keyProperty="id"
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
 	insert into t_user values(null,#{username},#{password},#{age},#{sex})
 </insert

自定义映射resultMap

//resultMap标签的和其中属性的详解
<!-- 
    resultMap:设置自定义映射
       属性:
            id:表示自定义映射的唯一标识
            type:查询的数据要映射的实体类的类型
       子标签:
            id:设置主键的映射关系
            result:设置普通字段的映射关系association:设置多对一的映射关系
            collection:设置一对多的映射关系
        属性:
            property:设置映射关系中实体类中的属性名
            column:设置映射关系中表中的字段名-->
    
<!--简单例子 --!>
<resultMap id="userMap" type="User">
	 <id property="id" column="id"></id>
	 <result property="userName" column="user_name"></result>
	 <result property="password" column="password"></result>
	 <result property="age" column="age"></result>
 	 <result property="sex" column="sex"></result>
 </resultMap>
 <select id="selectUser" resultMap="userMap">
    select * from user;
 <select>

多对一

例子:实体类中还有实体类

  • 级联:使用 “类名.字段名” 的方式进行映射

    • <resultMap id="empDeptMap" type="Emp"> 
      	<id column="eid" property="eid"></id> 
      	<result column="ename" property="ename"></result>
       	<result column="age" property="age"></result>
       	<result column="sex" property="sex"></result>
       	<result column="did" property="dept.did"></result>
       	<result column="dname" property="dept.dname"></result>
       </resultMap>
      
  • association

    • <resultMap id="empDeptMap" type="Emp">
       	<id column="eid" property="eid"></id>
       	<result column="ename" property="ename"></result>
       	<result column="age" property="age"></result>
       	<result column="sex" property="sex"></result>
          
       	<association property="dept" javaType="Dept">
       		<id column="did" property="did"></id>
       		<result column="dname" property="dname"></result>
       	</association>
          
       </resultMap>
      

一对多

例子:实体类中有集合

  • collection

    • <resultMap id="deptEmpMap" type="Dept">
       	<id property="did" column="did"></id>
       	<result property="dname" column="dname"></result>
      
       	<collection property="emps" ofType="Emp">
       		<id property="eid" column="eid"></id>
       		<result property="ename" column="ename"></result>
       		<result property="age" column="age"></result>
       		<result property="sex" column="sex"></result>
       	</collection>
          
       </resultMap>
      

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

keil官网下载MDK的STM32芯片pack包

背景 最近重装了电脑系统&#xff0c;重新安装了MDK所以导致MDK芯片包需要重新下载&#xff0c;软件内下载又太慢&#xff0c;所以趁现在找到了官网下载方法把方法分享出来供大家参考。 1、在浏览器中输入网址&#xff1a;www.keil.arm.com进入如下界面&#xff0c;然后点击&am…

Mock-MOCO使用过程

一、jar包下载&#xff1a;https://github.com/dreamhead/moco 二、准备mock的json文件 data.json内容&#xff1a; ####GET请求 [{"description": "response使用Content-Type为charsetGBK编码格式来查看返回信息为中文的内容","request": {&q…

Tensorflow预训练模型ckpt与pb两种文件类型的介绍

我们在 Tensorflow无人车使用移动端的SSD(单发多框检测)来识别物体及Graph的认识 熟悉了Graph计算图以及在 Tensorflow2.0中function(是1.0版本的Graph的推荐替代)的相关知识介绍 这个tf.function的用法&#xff0c;了解到控制流与计算图的各自作用&#xff0c;无论使用哪种方…

Linux基本指令操作

登陆指令&#xff08;云服务器版&#xff09; 当我们获取公网IP地址后&#xff0c;我们就可以打开xshell。 此时会有这样的界面&#xff0c;我们若是想的登陆&#xff0c;则需要输入以下的指令 ssh 用户名公网IP地址 然后会跳出以下的窗口 接着输入密码——密码便是先前定好…

利用小波包对一维信号进行降噪或压缩(MATLAB)

function [ output_args ] example4_12( input_args ) %EXAMPLE4_12 Summary of this function goes here % Detailed explanation goes here clc; clear; % 设置信噪比和随机数的初始值 snr 3; init 2055615866; % 生成一个原始信号xref和含高斯白噪声的信号x [xref,x] …

微服务契约测试框架-Pact

契约测试 契约测试的思想就是将原本的 Consumer 与 Provider 间同步的集成测试&#xff0c;通过契约进行解耦&#xff0c;变成 Consumer 与 Provider 端两个各自独立的、异步的单元测试。 契约测试的优点&#xff1a; 契约测试与单元测试以及其它测试之间没有重复&#xff0c…

零的奇幻漂移:解密数组中的神秘消失与重生

本篇博客会讲解力扣“283. 移动零”的解题思路&#xff0c;这是题目链接。 思路1 这道题目很有意思。虽然是简单题&#xff0c;其蕴含的玄机还是很多的。正常来讲&#xff0c;这种题目一般都会原地操作&#xff08;不开辟额外的数组&#xff0c;空间复杂度是O(1)&#xff09;&…

计算机组成原理(2)- 浮点数的存储

1、浮点数的表示方法 假设有以下小数&#xff0c;它表示的十进制数是多少呢&#xff1f; 00000000 00000000 00000000 1010.10101*2^3 1*2^1 1*2^-1 1*2^-3 10.625 1010.1010可以用科学计数法来表示为1.0101010 * 2^3。关于科学计数法再举个例子0.10101用科学计数法表示…

uni-app:模态框的实现(弹窗实现)

效果图 代码 标签 <template><view><!-- 按钮用于触发模态框的显示 --><button click"showModal true">显示模态框</button><!-- 模态框组件 --><view class"modal" v-if"showModal"><view cla…

网红项目AutoGPT源码内幕及综合案例实战(三)

AutoGPT on LangChain PromptGenerator等源码解析 本节阅读AutoGPT 的prompt_generator.py源代码,其中定义了一个PromptGenerator类和一个get_prompt函数,用于生成一个提示词信息。PromptGenerator类提供了添加约束、命令、资源和性能评估等内容的方法,_generate_numbered_l…

线性表之顺序表

在计算机科学中&#xff0c;数据结构是非常重要的基础知识之一。数据结构为我们提供了组织和管理数据的方法和技巧&#xff0c;使得我们可以高效地存储、检索和操作数据。而顺序表作为数据结构中最基本、最常用的一种存储结构&#xff0c;也是我们学习数据结构的第一步。 本文将…

QT: 完成服务器的实现

1> 思维导图 2> 手动完成服务器的实现&#xff0c;并具体程序要注释清楚 Widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QMessageBox> //…

jMeter使用随记

参数化BodyData 先制作参数文件 再设置一个csv data set config 最后在body data里面写上参数${xxxxx}

Stable diffusion 和 Midjourney 怎么选?

通过这段时间的摸索&#xff0c;我将和你探讨&#xff0c;对普通人来说&#xff0c;Stable diffusion 和 Midjourney 怎么选&#xff1f;最重要的是&#xff0c;学好影视后期制作对 AI 绘画创作有哪些帮助&#xff1f;反过来&#xff0c;AI 绘画对影视后期又有哪些帮助&#xf…

【docker】docker部署nginx

目录 一、步骤二、示例 一、步骤 1.搜索nginx镜像 2.拉取nginx镜像 3.创建容器 4.测试nginx 二、示例 1.搜索nginx镜像 docker search nginx2.拉取nginx镜像 docker pull nginx3.创建容器&#xff0c;设置端口映射、目录映射 # 在root目录下创建nginx目录用于存储nginx数据…

error:0308010C:digital envelope routines::unsupported(Vue2报错)

原因:node.js版本过高&#xff0c; 解决方案&#xff0c;在终端输入以下命令 set NODE_OPTIONS--openssl-legacy-provider 然后再package.json里面添加一行 "dev_t": "set NODE_OPTIONS\"--openssl-legacy-provider\" & npm run dev\n" 然后…

【Linux命令200例】用ln创建链接文件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

windows 删除无法删除的文件

有两种原因&#xff1a; 文件被占用文件无权限 解决方案 通用解决方案是进入安全模式进行删除 安全模式&#xff1a; 不会启动非必要的进程有最高的系统权限 进入系统配置 安全引导&#xff0c;重启 删除文件 修改系统配置为正常启动 重启

[JavaWeb]SQL介绍-DDL语句

SQL介绍-DDL语句 一.SQL简介1.简介2.SQL通用语法3.SQL语言的分类 二.DDL-操作数据库与表1.DDL操作数据库2.DDL操作表①.查询表(Retrieve)②.创建表(Create)③.修改表(Update)④.删除表(Delete) 一.SQL简介 1.简介 SQL: Structured Query Language–结构化查询语言用来操作关系…

PCB封装设计指导(十五)验证封装的正确性

PCB封装设计指导(十五)验证封装的正确性 封装建立好之后,我们需要验证封装是否能够正常的放入PCB文件中,最好最直接的办法就是直接放入PCB中来验证。 具体操作如下 任意新建一个空白的PCB文件点击File 选择NEW