Mybatis知识点记录
admin
2024-03-13 14:43:30
0

Mybatis知识点记录

    • Mybatis
      • 1. 简介
        • 1.1 历史
        • 1.2 特性
      • 2. 官方下载
      • 3. 与其他持久层框架对比
      • 4. 快速开始
        • 4.1 开发环境
        • 4.2 Maven
        • 4.3 核心配置文件
        • 4.4 Mapper接口
        • 4.5 映射文件
        • 4.6 测试功能
        • 4.7 log4j
      • 5. 核心配置文件
      • 6. IDEA核心配置文件模板
      • 7. 获取参数
      • 8. 查询功能详解
      • 9. 特殊SQL
      • 10. ResultMap
        • 10.1 字段名和属性名不一致的情况
          • 10.1.1 **方式一:** 使用别名
          • 10.1.2 **方式二:** 在核心配置文件中添加settings配置将下滑线映射为驼峰
          • 10.1.3 **方式三:** 自定义映射
        • 10.2 多对一关系
          • 10.2.1 级联方式
          • 10.2.2 association标签
          • 10.2.3 分步骤查询方式
        • 10.3 一对多关系
          • 10.3.1 collection
          • 10.3.2 分步骤查询
      • 11. 动态SQL
      • 12. SQL片段
      • 13. 缓存
      • 14. 逆向
      • 15. 分页插件


Mybatis

1. 简介

1.1 历史

1.2 特性

  • 定制化SQL:即可以自己手写SQL语句。
  • 支持存储过程
  • 支持高级映射:即POJO和数据库字段的映射方式可以自定义。
  • 封装了JDBC代码,和结果集的处理过程:不用手写JDBC代码和结果集处理的过程。

2. 官方下载


3. 与其他持久层框架对比


4. 快速开始

4.1 开发环境

  • IDE:IDEA: 2022.2.4。
  • 构建工具:maven 3.8.5
  • MySQL版本:MySQL8
  • MyBatis 版本:MyBatis 3.5.7

4.2 Maven

pom.xml

    org.mybatismybatis3.5.7junitjunit4.12testmysqlmysql-connector-java8.0.16

4.3 核心配置文件

建议命名:mybatis-config.xml
放置路径:src/main/resources

核心配置文件作用

  • 配置链接数据库的环境
  • 配置MyBatis

mybatis-config.xml




4.4 Mapper接口

相当于DAO,但是不用创建实现类,MyBatis会创建代理类,并执行映射文件当中的SQL。

起名规则:POJO的名+Mapper
放置路径:src/main/java/com/atguigu/mybatis/mapper/UserMapper.java

package com.atguigu.mybatis.mapper;public interface UserMapper {/*** 添加用户信息*/int insertUser();
}

4.5 映射文件

Mapper 接口当中的一个抽象方法 对应 映射文件当中的一个SQL语句。

起名规则:POJO的名+Mapper.xml
放置路径:src/main/resources/com/atguigu/mybatis/mapper/UserMapper.xml

这里我们写一条固定的插入SQL,参数如何传递请请看后方比较详细的笔记。

UserMapper.xml





4.6 测试功能

下方代码:从开始到创建 SqlSessionFactory 只用创建一次即可,因此可以单独封装即可。
openSession() 获得 SqlSession 默认是不自动提交事务,因此需要自己手动提交。

放置路径:src/test/java/com/atguigu/mybatis/test/MybatisTest.java

MybatisTest.java

