• mybatis中的XML文件配置->mybatis-config.xml+XxxxMapper.xml-SQL


    目录

    一.mybatis-config.xml-配置文件详解

    1.说明

    2.properties 属性

    3.settings 全局参数定义--》通常使用默认

     4.typeAliases 别名处理器

    5.typeHandlers 类型处理器

     6.environments 环境

    二.XxxxMapper.xml-SQL 映射文件

    1.XxxMapper.xml-基本介绍

    2.XxxMapper.xml-详细说明

    2.1基本使用

    3.parameterType(输入参数类型) 

    4.传入 HashMap

    5.resultMap(结果集映射)

    注意事项和细节


    一.mybatis-config.xml-配置文件详解

    1.说明

    1.1 mybatis 的核心配置文件 (mybatis-config.xml) ,比如配置 jdbc 连接信息,注册 mapper
    等等 , 我们需要对这个配置文件有详细的了解

    2.properties 属性

    通过该属性,可以指定一个外部的 jdbc.properties 文件,引入我们的 jdbc 连接信息

    代码演示

    1. jdbc.driver=com.mysql.jdbc.Driver
    2. jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    3. jdbc.user=root
    4. jdbc.pwd=hong
    jdbc.driver就是key值,名字随便起

    当然使用一个配置文件在另外一个文件中自然需要引入(在前面引入)

    1. <properties resource="jdbc.properties"/>
    1. <property name="driver" value="${jdbc.driver}"/>
    2. <property name="url" value="${jdbc.url}"/>
    3. <property name="username" value="${jdbc.user}"/>
    4. <property name="password" value="${jdbc.pwd}"/>

    3.settings 全局参数定义--》通常使用默认

    这是mybatis中极为重要的调整设置,他们会改变mybatis的运行时行为

     4.typeAliases 别名处理器

    1. 别名是为 Java 类型命名一个短名字。它只和 XML 配置有关,用来减少类名重复的部分
    2. 如果指定了别名 , 我们的 MappperXxxx.xml 文件就可以做相应的简化处理
    3. 注意指定别名后,还是可以使用全名的
    1. <typeAliases>
    2. <package name="com.hong.entity"/>
    3. typeAliases>

    就可以直接使用类名操作了

    5.typeHandlers 类型处理器

    1. 用于 java 类型和 jdbc 类型映射
    2. Mybatis 的映射基本已经满足,不太需要重新定义
    3. 这个我们使用默认即可,也就是 mybatis 会自动的将 java jdbc 类型进行转换 .
    4. java 类 型 和 jdbc 类 型 映 射 关 系 一 览 [ 手 册 ]
    https://mybatis.org/mybatis-3/zh/configuration.html#typeHandlers

     6.environments 环境

    1. resource 注册 Mapper 文件: XXXMapper.xml 文件(常用,使用过)

    2. class:接口注解实现(使用过) 

    1. <mapper class="com.hong.mapper.MonsterAnnotation"/>

    3. url:外部路径,使用很少,不推荐,

    4. package 方式注册 : 

             解读
                1. 当一个包下有很多的Mapper.xml文件和基于注解实现的接口时,为了方便,我们可以以包方式进行注册
               2. 将下面的所有xml文件和注解接口 都进行注册

    二.XxxxMapper.xml-SQL 映射文件

    1.XxxMapper.xml-基本介绍

    1 MyBatis 的真正强大在于它的语句映射 ( XxxMapper.xml 配置 ), 由于它的异常强大 ,
    果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。
    MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。
    2 SQL 映射文件常用的几个顶级元素(按照应被定义的顺序列出):
    cache – 该命名空间的缓存配置。
    cache-ref – 引用其它命名空间的缓存配置。
    resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
    parameterType - 将会传入这条语句的参数的类全限定名或别名
    sql – 可被其它语句引用的可重用语句块。
    insert – 映射插入语句。
    update – 映射更新语句。
    delete – 映射删除语句。
    select – 映射查询语句。

    2.XxxMapper.xml-详细说明

    2.1基本使用

    1. insert delete update select 这个我们在前面讲解过,分别对应增删改查的方法和 SQL
    语句的映射 .
    2. 如何获取到刚刚添加的 Monster 对象的 id 主键 [ 前面使用过了 ]

    3.parameterType(输入参数类型) 

    ● parameterType( 输入参数类型 )
    1. 传入简单类型,比如按照 id Monster( 前讲过 )
    2. 传入 POJO 类型,查询时需要有多个筛选条件
    3. 当有多个条件时,传入的参数就是 Pojo 类型的 Java 对象 , 比如这里的 Monster 对象
    4. 当传入的参数类是 String 时,也可以使用 ${} 来接收参数

    ● parameterType- 应用案例
    案例 1: 请查询 id = 1 或者 name = ' 白骨精 ' 的妖怪
    案例 2: 请查询 name 中 包含 " 牛魔王 " 的妖怪

    代码:案例1

    1. //通过id 或者名字查询
    2. public List findMonsterByNameORId(Monster monster);
    1. <mapper namespace="com.hong.mapper.MonsterMapper">
    2. <select id="findMonsterByNameORId" parameterType="Monster" resultType="Monster">
    3. SELECT * FROM `monster` WHERE `id` = #{id} OR `name` = #{name}
    4. select>
    5. mapper>
    1. public void findMonsterByNameORId() {
    2. Monster monster = new Monster();
    3. monster.setId(1);
    4. monster.setName("狐狸精-100");
    5. List monsters =
    6. monsterMapper.findMonsterByNameORId(monster);
    7. for (Monster m : monsters) {
    8. System.out.println("m-" + m);
    9. }
    10. if (sqlSession != null) {
    11. sqlSession.close();
    12. }
    13. System.out.println("操作成功~");
    14. }

    案例二:

    1. <select id="findMonsterByName" parameterType="String" resultType="Monster">
    2. SELECT * FROM `monster` WHERE `name` LIKE '%${name}%'
    3. select>
    1. public void findMonsterByName() {
    2. List monsters = monsterMapper.findMonsterByName("牛魔王");
    3. for (Monster monster : monsters) {
    4. System.out.println("monster--" + monster);
    5. }
    6. if (sqlSession != null) {
    7. sqlSession.close();
    8. }
    9. System.out.println("操作成功~");
    10. }

    4.传入 HashMap

    传入 HashMap( 重点 )
    1. HashMap 传入参数更加灵活,比如可以灵活的增加查询的属性,而不受限于 Monster
    Pojo 属性本身
    2. 演示如何遍历一个 List> 的数据类型
    传入 HashMap- 应用实例 1
    要求:声明一个方法,按传入参数是 HashMap 的方式,查询 id > 10 并且 salary 大于 40
    的所有妖怪
    1. 修改 MonsterMapper.java, 增加方法接口
    1. //查询 id > 10 并且 salary 大于 40, 要求传入的参数是 HashMap
    2. public List
    3. findMonsterByIdAndSalary_PrameterHashMap(Map map);
    2. 修改 MonsterMapper.xml
    1. <select id="findMonsterByIdAndSalary_PrameterHashMap" parameterType="map" resultType="Monster">
    2. SELECT * FROM monster
    3. WHERE id > #{id} AND salary > #{salary}
    4. select>
    1. public void findMonsterByIdAndSalary_PrameterHashMap() {
    2. //Diamond types are not supported at language level '5'
    3. //如何解决.=> 在pom.xml文件中指定编译器版本
    4. /*
    5. UTF-8
    6. 1.8
    7. 1.8
    8. 1.8
    9. */
    10. Map map = new HashMap<>();
    11. map.put("id", 10);
    12. map.put("salary", 40);
    13. List monsters =
    14. monsterMapper.findMonsterByIdAndSalary_PrameterHashMap(map);
    15. for (Monster monster : monsters) {
    16. System.out.println("monster--" + monster);
    17. }
    18. if (sqlSession != null) {
    19. sqlSession.close();
    20. }
    21. System.out.println("操作成功~");
    22. }
    传入和返回 HashMap- 应用实例
    要求:将上面的方法的改成返回参数也以 HashMap 的类型
    1. 修改 MonsterMapper.java
    1. //查询 id > 10 并且 salary 大于 40, 要求传入的参数是 HashMap
    2. public List>
    3. findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap(Map map);
    2. 修改 MonsterMapper.xml
    1. <select id="findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap" parameterType="map" resultType="map">
    2. SELECT * FROM `monster` WHERE `id` > #{id} AND `salary` > #{salary}
    3. select>
    3. 修改 MonsterMapperTest.java
    1. public void findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap() {
    2. Map map = new HashMap<>();
    3. map.put("id", 10);
    4. map.put("salary", 40);
    5. List> monsterList =
    6. monsterMapper.findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap(map);
    7. //取出返回的结果-以map取出
    8. //回顾java基础,map遍历
    9. for (Map monsterMap : monsterList) {
    10. //System.out.println("monsterMap-" + monsterMap);
    11. //遍历monsterMap(方式1) ,取出属性和对应值
    12. //Set keys = monsterMap.keySet();
    13. //for (String key : keys) {
    14. // System.out.println(key + "=>" + monsterMap.get(key));
    15. //}
    16. //遍历monsterMap(方式2) ,取出属性和对应值
    17. for (Map.Entry entry : monsterMap.entrySet()) {
    18. System.out.println(entry.getKey() + "==>" + entry.getValue());
    19. }
    20. System.out.println("------------------------");
    21. }
    22. if (sqlSession != null) {
    23. sqlSession.close();
    24. }
    25. System.out.println("操作成功~");
    26. }

    5.resultMap(结果集映射)

    基本介绍
    当实体类的属性和表的字段名字不一致时,我们可以通过 resultMap 进行映射,从而屏蔽
    实体类属性名和表的字段名的不同 .

    简单理解:就是当数据库中的字段名和我们pojo的属性名不一样的时候(因为我们在填写对应的xml文件的时候#{}要和属性名一样),使用resultMap 做一个专门的映射指定就可以找到了。我理解为就是将数据库的字段改变成属性的名字。

    举例:

    User表字段:

    1. `user_id` INT NOT NULL AUTO_INCREMENT,
    2. `user_email` VARCHAR(255) DEFAULT '',
    3. `user_name` VARCHAR(255) DEFAULT '',

    pojo类属性:

    1. private Integer user_id;
    2. private String username;
    3. private String useremail;

    xml中的配置(主要就在这里) 

    1. <mapper namespace="com.hong.mapper.UserMapper">
    2. <insert id="addUser" parameterType="User">
    3. INSERT INTO `user` (`user_email`,`user_name`)
    4. VALUE (#{useremail}, #{username})
    5. insert>
    6. <resultMap id="findAllUserMap" type="User">
    7. <result column="user_email" property="useremail"/>
    8. <result column="user_name" property="username"/>
    9. resultMap>
    10. <select id="findAllUser" resultMap="findAllUserMap">
    11. SELECT * FROM `user`
    12. select>
    13. mapper>

    测试

    1. public class UserMapperTest {
    2. //属性
    3. private SqlSession sqlSession;
    4. private UserMapper userMapper;
    5. //初始化
    6. @Before
    7. public void init() {
    8. sqlSession = MyBatisUtils.getSqlSession();
    9. userMapper = sqlSession.getMapper(UserMapper.class);
    10. }
    11. @Test
    12. public void addUser() {
    13. User user = new User();
    14. user.setUsername("jack");
    15. user.setUseremail("jack@qq.com");
    16. userMapper.addUser(user);
    17. //如果是增删改, 需要commit()
    18. if(sqlSession != null) {
    19. sqlSession.commit();
    20. sqlSession.close();
    21. }
    22. System.out.println("操作OK~");
    23. }
    24. @Test
    25. public void findAllUser() {
    26. List users = userMapper.findAllUser();
    27. for (User user : users) {
    28. System.out.println("user--" + user);
    29. }
    30. if(sqlSession != null) {
    31. sqlSession.close();
    32. }
    33. System.out.println("操作OK~");
    34. }

    注意事项和细节

    1 、解决表字段和对象属性名不一致 , 也支持使用字段别名--》复用性不高
    2 、说明:如果是 MyBatis-Plus 处理就比较简单 , 可以使用 注解 @TableField 来解决
    实体字段名和表字段名不一致的问题,还可以使用 @TableName 来解决 实体类名和表名
    不一致的问题​​​​​​​
  • 相关阅读:
    某股份制银行容器云平台建设实践经验
    一分钟告诉你识别植物的软件哪个好?
    QDateEdit开发详解
    随时随地查看远程试验数据与记录——IPEhub2与IPEmotion APP
    php生成器
    Acwing第57场周赛
    湖北省级服务型制造示范企业、平台、项目遴选类别及申报条件
    基于ConstraintLayout的增强布局,专注于过渡动画实现的动画框架:MotionLayout
    vscode提效神器,中文一键转英文并生成多种命名格式供选择
    总结:2022-9-11 动态规划最优子结构特征 多进程图像总结
  • 原文地址:https://blog.csdn.net/weixin_54107527/article/details/127795543