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. 分页插件

相关内容

热门资讯

中国银行招标结果:中国银行北京... 证券之星消息,根据天眼查APP-财产线索数据整理,中国银行股份有限公司5月24日发布《中国银行北京庄...
原创 A... "上下同欲者胜。"——《孙子兵法》 “厂家那边又逼我压两百万的货,可库存早都冒了。” 凌晨两点...
原创 “... 全款买房”和贷款30年,差别到底有多大?曹德旺一句话点醒了很多人 前阵子,一个朋友把看了半年的房子终...
云英谷科技登陆港交所:AI终端... 5月27日,云英谷科技股份有限公司(股票简称:云英谷科技,股票代码:3310.HK)成功登陆港交所主...
京东集团与三一集团签订战略合作... 5月25日,京东集团与三一集团在北京签署战略合作协议。京东集团SEC副主席、京东集团CEO许冉与三一...
青岛的朋友看过来:黄金回收我跑... 前阵子想把家里一些旧金饰处理掉,在青岛问了几家回收黄金的地方。今天就跟大家随便聊聊我打听、上门、对比...
武汉有闲置贵重金属变现需求该怎... 不少有黄金回收需求的用户不知道该如何挑选合适的服务机构,其实只要从资质、专业度、服务能力、口碑几个维...
业绩再度下滑,石药集团一季度归... 图片来源:视觉中国 蓝鲸新闻5月27日讯(记者 屠俊)5月27日午间,石药集团(01093.HK)公...
蚂蚁CEO韩歆毅:在Agent... 【CNMO科技消息】近日,蚂蚁集团CEO韩歆毅在演讲中,系统分享了关于智能体经济和AI支付的底层思考...
Buff叠满!芯片,双重利好!... 芯片领域,传来两则大消息! 一是5月27日有媒体报道称,台积电3纳米制程下半年将涨价15%,明年或再...
“全球正面临第五次油价冲击” 日本央行行长植田和男27日在东京说,自上世纪70年代以来,全球多次经历能源价格急剧上涨,当前全球正面...
白酒股,直线拉升!600779... 【导读】白酒股终于涨了 中国基金报记者 泰勒 大家好,花有重开日,人无再少年。就在刚刚,低迷许久的“...
河北地区闲置名酒如何合规变现 闲置名酒处置的行业现状 近年来随着居民酒类收藏意识的逐步提升,不少家庭都存有不同品类的年份名酒,当...
重磅!长鑫科技科创板IPO获通... 5月27日消息,长鑫科技科创板IPO获上交所上市委会议通过。
东方基金开展“一司一省一高校”... 为深入贯彻落实新“国九条”以及《推动公募基金高质量发展行动方案》的核心要求,积极响应证监会对于金融机...
那句「都是卖猪食的」,为什么你... 你大概也笑了一下。 最近有句话在网上传疯了,说字节的副总裁回怼腾讯的“短视频像猪食”,撂了一句“都是...
2026 年小红书多账号管理工... 摘要 2026 年小红书矩阵运营成品牌获客主流,但账号风控严、消息分散、转化低效等痛点突出。本文基...
打着高知女性旗号割韭菜,“五个... 出品丨搜狐财经 作者丨柴鑫洋 编辑丨李文贤 你被“五个女博士”种草过吗? 打着高知女性旗号,却做着低...
A股董责险渗透率破32%,海南... 开栏语: 保险是经济的“减震器”,但保险条款复杂晦涩,犹如海下暗礁。 即日起,海财经·证券导报开设“...
奥尼电子:49万股限制性股票将... 5月27日,奥尼电子(301189)发布公告,2025年限制性股票激励计划第一个归属期归属结果已确定...