package com.atguigu.mybatis;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 com.atguigu.mybatis.mapper.UserMapper;import java.io.IOException;
import java.io.InputStream;public class MyBatisTest {@Testpublic void testInsert() throws IOException {// 获取核心配置文件的输入流InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");// 获取SqlSessionFactoryBuilder 对象 -> 工厂构建器SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();// 创建 SqlSession 工厂 -> 创建会话SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);// 获取 会话 对象 -> MyBatis 提供的操作数据库的对象SqlSession sqlSession = sqlSessionFactory.openSession();// 获得Mapper接口的代理类 -> 操纵Mapper类执行数据库操作UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 执行SQL操作Integer rows = userMapper.insertUser();System.out.println("rows = " + rows);// 提交事务 -> 事务是默认开启的sqlSession.commit();// 关闭资源sqlSession.close();}
}

4.7 log4j

日志级别:FATAL(致命)> ERROR(错误)>WARN(警告)INFO(信息)> DEBUG(调试)
从左到右打印的内容越来越详细.

pom.xml


log4jlog4j1.2.17

放置路径:src/main/resources/log4j.xml

网址爆红不用管他
log4j.xml





5. 核心配置文件


6. IDEA核心配置文件模板





7. 获取参数

  • 1.单个字面量类型(基本数据类型)
  • 2.多个字面量类型(基本数据类型)
  • 3.Map
  • 4.单个POJO(最常用)
  • 5.@Param (最常用)
  • 6.List<泛型>

src/main/java/com/atguigu/mybatis/mapper/UserMapper.java

package com.atguigu.mybatis.mapper;import com.atguigu.mybatis.pojo.User;
import org.apache.ibatis.annotations.Param;import java.util.Map;/*** Mybatis获取参数值的两种方式:#{}和${}* #{}的本质是占位符赋值;(较为多的使用)* ${}的本质是字符串拼接;* 1、若mapper接口方法的参数为单个的字面量类型,此时可以通过#{}或${}以任意内容获取参数值,但是一定要注意${}的单引号问题。* 2、若mapper接口方法的参数是多个的字面临类型,此时Mybatis会将参数放入map集合中,以两种方式存储数据:*  (1)以arg0、arg1....为键,以参数为值;*  (2)以param1、param2....为键,以参数为值;*  因此,我们只需要通过#{}和${}访问map集合的键,就可以拿到参数值。* 3、若mapper接口方法的参数为一个map集合类型的参数,此时我们只需要通过#{}和${}访问map集合的键,就可以拿到相对应参数值。* 4、若mapper接口方法的参数为实体类类型的参数,此时我们只需要通过#{}和${}访问实体类中属性名,就可以拿到相对应的参数值。* 5、可以在mapper接口方法的参数上设置@Param注解,此时mybatis会将这些参数放在map中,以两种方式来进行存储:*  (1)以@Param注解的value属性值为键,以参数为值;*  (2)以param1、param2....为键,以参数为值;*/
public interface UserMapper {/*** 根据用户名查询用户信息* @param username* @return*/User getUserByUsername(String username);/*** 验证登录* @param username* @param password* @return*/User checkLogin(String username,String password);/*** {username: "xxxx"}* {password: "xxxx"}* @param map* @return*/User cheLoginByMap(Map map);/*** 添加用户信息的功能* @param user*/void insertUser(User user);/*** 验证登录功能(使用@Param注解方式)* @param username* @param password* @return*/User checkLoginByParam(@Param("username") String username, @Param("password") String password);
}

src/main/resources/com/atguigu/mybatis/mapper/UserMapper.xml



insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})


8. 查询功能详解

查询功能:

    1. 返回结果是一个实体类
    1. 返回结果是一个List集合
    1. 返回结果是一个单行单列的数据
    1. 返回结果是一个Map集合
    1. 返回结果是一个map的list集合

src/main/java/com/atguigu/mybatis/mapper/SelectMapper.java

package com.atguigu.mybatis.mapper;import com.atguigu.mybatis.pojo.User;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;import java.util.List;
import java.util.Map;public interface SelectMapper {/*** 1、若SQL语句查询的结果为多条时,一定不能以实体类类型为返回值,否则会抛出异常(TooManyResultException);* 2、若SQL语句查询的结果为一条时,此时可以使用实体类类型或List集合类型来作为方法的返回值;*//*** 根据id来查询用户信息* @param id* @return*/User getUserById(@Param("id") Integer id);/*** 获取所有的用户信息* @return*/List getAllUser();/*** 查询用户的总数量* @return*/Integer getCount();/*** 根据用户id查询用户信息为一个map集合* @param id* @return*/Map getUserByIdToMap(@Param("id") Integer id);/*** 获取所有用户信息到一个map集合* 若查询的数据有多条时,并且要将每条数据转换为map集合,此时有两种解决方案:*  1、将mapper接口方法的返回值设置为泛型是map的List集合;*  2、将每条数据转换的map集合放到一个大的map集合中,但是必须通过@MapKey注解,将查询的某个字段的值作为这个大的map的键*  (id作为键,小map作为值)*  {*      2={password=123456, gender=男, id=2, age=23, email=12345@qq.com, username=admin},*      3={password=123, gender=男, id=3, age=23, email=12345@qq.com, username=root},*      5={password=123456, gender=男, id=5, age=23, email=12345@qq.com, username=admin}*  }* @return*///List> getAllUserToMap();@MapKey("id")Map getAllUserToMap();
}

