Mybatis

本文详细介绍了Mybatis的核心特性,包括properties属性、typeAliases别名配置、Mapper接口编程、动态SQL(if, where, trim等标签)以及一级和二级缓存的使用。通过实例展示了如何配置映射文件模板、获取参数值的两种方式及解决字段名与属性名不一致的问题。此外,还涵盖了多对一、一对多的映射以及批量操作。" 76576420,4886637,Spring Boot整合Jersey实现RESTful服务,"['Spring框架', 'REST API', 'jersey框架', 'JPA', 'Maven']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.mybatis是什么?

Mybatis更简单完成程序和数据库交互的工具,更简单的操作和读取数据库工具

2.properties(属性)

这些属性可以在外部进行配置,也可以动态的替换。
可以在Java属性文件中配置这些属性,也可以在properties元素的子元素中设置

原始的样子:
在这里插入图片描述

利用properties之后的样子:
1.在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述

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

这样变化的好处是:当数据库发生变化的时候,就不需要在mybatis-config.xml里面找,就直接在jdbc.properties修改,更容易修改些

3.typeAliases(别名配置)

1.typeAliases:别名配置:将这一长串com.mybatis.pojo.User,名字设置为:User
在这里插入图片描述
2.>在UserMapper.xml当中,实施查询功能的时候,默认映射关系,resultType就可以直接设置为User,就不用写com.mybatis.pojo.User一长串。
主要优点是:简化复杂度。
在这里插入图片描述

4.Mapper面向接口编程的两个一致

Mapper面向接口编程的两个一致:
1.mapper接口所在的包和映射文件所在的包一致;
2.mapper接口和映射文件的名字一致。
在这里插入图片描述

5.设置核心配置文件的模板(mybatis-config)

在这里插入图片描述
2.
在这里插入图片描述
3.复制mybatis-config.xml当中的代码,粘贴在核心配置文件的模板中
在这里插入图片描述
把package name当中的内容删除,然后再apply, 最后再ok,即可。
在这里插入图片描述
这个时候,这个核心配置文件的模板就创建好了。
应用这个核心配置文件的模板:
在这里插入图片描述
最后效果展示:
在这里插入图片描述

//放在核心配置文件模板当中的代码
<?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>

    <properties resource="jdbc.properties"/>

    <typeAliases>
        <package name=""/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name=""></package>
    </mappers>
</configuration>


6.设置映射文件的模板

在这里插入图片描述
此时的映射文件的模板也配置好了,用法和核心配置文件的方法一样。

//在mybatis-mapper当中的代码:
<?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="">

</mapper>

