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

相关内容

热门资讯

原创 深... 你要说这两年深圳的“港味儿”有多浓?去趟山姆超市或者COCO Park溜达一圈就知道了。别说普通话,...
原创 下... 黄金市场正处在一个前所未有的紧绷时刻。 2026年2月26日,伦敦现货黄金价格在一天之内上演了深V反...
上海安路信息科技股份有限公司2... 本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误导性陈述或者重大遗漏,并对其内容的真实性、...
日本试采深海稀土泥,成本是中国... 来源:市场资讯 (来源:时报新征途) 央视网近日报道,日本是全球第二大稀土消费国,仅次于中国。但日...
原创 雷... 本来以为2月28日晚上,小米在巴塞罗那的发布会就是走个过场,把小米17系列在海外发一发,结果雷总根本...
人民币汇率破6.87,按现价算... 这段时间人民币兑美元汇率一直在不断上升。 截至目前,人民币在岸和离岸对美元汇率纷纷都破了6.87,其...
原创 扛... 特朗普向中国服软,中方禁令引起连锁反应。 2月26日,中国就将继续推进对中国履行中美第一阶段经贸协议...
原创 发... 先看一个老生常谈的现象:春节酒店价格又涨了。 今年春节出游的情绪明显回升,外出“旅游式过年”与返乡“...
经纪业务管理薄弱、营销宣传不规... (图片来源:视觉中国) 蓝鲸新闻2月28日讯(记者 王婉莹)中山证券合规问题再添“新伤”。日前,深圳...
以色列突袭伊朗!炸弹落在德黑兰... 来源:市场资讯 (来源:预见能源) 德黑兰市中心的爆炸声,让全球石油市场的神经瞬间绷到最紧。 2月...
金饰克价,冲上1600元!最新... 据央视新闻消息,当地时间28日,伊朗首都德黑兰发生爆炸。以色列国防部长表示,以色列对伊朗发动了先发制...
做到全球第一却累亏28亿,大疆... 出品 | 创业最前线 作者 | 星空 编辑 | 蛋总 美编 | 倩倩 审核 | 颂文 在全球人口老龄...
卷入“关联交易”风波,陆金所换... 作者 |付影 来源 | 独角金融 正处于“多事之春”的陆金所控股(6623.HK;LU.US),再现...
珠海华润银行更名为广东华润银行... 珠海华润银行完成更名。 2月28日,珠海华润银行(下称华润银行)发布公告称,根据该行董事会、股东大会...
五粮液一把手被查,离退休仅两年 来源:21世纪经济报道 记者丨肖夏 编辑丨高梦阳 朱益民 刘雪莹 央视新闻2月28日晚间披露,四川省...
佛山综保区有了“国际驿站” 2月28日,佛山综合保税区管理局与佛山市贸促会(佛山国际商会)展开交流并进行签约,由佛山市贸促会(佛...
微软与OpenAI重申合作:相... 来源:环球网 【环球网科技综合报道】2月28日消息,据多家外媒报道,融资消息曝出后,微软与Open...
供给趋紧需求爆发 小金属上演“... 本报记者 李立平 近日,素有“工业维生素”之称的小金属板块,成为资金追捧的焦点。2月27日,小金属板...
险资开年调研1319次,覆盖4... 图源:图虫创意 2026年以来,保险资金调研热情持续高涨,成为A股市场的重要风向标。 时代周报记者据...
原创 丑... 特朗普访华前夕,中国警告美国不要挑事。美国当地时间2月24日,美国贸易代表格里尔在接受媒体采访时,公...