src/main/resources/com/atguigu/mybatis/mapper/SelectMapper.xml






9. 特殊SQL

特殊的SQL语句:

    1. 模糊查询
    1. 批量删除
    1. 动态设置表名
    1. 添加信息并获取自增的主键

src/main/java/com/atguigu/mybatis/mapper/SpecialSQLMapper.java

package com.atguigu.mybatis.mapper;import com.atguigu.mybatis.pojo.User;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface SpecialSQLMapper {/*** 通过用户名模糊查询用户信息* @param mohu* @return*/List getUserByLike(@Param("mohu") String mohu);/*** 批量删除* @param ids*/void deleteMoreUser(@Param("ids") String ids);/*** 动态设置表名* @param tableName* @return*/List getUserList(@Param("tableName") String tableName);/*** 添加用户信息并获取自增的主键* @param user* @return*/Integer insertUser(User user);
}

src/main/resources/com/atguigu/mybatis/mapper/SpecialSQLMapper.xml



delete from t_user where id in (${ids})insert into t_user values (null,#{username},#{password},#{age},#{gender},#{email})


10. ResultMap

10.1 字段名和属性名不一致的情况

属性名和数据库字段名不一致的查询的三种方式:

  • 为查询的字段设置别名,和属性名保持一致;
  • 当字段符合MySQL的要求使用_,而属性符合java的要求使用驼峰。此时可以在mybatis的核心配置文件中设置一个全局配置,可以自动的将下划线映射为驼峰;
  • 使用resultMap自定义映射处理;
10.1.1 方式一: 使用别名

通过SQL语句起别名的方式解决数据库的字段和实体类的属性名称不一致的问题。

src/main/resources/com/atguigu/mybatis/mapper/EmpMapper.xml

    
10.1.2 方式二: 在核心配置文件中添加settings配置将下滑线映射为驼峰

在核心配置文件配置typeAliases标签以后,就可以直接在映射文件中自动映射。

src/main/resources/mybatis-config.xml

    

src/main/resources/com/atguigu/mybatis/mapper/EmpMapper.xml

    
10.1.3 方式三: 自定义映射

使用 ResltMap , 注意 resultMap 和 resultType 是二选一的。

    

10.2 多对一关系

POJO:多个emp对应一个Dept,多个成员对应一个部门。

public class Emp {private Integer empId;private String empName;private Integer age;private String gender;//多对一关系,对应的是一个对象private Dept dept;
}

处理多对一的映射关系:

  • 级联方式
  • association标签:专门用来处理多对一的映射关系(处理实体类类型的属性)
  • 分步骤查询方式
10.2.1 级联方式

src/main/resources/com/atguigu/mybatis/mapper/EmpMapper.xml

    
10.2.2 association标签

src/main/resources/com/atguigu/mybatis/mapper/EmpMapper.xml


10.2.3 分步骤查询方式

分布查询需要两个接口方法,然后再各自的映射文件中填写SQL语句,两条语句使用association标签中的select和column连接在一起。

src/main/java/com/atguigu/mybatis/mapper/EmpMapper.java

    /*** 通过分步骤查询获取员工及员工部门信息的第一步* @param empId* @return*/Emp getEmpAndDeptByStep(@Param("empId") Integer empId);

src/main/java/com/atguigu/mybatis/mapper/DeptMapper.java

    /*** 通过分步骤查询获取员工及员工部门信息的第二步* @return*/Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);

src/main/resources/com/atguigu/mybatis/mapper/EmpMapper.xml

    

src/main/resources/com/atguigu/mybatis/mapper/DeptMapper.xml

    

10.3 一对多关系

POJO:一个 Dept 对应多个 Emp。一个部门对应多个成员。

public class Dept {private Integer deptId;private String deptName;//一对多,对应的是一个集合private List emps;
}

处理一对多的映射关系:

  • collection
  • 分步骤查询
10.3.1 collection

src/main/java/com/atguigu/mybatis/mapper/DeptMapper.java

    /*** 查询部门以及部门中的员工信息* @param deptId* @return*/Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);

src/main/resources/com/atguigu/mybatis/mapper/DeptMapper.xml


10.3.2 分步骤查询