7.Mybatis获取参数值的两种方式(#{}和${})

Mybatis获取参数值的两种方式:
#{}和${}
#{}的含义是:占位符赋值
${}的含义是:字符串拼接
${}会存在SQL注入的问题,而#{}不存在

1.一个参数的情况:
#{}:

1.在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述

${}:需要加上’ '(单引号)

在这里插入图片描述

2.当UserMapper接口中方法有两个参数的情况时:

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

3.如果mapper接口有多个参数的时候,手动将这些参数放在一个map当中存储

在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述

4.使用@Param注解命名参数

使用@Param注解命名参数:Mybatis会将这些参数放在一个Map当中,会以@Param参数为键,以参数为值。
所以,只需要通过#{}或者${}以键的方式去访问值。
1.
在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述
4.结果展示
在这里插入图片描述

8.Mybatis的各种查询

Mybatis的各种查询:
1.查一条信息:可以用实列对象或者集合去接收;
2.查多条信息:可以用集合来接收。

1.单条查询

在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述
4.结果展示:
在这里插入图片描述

2.多条查询–>用List集合去接收

1.在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述

3.查询数据库中有多少条信息(count*)—>用Integer去接收

在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述

4.查询一条信息,也可以用Map来接收

在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述

5.查多条信息–>用List<Map<>>来接收

在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述
4.
结果展示:
在这里插入图片描述

6.几种特殊的SQL—》在这几种情况下,在sql语句当中,要使用${}
(1)模糊匹配(like)

在这里插入图片描述
2.'%${}%'或者"%“#{username}”%"这里两种方式都可以。
在这里插入图片描述3.
在这里插入图片描述

(2)批量删除,比如:删除id为2,3的用户信息(在sql语句当中,用in(),在括号里面不能加‘’(单引号),所以需要使用${})。

在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述

(3)动态设置表名,比如:在查询数据的时候,动态匹配表名,需要select * from 表名,这里的表名不需要单引号。

1.在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述

9.当字段名和属性名不一致的情况

字段:数据库中的名字;
比如:在这里插入图片描述
属性:面向对象的角度。
比如:
在这里插入图片描述

当属性名和字段名字不一致的时候,会出现什么样的问题呢?

查询eid为1的个人信息
当字段名为:emp_name,当属性名为empName的时候:
如果直接 select *from t_emp where eid=1;
则会出现这样的情况:
在这里插入图片描述

1.利用字段别名的方式来解决字段名和属性名的不一致

1
在这里插入图片描述
2.
在这里插入图片描述

在这里插入图片描述
4.结果展示
在这里插入图片描述

2.通过全局配置mapUnderscoreToCamelCase解决字段名和属性的映射关系

在这里插入图片描述

2在这里插入图片描述
3.
在这里插入图片描述
4.在这里插入图片描述
5.结果展示
在这里插入图片描述

3.通过resultMap来解决字段名和属性值之间的映射关系

在这里插入图片描述
2.resultType:默认映射关系;resultMap:自定义映射关系
在resultMap当中:id是唯一标识,不能重复,type:设置映射关系中实体类的类型
在resultMap子标签当中🆔标识主键映射关系,result:普通键映射关系。
property:设置映射关系中的属性名;column:设置映射关系中的字段名。(数据库中的字段名)
在这里插入图片描述

在这里插入图片描述
4.结果展示:
在这里插入图片描述

10.针对多对一的映射

1.通过级联属性赋值解决多对一的映射

1.这里的一个部门对应多个用户,一对多,在多(封装用户相关信息)中添加一个(一的属性) 部门的属性,private Dep dept。
在这里插入图片描述
2.在这里插入图片描述
3.
在这里插入图片描述
4.在这里插入图片描述
5.结果展示
在这里插入图片描述

2.通过association解决多对一映射

在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述

4.通过分步查询来解决多对一的映射关系

分布查询的优点是:可以实现延迟加载,但是,在核心文件中需要设置全局配置信息。
1.分步查询第一步,先根据eid查到相对应的用户信息。
在这里插入图片描述
2.
在这里插入图片描述
3.测试代码
在这里插入图片描述
4.设置全局配置信息
在这里插入图片描述
5.再根据用户所查到的信息中的did,然后再查到相关的部门信息
在这里插入图片描述 6.在这里插入图片描述

11.针对一对多的映射情况

1.针对一对多的映射情况:采用collection集合

一对多:一个部门对应多个员工
需要在一(一个部门当中)添加多(多名员工)的集合
即 :
在这里插入图片描述

1.在这里插入图片描述
2.在这里插入图片描述
3.
在这里插入图片描述
4.结果展示:
在这里插入图片描述

2.一对多映射:分步查询

1.第一步:根据部门id,去查相关的部门
在这里插入图片描述
2.在这里插入图片描述
3.第二步:根据部门id,再查询部门下所有的员工信息
在这里插入图片描述
4.
在这里插入图片描述
5.
在这里插入图片描述
6.结果展示:
在这里插入图片描述

12.动态SQL之 if 标签

当sql查询语句有多个查询条件的时候,这个时候就需要拼接sql语句。
if 标签:根据标签test属性所对应表达式决定标签中内容是否需要拼接sql

1.在这里插入图片描述
2.在这里插入图片描述
3.在这里插入图片描述
4.结果展示:
在这里插入图片描述

13.动态SQL之where标签

1.where标签:当后面条件符合的时候,需要Sql拼接的时候,这个时候,需要自动添加where,如果后面条件不符合的时候,不需要拼接的时候,这个时候,就不会添加where
2.在需要添加where的时候,会将内容前多余的and或者是or会删除,比如,如果第一个empName符合条件的时候,需要进行Sql拼接,这个时候,就会将and emp_name=#{empName}前面的and 删掉。
3.但是,在需要添加where的时候,内容后多余的and或者or是不会自动删除的,如果留下会报错。

在这里插入图片描述
2.在这里插入图片描述
3.在这里插入图片描述
4.结果展示:
在这里插入图片描述

14.动态SQL之trim标签

trim标签有四个属性:
prefix:将trim标签内容前添加指定内容。
suffix:将trim标签内容后添加指定内容。
prefixOverride:将内容前多余的and或者or删除掉。
suffixOverride:将内容后多余的and或者or删除掉。

在这里插入图片描述
2.
在这里插入图片描述
3.在这里插入图片描述
4.结果展示
在这里插入图片描述

15.动态SQL之choose,when,otherwise标签

choose标签下的
when标签:多个when标签构成的关系是:if…else关系
按照前后顺序,只要满足一个条件,就不需要管下面的其他的条件是否满足。
otherwise标签里面可以放:当所有的when标签中的条件都不满足的时候,就执行otherwise标签下的语句。但是,如果其中有一个when标签满足条件的时候,就不执行otherwise标签下的语句。

1.在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述
4.结果展示:
在这里插入图片描述

当所有when标签中条件都不满足的时候,就执行otherwise标签下的语句。
比如:
when标签针对的是empName和sex条件的设置
在这里插入图片描述
而在传参的时候,empName和sex都是空,所以,所有when标签都不满足,执行otherwise当中的语句

在这里插入图片描述
结果展示
在这里插入图片描述

16.批量删除(利用for-each标签)

批量删除,利用for-each来完成批量删除
for-each标签下的属性含义:
collection:需要循环的数组或者集合;
item:数组或者集合中的每一个元素;
separator:分隔符;
open:表示在整个循环外面添加一个什么符号,比如,添加(
close:表示在整个循环语句外面添加一个什么符号,比如,添加)

1.在这里插入图片描述
2.
在这里插入图片描述
3.在这里插入图片描述

17.批量增加(for-each)

将要添加的用户信息写在一个list当中,然后传参的时候,传list。
1.
在这里插入图片描述
2.在这里插入图片描述
3.
在这里插入图片描述
4.结果展示
在这里插入图片描述

18.动态SQL之sql标签

1.在这里插入图片描述
2.在这里插入图片描述
3.在这里插入图片描述
4.结果展示:
在这里插入图片描述

19.Mybatis的一级缓存

Mybatis的一级缓存:SqlSession,一般是默认开启的
通过同一个SqlSession查询的数据会被缓存,当下一次查询相同数据的时候,会直接从缓存中拿,不需要从数据库中取。
一级缓存失效的情况:
1.不同的SqlSession的一级缓存(SqlSession sqlSession=sqlSessionFactory.openSession(true) 这个操作两次)
2.相同的SqlSession,查询两次中间,如果发生了数据增删改的操作。
3.相同的SqlSession,查询两次,查询条件发生了变化。
4.相同的SqlSession,查询两次,手动清空了缓存。

20.Mybatis的二级缓存

Mybatis的二级缓存:SqlSessionFactory,同一个SqlSessionFactory创建出来的SqlSession会缓存数据,当查询条件一样的时候,被查询到的数据会从缓存中获取,不需要从数据库中取。
二级缓存开启的条件是:
1.在核心配置文件中,设置全局配置文件的时候,设置全局配置属性,cacheEnable=“true”;
2.在映射文件中,加上标签;
3.二级缓存必须在sqlSession关闭或提交后有效;
4.查询的数据所转换的实体类类型必须是序列化的接口。
缓存失效:
在查询过程中,进行了增删改的操作,一级缓存和二级缓存会同时失效。

21.Mybatis缓存查询的顺序

一级缓存:SqlSession
二级缓存:SqlSessionFactory
Mybatis缓存查询的顺序
二级缓存—》一级缓存—》数据库
sqlSession关闭之后,一级缓存的数据会写入二级缓存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值