src/main/java/com/atguigu/mybatis/mapper/DeptMapper.java

    /*** 分步骤查询-查询部门以及部门中的员工信息-第一步* @param deptId* @return*/Dept getDeptAndEmpByStepOne(@Param("deptId") Integer deptId);

src/main/java/com/atguigu/mybatis/mapper/EmpMapper.java

    /*** 分步骤查询-查询部门以及部门中的员工信息-第二步* @param deptId* @return*/List getDeptAndEmpByStepTwo(@Param("deptId") Integer deptId);

src/main/resources/com/atguigu/mybatis/mapper/DeptMapper.xml

    

src/main/resources/com/atguigu/mybatis/mapper/EmpMapper.xml

    

11. 动态SQL

12. SQL片段

13. 缓存

14. 逆向

15. 分页插件

相关内容

热门资讯

银行间主要利率债午间走势分化 每经AI快讯,7月28日,银行间主要利率债午间走势分化,30年期国债“26超长特别国债04”收益率下...
2026海河国际消费论坛即将在... 2026海河国际消费论坛将于7月30日下午在天津启幕,目前各项筹备工作已全部就绪。本届论坛以“创新服...
原创 一... 前言 1942年的一天,一名身穿军装的年轻人,悄悄走到一位老妇人的面前。他脸上带着疲惫,眼神中却依然...
原创 曹... 八十岁的曹德旺,这几年在公开场合谈到房子这两个字,语气一次比一次冷。他早年那句"房子不过是钢筋水泥堆...
股息率近5.5%!港股红利低波... 7月28日,港股红利资产延续强势。截至13时48分,港股红利低波ETF招商(520550)涨0.46...
企业文件共享平台怎么选?主流方... 文件共享平台种类繁多,各有侧重。今天这篇文章,把2026年市面上主流的企业文件共享平台做个系统梳理,...
币圈院士:7.26以太坊(ET... 币圈院士:7.26以太坊(ETH)双周期指标暗藏方向,行情即将破位?最新行情分析参考 以太坊现价18...
老铺黄金发盈喜后股价跌16.2... 观点网讯:7月28日,老铺黄金股价裂口低开12.97%,最低见325.8港元,收盘报332港元,跌1...
苏泊尔上半年营收净利双降,法籍... 瑞财经 严明会 近日,苏泊尔(002032.SZ)披露2026年半年度业绩快报。 公告显示,公司上半...
IPO雷达|陕西瑞科回复二轮问... 深圳商报·读创客户端记者 梁佳彤 7月27日,据北交所官网,陕西瑞科新材料股份有限公司(下称“陕西瑞...
普京签令,俄军扩编 据新华社报道,俄罗斯总统普京27日签署命令, 决定组建几支军事建筑工程部队,并将俄武装力量编制总人数...
2027年德国杜塞尔多夫国际铸... 展会名称:2027年德国杜塞尔多夫国际铸造、冶金、热处理及铸件展览会GMTN 开始时间:2027-0...
郑州有了温通刮痧培训示范基地 本报讯(记者 杨振东 通讯员 张丹婧)温通刮痧是中医外治法里的一种,简单说就是在传统刮痧基础上,结合...
整箱茅台和单瓶茅台,回收行情为... 不少天津藏友存在疑惑:同样年份、同样品相的飞天茅台,整箱装和拆箱单瓶的回收报价存在差距,不清楚背后的...
北京五粮液收购需要遵循哪些通用... 北京五粮液收购的行业背景 近年来高端白酒的收藏与流通市场规模稳步扩张,北京作为国内重要的消费城市,五...
微软CEO重磅警告:只依赖一家... 来源:环球网 【环球网科技综合报道】7月28日消息,据外媒TechCrunch报道,微软CEO萨提亚...
策略师:金价夏季维持4000美... 汇通财经APP讯——今夏金价大概率在4000美元/盎司附近震荡筑底,市场等待美联储货币政策清晰指引。...
大众叙事下白酒行业周期如何拆解... 白酒行业的波动往往并非单纯由供需关系决定,而是 宏观经济预期与 渠道库存周期共振的结果。在大众认知中...
沈皓南:黄金低位大区间运行,短... 大家好,我是沈皓南,差不多有一个月没有更新黄金文章了,这段时间我去了美丽的新疆,自驾了独库公路,观赏...
原创 上... 2000年9月28日傍晚,济青高速临淄出口边一家小饭馆的木门被推开,六个山东汉子鱼贯而入。几个小时前...